comando superior - CPU dos processos não soma

comando superior - CPU dos processos não soma

Entendo os vários tipos de uso de CPU relatados pelo topcomando ( 6.5%us, 17.2%sy, 0.0%ni, etc...), mas por que a% total de CPU para cada processo não soma nenhum dos Cpu(s)valores? Por exemplo, abaixo o processo java está consumindo 77,5% da CPU, mas Cpu(s)diz que 76,0% ainda está ocioso. Por que é isso? Isso ocorre em um sistema de núcleo único.

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 topcomando 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   

Responder1

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

Simplesmente executei um strace por cima (executando em modo lote). É aqui que mostra as informações da CPU de todo o 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ê ver /proc/stat, mostra 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 processos individuais, elas são obtidas de /proc/pid/statmum /proc/pid/statarquivo. (substitua pid por bem, pid real).

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

Então, eles não vão combinar.

Responder2

A amostragem, que mede topo uso da CPU, está sujeita a erros.

A melhor forma de explicar é assim: imagine uma fábrica que produz exatamente um carro por hora, por hora. Digamos que você decida testar a taxa com que a fábrica produz carros. Você inicia a amostragem às 5h59 e para a amostragem às 7h01. Você vê dois carros produzidos, um às 6h e outro às 7h. Você testou 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 topvalores entre si porque topnão fornece um conjunto de medições de um único estado do sistema, mas um conjunto de medições independentes, cada uma sujeita ao seu próprio conjunto de condições.

Por exemplo, os valores por CPU podem ser calculados usando um mecanismo completamente diferente dos valores por processo. Os valores por CPU podem ser reduzidos exponencialmente, enquanto os valores por processo podem ser a diferença entre dois totais. Assim, eles podem refletir medições do mesmo tipo de coisa, mas usando metodologias completamente diferentes.

informação relacionada