Top-Befehl - CPU von Prozessen addiert sich nicht

Top-Befehl - CPU von Prozessen addiert sich nicht

Ich verstehe die verschiedenen Arten der CPU-Auslastung , die der topBefehl meldet ( 6.5%us,,,, usw.), aber warum ergibt der Gesamt-%CPU-Wert für jeden Prozess keinen der Werte? Unten beispielsweise verbraucht der Java-Prozess 77,5 % der CPU, aber 76,0 % sind noch im Leerlauf. Warum ist das so? Dies ist ein Single-Core-System.17.2%sy0.0%niCpu(s)Cpu(s)

top - 05:53:27 up 32 min,  2 users,  load average: 0.16, 0.29, 0.34
Tasks:  71 total,   1 running,  70 sleeping,   0 stopped,   0 zombie
Cpu(s):  6.5%us, 17.2%sy,  0.0%ni, 76.0%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   1758616k total,   643432k used,  1115184k free,    12224k buffers
Swap:   917500k total,        0k used,   917500k free,   304608k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                      
 1307 tomcat    20   0  683m 287m 9528 S 77.5 16.8  10:54.99 java                                                                                                                                                                          
 1571 ec2-user  20   0  2592 1096  872 R  1.0  0.1   0:08.61 top                                                                                                                                                                           
    1 root      20   0  2892 1364 1168 S  0.0  0.1   0:00.28 init                                                                                                                                                                          
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd            

Bearbeiten: Es stellt sich heraus, dass es sich um ein Dual-Core-System handelt. Hier ist die aktualisierte Ausgabe nach dem Drücken von 1, während der topBefehl ausgeführt wird:

top - 06:10:21 up 49 min,  2 users,  load average: 0.28, 0.37, 0.34
Tasks:  71 total,   1 running,  70 sleeping,   0 stopped,   0 zombie
Cpu0  :  9.9%us, 19.7%sy,  0.0%ni, 69.0%id,  0.0%wa,  0.0%hi,  1.4%si,  0.0%st
Cpu1  :  5.0%us, 10.0%sy,  0.0%ni, 85.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1758616k total,   677548k used,  1081068k free,    13296k buffers
Swap:   917500k total,        0k used,   917500k free,   305732k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                                                                      
 1307 tomcat    20   0  683m 318m 9528 S 68.0 18.6  17:23.53 java                                                                                                                                                                          
    1 root      20   0  2892 1364 1168 S  0.0  0.1   0:00.28 init                                                                                                                                                                          
    2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd                                                                                                                                                                      
    3 root      20   0     0    0    0 S  0.0  0.0   0:00.91 ksoftirqd/0                                                                                                                                                                   
    4 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0   

Antwort1

Die beiden Informationen, die Sie vergleichen, stimmen nicht überein, einfach weil sie aus unterschiedlichen Dateien stammen. Das heißt, obwohl top die Informationen im selben Terminal anzeigt, stammen sie nicht aus derselben Quelle.

Ich habe einfach ein Strace darüber laufen lassen (im Batch-Modus). Hier werden die systemweiten CPU-Informationen angezeigt.

16:04:04.081092 open("/proc/stat", O_RDONLY) = 6 <0.000022>
16:04:04.081154 lstat("/proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 <0.000015>
16:04:04.081211 lstat("/proc/stat", {st_mode=S_IFREG|0444, st_size=0, ...}) = 0     <0.000013>
16:04:04.081267 fstat(6, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 <0.000013>
16:04:04.081334 fstat(6, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 <0.000013>
16:04:04.081385 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f699ace2000 <0.000016>
16:04:04.081440 lseek(6, 0, SEEK_SET)   = 0 <0.000013>
16:04:04.081494 read(6, "cpu  302573 6910 83103 10092403 "..., 1024) = 1024 <0.000070>
16:04:04.081656 write(1, "%Cpu(s):  2.9 us,  0.8 sy,  0.1 "..., 80) = 80 <0.000034>
16:04:04.081763 write(1, "KiB Mem:   8048484 total,  41402"..., 73) = 73 <0.000035>
16:04:04.081858 write(1, "KiB Swap:  8060924 total,       "..., 72) = 72 <0.000034>
16:04:04.081940 write(1, "\n", 1)       = 1 <0.000026>

Wenn Sie jetzt sehen /proc/stat, werden alle CPUs des Systems angezeigt. top weiß das auch, weil es vor dem Öffnen von /proc/stat das Sys-Dateisystem öffnet.

16:04:03.367339 open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3 <0.000027>
16:04:03.367408 read(3, "0-7\n", 8192)  = 4 <0.000019>
16:04:03.367464 close(3)                = 0 <0.000015>

Wenn es nun darum geht, individuelle Prozessinformationen zu sammeln, ruft es diese aus /proc/pid/statmeiner /proc/pid/statDatei ab. (Ersetzen Sie „pid“ durch „die tatsächliche PID“).

Wie Sie sehen können, /proc/statsind systemweite Informationen fürALLEdie CPUs und einzelnen Prozessdateien für die PIDs sind ihre spezifischen Nur-PID-Informationen.

Sie passen also nicht zusammen.

Antwort2

Beim Sampling, also der topMessung der CPU-Auslastung, können Fehler auftreten.

Am besten lässt sich das so erklären: Stellen Sie sich eine Fabrik vor, die genau ein Auto pro Stunde produziert, und zwar genau zur vollen Stunde. Angenommen, Sie möchten die Produktionsrate der Fabrik ermitteln. Sie beginnen die Stichprobennahme um 5:59 Uhr und beenden sie um 7:01 Uhr. Sie sehen, dass zwei Autos produziert werden, eines um 6:00 Uhr und eines um 7:00 Uhr. Sie haben die Stichprobennahme 62 Minuten lang durchgeführt und es wurden 2 Autos produziert. Sie rechnen also damit, dass die Fabrik Autos mit etwa 200 % ihrer Nennkapazität produziert hat.

Darüber hinaus können Sie topdie Werte nicht miteinander vergleichen, da topIhnen kein Satz von Messungen eines einzelnen Systemzustands bereitgestellt wird, sondern ein Satz von unabhängigen Messungen, die jeweils ihren eigenen Bedingungen unterliegen.

Beispielsweise können die Werte pro CPU mit einem völlig anderen Mechanismus berechnet werden als die Werte pro Prozess. Die Werte pro CPU können exponentiell abnehmen, während die Werte pro Prozess die Differenz zwischen zwei Gesamtwerten sein können. Sie können also Messungen derselben Art von Dingen widerspiegeln, jedoch mit völlig unterschiedlichen Methoden.

verwandte Informationen