Entiendo los distintos tipos de uso de CPU informados por el top
comando ( 6.5%us
,,, etc.), pero ¿por qué el % 17.2%sy
de 0.0%ni
CPU 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 top
comando 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/statm
un /proc/pid/stat
archivo. (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 top
se 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 top
valores entre sí porque top
no 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.