top command - cpu dos processos não somam

2

Eu entendo os vários tipos de uso da CPU relatados pelo comando top ( 6.5%us , 17.2%sy , 0.0%ni , etc ...), mas por que o% da CPU total de cada processo não é somado? para algum dos valores Cpu(s) ? Por exemplo, abaixo do processo java está consumindo 77,5% da CPU, mas Cpu(s) diz que 76,0% ainda está ocioso. Por que é isso? Isso está em um único sistema central.

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            

Editar : Acontece que este é um sistema dual core. Aqui está a saída atualizada após pressionar 1 enquanto o comando top está ativo:

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   
    
por OpenUserX03 27.12.2013 / 07:08

2 respostas

2

Essas duas informações que você está comparando não corresponderão, simplesmente, porque elas são coletadas de arquivos diferentes. Ou seja, embora o top mostre as informações no mesmo terminal, elas não são coletadas da mesma fonte.

Eu simplesmente executei um strace na parte superior (em execução no modo batch). É aqui que ele mostra as informações da CPU do sistema.

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>

Agora, se você vir /proc/stat , ele mostrará todas as CPUs do sistema. top também sabe disso, porque antes de abrir / proc / stat, ele abre o sistema de arquivos sys.

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>

Agora, quando se trata de coletar informações de processo individuais, ele obtém o arquivo /proc/pid/statm e /proc/pid/stat . (substitua pid por bem, pid real).

Como você pode ver, /proc/stat são informações de todo o sistema para ALL as CPUs e arquivos proc individuais para os pids são suas informações específicas somente de pid.

Então, eles não combinam.

    
por 27.12.2013 / 11:45
5

A amostragem, que é como top mede o uso da CPU, está sujeita a erros.

A melhor maneira de explicar é assim: Imagine uma fábrica que produz exatamente um carro por hora, na hora. Digamos que você decida experimentar a taxa na qual a fábrica produz carros. Você começa a amostragem às 5:59 e pára de amostrar às 7:01. Você vê dois carros produzidos, um às 6:00 e outro às 7:00. Você provou por 62 minutos e 2 carros foram produzidos. Assim, você calcula que a fábrica estava produzindo carros com cerca de 200% de sua capacidade nominal.

Além disso, você não pode comparar valores de top uns contra os outros porque top não fornece um conjunto de medições de um único estado do sistema, mas um conjunto de medições independentes, cada sujeito ao seu próprio conjunto de condições. / p>

Por exemplo, os valores por CPU podem ser calculados usando um mecanismo completamente diferente dos valores por processo. Os valores por CPU podem ser decaídos exponencialmente enquanto os valores por processo podem ser a diferença entre dois totais. Então eles podem refletir medidas do mesmo tipo de coisa, mas usando metodologias completamente diferentes.

    
por 27.12.2013 / 08:47