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.