top - uso de cpu linux consola
Entendiendo el promedio de carga vs. uso de la CPU (1)
Bueno, yo también soy un usuario de Windows, así que mi conocimiento de las cosas de tipo Linux-y es un poco limitado.
Sin embargo, según mi entendimiento general, el "promedio de carga" es una indicación de la cantidad de procesados que se están ejecutando en un momento dado, en promedio durante el último minuto, cinco minutos y ... ¿quince minutos?
De todos modos, he estado monitoreando mi servidor porque tuvimos una gran apertura y mucha gente.
He estado viendo top
y noté algo que parecía contrario a lo que creía saber.
Si el promedio de carga es 7, con 4 procesadores de subproceso, ¿no debería eso significar que la CPU está funcionando a aproximadamente 7/8 de capacidad?
¿Por qué, entonces estaba mostrando 50.0% de id? ¿Cómo puede estar inactivo la mitad del tiempo?
No lo entiendo XD
En primer lugar, la top
no calcula load average
sí. Simplemente lee load average
del archivo /proc/loadavg
( strace
muestra que top
abre /proc/loadavg
y luego lo lee periódicamente). man proc
dice esto para /proc/loadavg
:
/ proc / loadavg
Los primeros tres campos de este archivo son cifras promedio de carga que indican el número de trabajos en la cola de ejecución (estado R) o la espera de E / S de disco (estado D) promediada en 1, 5 y 15 minutos. Son los mismos que los números promedio de carga dados por el tiempo de actividad (1) y otros programas. El cuarto campo consta de dos números separados por una barra (/). El primero de ellos es el número de entidades de programación de kernel actualmente en ejecución (procesos, subprocesos); esto será menor o igual que el número de CPU. El valor después de la barra diagonal es el número de entidades de programación de kernel que existen actualmente en el sistema. El quinto campo es el PID del proceso que se creó más recientemente en el sistema.
Por lo tanto load average
muestra el número de trabajos en la cola de ejecución. Y se muestran los primeros tres valores de /proc/loadavg
en la top
. Si ejecuta cat /proc/loadavg
verá todos los valores en el archivo.
Por cierto, parece que hay un error en la descripción del cuarto campo. He escrito un programa de prueba simple en C ++ que lee un entero N de la entrada y luego crea N subprocesos que ejecutan un bucle infinitivo cada uno. Cuando ejecuto mi programa y le pido que cree 256 hilos. Sólo tengo 8 procesadores con HT. Sin embargo, veo esto en el archivo:
>cat /proc/loadavg
74.44 21.04 10.59 259/931 17293
Claramente, 259 es más grande que el número de CPU en mi máquina. Esta publicación http://juliano.info/en/Blog:Memory_Leak/Understanding_the_Linux_load_average habla de lo mismo: hay un error en la descripción del load average
de load average
. Esta es una cita:
Vale la pena señalar que la explicación actual en la página del manual proc (5) (a partir de las páginas de manual versión 3.21, marzo de 2009) es incorrecta. Reporta el primer número del cuarto campo como el número de entidades de programación que se ejecutan actualmente, y así predice que no puede ser mayor que el número de CPU. Eso no coincide con la implementación real, donde este valor informa el número actual de subprocesos ejecutables
Entonces, respondiendo a tus preguntas:
Si el promedio de carga es 7, con 4 procesadores de subproceso, ¿no debería eso significar que la CPU está funcionando a aproximadamente 7/8 de capacidad?
No, solo significa que tiene 7 procesos en ejecución en la cola de trabajos en promedio.
¿Por qué, entonces estaba mostrando 50.0% de id? ¿Cómo puede estar inactivo la mitad del tiempo?
Porque load average
no significa "% de capacidad de CPU". Sus hilos simplemente usan el 50% de la CPU y el 50% del tiempo haciendo otra cosa.
Y finalmente. A continuación se muestra mi prueba simple. Para compilar use g++ -pthread my_test.cpp -o my_test
. Ejecute ./my_test 8
y vea su tiempo de inactividad cuando los subprocesos se ejecutan constantemente y no pierda el tiempo esperando nada. O ejecute ./my_test 128
para ver que el promedio de carga puede ser mucho mayor que el número de CPU.
#include <pthread.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <ctype.h>
static void* __attribute__ ((noinline))
my_thread_func(void * arg)
{
printf("Thread %lld:/n", (long long)pthread_self());
volatile long long i = 0;
while (1) {
++i;
}
return 0;
}
int
main(int argc, char *argv[])
{
int num_threads;
pthread_t *my_threads;
num_threads = atoi(argv[1]);
my_threads = new pthread_t[num_threads];
for (int tnum = 0; tnum < num_threads; tnum++) {
pthread_create(&my_threads[tnum], NULL, &my_thread_func, NULL);
}
sleep (600);
return 0;
}