comando superior: la CPU de los procesos no suma

comando superior: la CPU de los procesos no suma

Entiendo los distintos tipos de uso de CPU informados por el topcomando ( 6.5%us,,, etc.), pero ¿por qué el % 17.2%syde 0.0%niCPU total para cada proceso no suma ninguno de los Cpu(s)valores? Por ejemplo, a continuación, el proceso de Java consume el 77,5 % de la CPU, pero Cpu(s)dice que el 76,0 % sigue inactivo. ¿Por qué es esto? Esto es en un sistema de un solo núcleo.

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: Resulta que este es un sistema de doble núcleo. Aquí se muestra el resultado actualizado después de presionar 1 mientras el topcomando está activo:

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   

Respuesta1

Esas dos informaciones que estás comparando no coincidirán, simplemente porque están recopiladas de archivos diferentes. Es decir, aunque top muestra la información en el mismo terminal, no se recopilan de la misma fuente.

Simplemente ejecuté un strace en la parte superior (ejecutándolo en modo por lotes). Aquí es donde muestra la información de la CPU de todo el 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>

Ahora, si ve /proc/stat, muestra todas las CPU del sistema. top también lo sabe, porque antes de abrir /proc/stat, abre el sistema de archivos 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>

Ahora, cuando se trata de recopilar información de procesos individuales, la obtiene de /proc/pid/statmun /proc/pid/statarchivo. (reemplace pid con bueno, pid real).

Como puede ver, /proc/stat¿hay información de todo el sistema paraTODOlas CPU y los archivos de proceso individuales para los pids son su información específica de pid únicamente.

Entonces no coincidirán.

Respuesta2

El muestreo, que es la forma en que topse mide el uso de la CPU, está sujeto a errores.

La mejor manera de explicarlo es así: imaginemos una fábrica que produce exactamente un automóvil por hora, cada hora. Supongamos que decide tomar una muestra del ritmo al que la fábrica produce automóviles. Comienzas a muestrear a las 5:59 y dejas de muestrear a las 7:01. Ves dos autos producidos, uno a las 6:00 y otro a las 7:00. Se tomaron muestras durante 62 minutos y se produjeron 2 autos. Por lo tanto, se calcula que la fábrica estaba produciendo automóviles a aproximadamente el 200% de su capacidad nominal.

Además, no puede comparar topvalores entre sí porque topno proporciona un conjunto de mediciones de un único estado del sistema, sino un conjunto de mediciones independientes, cada una sujeta a su propio conjunto de condiciones.

Por ejemplo, los valores por CPU se pueden calcular utilizando un mecanismo completamente diferente al de los valores por proceso. Los valores por CPU pueden disminuir exponencialmente, mientras que los valores por proceso pueden ser la diferencia entre dos totales. Por tanto, pueden reflejar mediciones del mismo tipo de cosas, pero utilizando metodologías completamente diferentes.

información relacionada