


Explication détaillée du cas de calcul de l'utilisation spécifique du processeur sous Linux
Calculez l'utilisation spécifique du processeur sous Linux. Référence d'extension de solution requise
.Demande
Sous Linux, vous pouvez utiliser la commande top pour vérifier le CPU occupé par un certain processus, ou vous pouvez vérifier l'utilisation d'un certain CPU (utilisez d'abord la commande top, puis appuyez sur la touche numérique "1" pour afficher l'utilisation de chaque CPU), comme suit Photo :
Et notre besoin est : Comment obtenir un taux d'occupation CPU ?
Solution
1. Connaissances de base
Vous pouvez vérifier l'utilisation de chaque processeur dans /proc/stat, comme indiqué ci-dessous :
La signification des dix chiffres après cpu (0/1/2/…) est la suivante :
/proc/stat kernel/system statistics. Varies with architecture. Common entries include: user nice system idle iowait irq softirq steal guest guest_nice cpu 4705 356 584 3699 23 23 0 0 0 0 cpu0 1393280 32966 572056 13343292 6130 0 17875 0 23933 0 The amount of time, measured in units of USER_HZ (1/100ths of a second on most architectures, use sysconf(_SC_CLK_TCK) to obtain the right value), that the system ("cpu" line) or the specific CPU ("cpuN" line) spent in various states: user (1) Time spent in user mode. nice (2) Time spent in user mode with low priority (nice). system (3) Time spent in system mode. idle (4) Time spent in the idle task. This value should be USER_HZ times the second entry in the /proc/uptime pseudo-file. iowait (since Linux 2.5.41) (5) Time waiting for I/O to complete. This value is not reliable, for the following rea‐ sons: 1. The CPU will not wait for I/O to complete; iowait is the time that a task is waiting for I/O to complete. When a CPU goes into idle state for outstanding task I/O, another task will be scheduled on this CPU. 2. On a multi-core CPU, the task waiting for I/O to complete is not running on any CPU, so the iowait of each CPU is difficult to calculate. 3. The value in this field may decrease in cer‐ tain conditions. irq (since Linux 2.6.0-test4) (6) Time servicing interrupts. softirq (since Linux 2.6.0-test4) (7) Time servicing softirqs. steal (since Linux 2.6.11) (8) Stolen time, which is the time spent in other operating systems when running in a virtu‐ alized environment guest (since Linux 2.6.24) (9) Time spent running a virtual CPU for guest operating systems under the control of the Linux kernel. guest_nice (since Linux 2.6.33) (10) Time spent running a niced guest (virtual CPU for guest operating systems under the con‐ trol of the Linux kernel).
2. Calculez l'utilisation spécifique du processeur
Avec les connaissances de base ci-dessus, nous pouvons ensuite calculer l'utilisation spécifique du processeur. La méthode de calcul spécifique est la suivante :
Total CPU time since boot = user+nice+system+idle+iowait+irq+softirq+steal Total CPU Idle time since boot = idle + iowait Total CPU usage time since boot = Total CPU time since boot - Total CPU Idle time since boot Total CPU percentage = Total CPU usage time since boot/Total CPU time since boot * 100%
Avec la formule de calcul ci-dessus, il n'est pas difficile de calculer une certaine utilisation du processeur ou l'utilisation totale du processeur du système.
Exemple : Calculez l'utilisation globale du processeur du système
Tout d'abord, obtenez les valeurs globales de l'utilisateur du système, nice, system, ralenti, iowait, irq, softirq, voler, invité, invité_nice de /proc/stat à t1, et obtenez le temps total du processeur depuis le démarrage à ce moment ( enregistré comme total1) et le temps d'inactivité total du processeur depuis le démarrage (enregistré comme inactif1).
Deuxièmement, obtenez le temps total d'inactivité du processeur depuis le démarrage (enregistré comme total2) et le temps d'inactivité total du processeur depuis le démarrage (enregistré comme inactif2) du système à t2 à partir de /proc/stat. (La méthode est la même que l'étape précédente)
Enfin, calculez l'utilisation totale du processeur du système entre t2 et t1. C'est à dire :
Pourcentage de CPU entre t1 et t2 = ((total2-total1)-(idle2-idle1))/(total2-total1)*100%
Parmi eux, ((total2-total1)-(idle2-idle1)) est en fait le temps pendant lequel le processeur du système est occupé entre t1 et t2 (durée totale - temps d'inactivité).
Ce qui suit est un script qui calcule l'utilisation du processeur sur une période donnée :
#!/bin/bash # by Paul Colby (http://colby.id.au), no rights reserved ;) PREV_TOTAL=0 PREV_IDLE=0 while true; do # Get the total CPU statistics, discarding the 'cpu ' prefix. CPU=(`sed -n 's/^cpu\s//p' /proc/stat`) IDLE=${CPU[3]} # Just the idle CPU time. # Calculate the total CPU time. TOTAL=0 for VALUE in "${CPU[@]}"; do let "TOTAL=$TOTAL+$VALUE" done # Calculate the CPU usage since we last checked. let "DIFF_IDLE=$IDLE-$PREV_IDLE" let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL" let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10" echo -en "\rCPU: $DIFF_USAGE% \b\b" # Remember the total and idle CPU times for the next check. PREV_TOTAL="$TOTAL" PREV_IDLE="$IDLE" # Wait before checking again. sleep 1 done
Agrandir
Dans le noyau, les fonctions d'implémentation pour les fichiers dans /proc/stat sont les suivantes :
附注:内核版本3.14.69,文件为 /fs/proc/stat.c #include <linux/cpumask.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/interrupt.h> #include <linux/kernel_stat.h> #include <linux/proc_fs.h> #include <linux/sched.h> #include <linux/seq_file.h> #include <linux/slab.h> #include <linux/time.h> #include <linux/irqnr.h> #include <asm/cputime.h> #include <linux/tick.h> #ifndef arch_irq_stat_cpu #define arch_irq_stat_cpu(cpu) 0 #endif #ifndef arch_irq_stat #define arch_irq_stat() 0 #endif #ifdef arch_idle_time static cputime64_t get_idle_time(int cpu) { cputime64_t idle; idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; if (cpu_online(cpu) && !nr_iowait_cpu(cpu)) idle += arch_idle_time(cpu); return idle; } static cputime64_t get_iowait_time(int cpu) { cputime64_t iowait; iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT]; if (cpu_online(cpu) && nr_iowait_cpu(cpu)) iowait += arch_idle_time(cpu); return iowait; } #else static u64 get_idle_time(int cpu) { u64 idle, idle_time = -1ULL; if (cpu_online(cpu)) idle_time = get_cpu_idle_time_us(cpu, NULL); if (idle_time == -1ULL) /* !NO_HZ or cpu offline so we can rely on cpustat.idle */ idle = kcpustat_cpu(cpu).cpustat[CPUTIME_IDLE]; else idle = usecs_to_cputime64(idle_time); return idle; } static u64 get_iowait_time(int cpu) { u64 iowait, iowait_time = -1ULL; if (cpu_online(cpu)) iowait_time = get_cpu_iowait_time_us(cpu, NULL); if (iowait_time == -1ULL) /* !NO_HZ or cpu offline so we can rely on cpustat.iowait */ iowait = kcpustat_cpu(cpu).cpustat[CPUTIME_IOWAIT]; else iowait = usecs_to_cputime64(iowait_time); return iowait; } #endif static int show_stat(struct seq_file *p, void *v) { int i, j; unsigned long jif; u64 user, nice, system, idle, iowait, irq, softirq, steal; u64 guest, guest_nice; u64 sum = 0; u64 sum_softirq = 0; unsigned int per_softirq_sums[NR_SOFTIRQS] = {0}; struct timespec boottime; user = nice = system = idle = iowait = irq = softirq = steal = 0; guest = guest_nice = 0; getboottime(&boottime); jif = boottime.tv_sec; for_each_possible_cpu(i) { user += kcpustat_cpu(i).cpustat[CPUTIME_USER]; nice += kcpustat_cpu(i).cpustat[CPUTIME_NICE]; system += kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM]; idle += get_idle_time(i); iowait += get_iowait_time(i); irq += kcpustat_cpu(i).cpustat[CPUTIME_IRQ]; softirq += kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ]; steal += kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; guest += kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; guest_nice += kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; sum += kstat_cpu_irqs_sum(i); sum += arch_irq_stat_cpu(i); for (j = 0; j < NR_SOFTIRQS; j++) { unsigned int softirq_stat = kstat_softirqs_cpu(j, i); per_softirq_sums[j] += softirq_stat; sum_softirq += softirq_stat; } } sum += arch_irq_stat(); seq_puts(p, "cpu "); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(user)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(nice)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(system)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(idle)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(iowait)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(irq)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(softirq)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(steal)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest_nice)); seq_putc(p, '\n'); for_each_online_cpu(i) { /* Copy values here to work around gcc-2.95.3, gcc-2.96 */ user = kcpustat_cpu(i).cpustat[CPUTIME_USER]; nice = kcpustat_cpu(i).cpustat[CPUTIME_NICE]; system = kcpustat_cpu(i).cpustat[CPUTIME_SYSTEM]; idle = get_idle_time(i); iowait = get_iowait_time(i); irq = kcpustat_cpu(i).cpustat[CPUTIME_IRQ]; softirq = kcpustat_cpu(i).cpustat[CPUTIME_SOFTIRQ]; steal = kcpustat_cpu(i).cpustat[CPUTIME_STEAL]; guest = kcpustat_cpu(i).cpustat[CPUTIME_GUEST]; guest_nice = kcpustat_cpu(i).cpustat[CPUTIME_GUEST_NICE]; seq_printf(p, "cpu%d", i); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(user)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(nice)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(system)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(idle)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(iowait)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(irq)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(softirq)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(steal)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest)); seq_put_decimal_ull(p, ' ', cputime64_to_clock_t(guest_nice)); seq_putc(p, '\n'); } seq_printf(p, "intr %llu", (unsigned long long)sum); /* sum again ? it could be updated? */ for_each_irq_nr(j) seq_put_decimal_ull(p, ' ', kstat_irqs_usr(j)); seq_printf(p, "\nctxt %llu\n" "btime %lu\n" "processes %lu\n" "procs_running %lu\n" "procs_blocked %lu\n", nr_context_switches(), (unsigned long)jif, total_forks, nr_running(), nr_iowait()); seq_printf(p, "softirq %llu", (unsigned long long)sum_softirq); for (i = 0; i < NR_SOFTIRQS; i++) seq_put_decimal_ull(p, ' ', per_softirq_sums[i]); seq_putc(p, '\n'); return 0; } static int stat_open(struct inode *inode, struct file *file) { size_t size = 1024 + 128 * num_possible_cpus(); char *buf; struct seq_file *m; int res; /* minimum size to display an interrupt count : 2 bytes */ size += 2 * nr_irqs; /* don't ask for more than the kmalloc() max size */ if (size > KMALLOC_MAX_SIZE) size = KMALLOC_MAX_SIZE; buf = kmalloc(size, GFP_KERNEL); if (!buf) return -ENOMEM; res = single_open(file, show_stat, NULL); if (!res) { m = file->private_data; m->buf = buf; m->size = ksize(buf); } else kfree(buf); return res; } static const struct file_operations proc_stat_operations = { .open = stat_open, .read = seq_read, .llseek = seq_lseek, .release = single_release, }; static int __init proc_stat_init(void) { proc_create("stat", 0, NULL, &proc_stat_operations); return 0; } fs_initcall(proc_stat_init);
Référence
http://man7.org/linux/man-pages/man5/proc.5.html
https://www.php.cn/link/f45cc474bff52cb1b2268a2f94a2abcf
https://www.php.cn/link/73d02e4344f71a0b0d51a925246990e7
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'interface de ligne de commande Linux fournit une multitude d'outils de traitement de texte, l'un des outils les plus puissants est la commande SED. SED est l'abréviation de Stream Editor, un outil multifonctionnel qui permet un traitement complexe des fichiers texte et des flux. Qu'est-ce que SED? SED est un éditeur de texte non interactif qui fonctionne sur des entrées de pipeline ou des fichiers texte. En fournissant des directives, vous pouvez le laisser modifier et traiter le texte dans un fichier ou un flux. Les cas d'utilisation les plus courants de SED incluent la sélection du texte, le remplacement du texte, la modification des fichiers d'origine, l'ajout de lignes au texte ou la suppression des lignes du texte. Il peut être utilisé à partir de la ligne de commande dans Bash et d'autres shells de ligne de commande. Syntaxe de commande SED sed

Compter efficacement les fichiers et les dossiers dans Linux: un guide complet Savoir compter rapidement les fichiers et les répertoires dans Linux est crucial pour les administrateurs système et toute personne qui gère les grands ensembles de données. Ce guide démontre en utilisant la commande simple-L

La gestion efficace des comptes d'utilisateurs et des abonnements de groupe est crucial pour l'administration du système Linux / Unix. Cela garantit un contrôle approprié des ressources et des données. Ce tutoriel détaille comment ajouter un utilisateur à plusieurs groupes dans les systèmes Linux et Unix. Nous

Le noyau Linux est le composant central d'un système d'exploitation GNU / Linux. Développé par Linus Torvalds en 1991, il s'agit d'un noyau Unix, monolithique, monolithique, modulaire et multitâche. Dans Linux, il est possible d'installer plusieurs noyaux sur un chant

Ce bref guide explique comment taper le symbole de roupies indien dans les systèmes d'exploitation Linux. L'autre jour, je voulais taper "Indian Rupee Symbol (₹)" dans un document Word. Mon clavier a un symbole de roupie dessus, mais je ne sais pas comment le taper. Après

Linux est mieux utilisé comme gestion de serveurs, systèmes intégrés et environnements de bureau. 1) Dans la gestion des serveurs, Linux est utilisé pour héberger des sites Web, des bases de données et des applications, assurant la stabilité et la fiabilité. 2) Dans les systèmes intégrés, Linux est largement utilisé dans les systèmes électroniques intelligents et automobiles en raison de sa flexibilité et de sa stabilité. 3) Dans l'environnement de bureau, Linux fournit des applications riches et des performances efficaces.

Linus Torvalds a publié Linux Kernel 6.14 Release Candidate 6 (RC6), ne signalant aucun problème significatif et en gardant la sortie sur la bonne voie. Le changement le plus notable dans cette mise à jour traite d'un problème de signature de microcode AMD, tandis que le reste des mises à jour

Outil de gestion de l'autorisation d'application FlatPak: guide de l'utilisateur FlatSeal Flatpak est un outil conçu pour simplifier la distribution et l'utilisation du logiciel Linux. Étant donné que les applications FlatPak sont situées dans cet environnement de bac à sable, elles doivent demander des autorisations pour accéder à d'autres parties du système d'exploitation, des appareils matériels (tels que Bluetooth, Network, etc.) et des sockets (tels que PulseAudio, SSH-Auth, Cups, etc.). Ce guide vous guidera sur la façon de configurer facilement Flatpak avec FlatSeal sur Linux
