ver uso top porcentaje para mpstat liberar consumo consola comando linux operating-system load

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; }