¿Cómo se interpreta el "promedio de carga" en la salida "superior"? ¿Es lo mismo para todas las distribuciones?

12

Me gustaría saber si la salida de un Linux basado en Red-Hat podría ser interpretada de manera diferente por un Linux basado en Debian.

Para hacer la pregunta aún más específica, lo que busco es comprender cómo se interpreta el "promedio de carga" de la primera línea del topcomando en un sistema Red-Hat y cómo verificar esto mediante el código oficial de la documentación.

[Hay muchas maneras de abordar este tema, todas las cuales son respuestas aceptables a la pregunta]

Un enfoque potencial sería encontrar dónde se documenta oficialmente esta información.
Otro, sería encontrar la versión del código que topse construye en la distribución específica y la versión en la que estoy trabajando.

El resultado del comando que obtengo es:

    top - 13:08:34 up  1:19,  2 users,  load average: 0.02, 0.00, 0.00
    Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 96.8%id,  2.7%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3922520k total,   788956k used,  3133564k free,   120720k buffers
    Swap:  2097148k total,        0k used,  2097148k free,   344216k cached


En este caso, ¿cómo puedo interpretar el valor promedio de carga ?
He logrado localizar que la carga promedio es aproximadamente el último minuto, de una fuente de documentación y que debe ser interpretada después de ser multiplicada por 100, por otra fuente de documentación.
Entonces, la pregunta es:
¿está cargado 0.02% o 2%?
Fuentes de documentación y versiones:

1) El primero protagoniza con

    TOP(1)                        Linux User’s Manual                       TOP(1)

    NAME
           top - display Linux tasks

Fuente: man topen mi distribución RedHat,
Ubuntu también tiene la versión con "tareas" que no explica el promedio de carga en:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) El segundo comienza con

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

Fuente:
http://man7.org/linux/man-pages/man1/top.1.htm

3) Este comienza con:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

Fuente: http://www.unixtop.org/man.shtml

El primero , se puede ver en man topin RHELo in online ubuntu documentationy no tiene ninguna explicación para el formato de salida (ni sobre el promedio de carga en el que estoy interesado) .

El segundo , contiene una breve explicación, señalando que el promedio de carga tiene que ver con el último minuto, ¡pero nada sobre la interpretación de su valor!

Cito directamente de la segunda fuente:

2a. Promedios de TIEMPO DE CARGA y TIEMPO
Esta parte consta de una sola línea que contiene:
nombre del programa o ventana, según el tiempo de visualización
y el tiempo actual del modo de visualización desde el último arranque,
número total de usuarios
promedio de carga del sistema en los últimos 1, 5 y 15 minutos

Entonces, si esta explicación es correcta, es suficiente para entender que el promedio de carga es de aproximadamente el último minuto.
Pero no explica el formato del número.

En la tercera explicación, dice que:

Al especificar números para promedios de carga, deben multiplicarse por 100.

Esta explicación sugiere que 0.02 significa 2% y no 0.02%. ¿Pero es esto correcto? Además, ¿es correcto para todas las distribuciones de Linux y las implementaciones potencialmente diferentes de top?
Para encontrar la respuesta a esta pregunta, intenté revisar el código buscándolo en línea. ¡Pero encontré, al menos, dos versiones diferentes de toprelacionadas con RHEL por ahí! el builtin-top.cy el refactorizado top.c. Ambos con derechos de autor de Red-Hat como dice el aviso al comienzo del código y, por lo tanto, parece lógico que RHEL use uno de estos.
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

So, before delving into that much code, I wanted an opinion about where to focus to form an accurate understanding on how cpu load is interpreted?

From information given in the answers below, in addition to some personal search, I have found that:

1 - The top that I am using is contained in the package procps-3.2.8. Which can be verified by using top -v.
2 - In the version of procps-3.2.8 that I have downloaded from the official website it seems that the tool uptime get its information from the procfs file /proc/loadavg directly (not utilizing the linux function getloadavg()).
3 - Now for the top command it also does not use the function getloadavg(). I managed to verify that the top does indeed the same things as the uptimeherramienta para mostrar los promedios de carga. Realmente llama a la uptimefunción de la herramienta, que obtiene su información del procfsarchivo /proc/loadavg.

Entonces, ¡todo apunta al /proc/loadavgarchivo! Por lo tanto, para comprender con precisión lo load averageproducido por top, uno debe leer el código del núcleo para ver cómo loadavgse escribe el archivo .
También hay un excelente artículo señalado en una de las respuestas que proporciona una explicación en términos simples de los tres valores de loadavg.
Entonces, a pesar de que todas las respuestas han sido igualmente útiles y útiles, voy a marcar la que señaló el artículo http://www.linuxjournal.com//article/9001 como "la" respuesta a mi pregunta. ¡Gracias a todos por su contribución!

Además de la pregunta Comprensión del promedio superior y de carga , he encontrado un enlace al código fuente del núcleo que apunta al lugar donde loadavgse calcula. Como parece que hay un gran comentario que explica la forma en que funciona, ¡también está esta parte del código C!
El enlace al código es http://lxr.free-electrons.com/source/kernel/sched/loadavg.c
Nuevamente, no estoy tratando de involucrarme en ninguna forma de plagio, solo estoy agregando esto para completarlo. Por lo tanto, estoy repitiendo que el enlace al código del núcleo se encontró a partir de una de las respuestas en Comprender el promedio superior y de carga ...

Angelos Asonitis
fuente
¿Qué te dicen las versiones? ( top -v)
Fiximan
top: procps versión 3.2.8
Angelos Asonitis

Respuestas:

19

La carga de la CPU es la longitud de la cola de ejecución, es decir, la longitud de la cola de procesos que esperan ejecutarse.

El uptimecomando se puede usar para ver la duración promedio de la cola de ejecución en el último minuto, los últimos cinco minutos y los últimos 15 minutos, tal como se muestra normalmente top.

Un valor de carga alto significa que la cola de ejecución es larga. Un valor bajo significa que es corto. Entonces, si el promedio de carga de un minuto es 0.05, significa que en promedio durante ese minuto, hubo 0.05 procesos esperando para ejecutarse en la cola de ejecución. No es un porcentaje. Esto es, AFAIK, lo mismo en todos los Unices (aunque algunos Unices pueden no contar los procesos en espera de E / S, lo que creo que Linux hace; OpenBSD, solo por un tiempo, también contó los hilos del kernel, por lo que la carga siempre fue 1 o más).

La toputilidad Linux obtiene los valores de carga del núcleo, que los escribe /proc/loadavg. Mirando las fuentes para procps-3.2.8, vemos que:

  1. Para mostrar los promedios de carga, sprint_uptime()se llama a la función top.c.
  2. Esta función vive en proc/whattime.cy llamadas loadavg()en proc/sysinfo.c.
  3. Esa función simplemente se abre LOADAVG_FILEpara leer los promedios de carga.
  4. LOADAVG_FILEse define anteriormente como "/proc/loadavg".
Kusalananda
fuente
Muchas gracias por su respuesta, ¿está esto oficialmente documentado en alguna parte?
Angelos Asonitis
1
@AgelosAssonitis Este artículo de LinuxJournal de 2006 puede ser interesante. Apunta a un par de archivos de origen en el árbol de origen del kernel de Linux que es posible que desee ver. No soy un usuario de Linux, así que no puedo decir si esos archivos todavía están allí en la última encarnación del núcleo: linuxjournal.com/article/9001
Kusalananda
Interesante artículo de hecho! Solo estoy buscando en el paquete procps para ver si el comando top toma su valor del archivo / proc / loadavg y si es el mismo que el resultado de la función getloadavg ().
Angelos Asonitis
@AgelosAssonitis El lugar definitivo para la documentación de los promedios de carga es el árbol de origen del kernel. POSIX no define cuál es la carga de la CPU, y no menciona las palabras "promedio de carga" en ninguna parte. Las utilidades topy uptimeno son utilidades POSIX y la getloadavg()función de biblioteca tampoco está definida en POSIX (aunque tiene un linaje BSD).
Kusalananda
Entonces, de lo que deduzco no hay documentación oficial para comprender la formación de estos valores que no sea la fuente del núcleo en sí, ¿es correcto? Sin embargo, antes de llegar allí, todavía necesito vincular el valor presentado en topel archivo procfs loadavg ...
Angelos Asonitis
7

El promedio de carga es típicamente calculado por el núcleo. Las aplicaciones como topy uptimepueden usar la getloadavg(3)llamada de la biblioteca para acceder a esto (está destinado a ser portátil en diferentes versiones de Unix). En Linux, esto generalmente resulta en una lectura de /proc/loadavg. En FreeBSD es una llamada al sistema.

Por ejemplo:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  double ld[3];

  int i=getloadavg(ld,3);
  printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}

uptimey topambos hacen llamadas similares para obtener sus datos.

Ahora los promedios de carga de 1/5/15 minutos son el número de procesos en la cola de ejecución. Los diferentes sistemas operativos pueden calcular esto de diferentes maneras; la mayor diferencia normalmente es si los procesos que esperan E / S (por ejemplo, bloqueado en el disco) cuentan como ejecutables o no. En Linux lo son.

Entonces, un promedio de carga de 3.4 significa que hubo un promedio de 3.4 procesos en la cola de ejecución dentro de la ventana de muestra (1, 5, 15 minutos).

Sin embargo, un promedio de carga alto no significa necesariamente un servidor sobrecargado. Si tiene 16 núcleos, su promedio de carga puede ser 16 sin estrés. También podría tener muchas fork()llamadas de aplicaciones que pueden dar lugar a la creación / destrucción de una gran cantidad de procesos, lo que lleva a un alto promedio de carga, pero sin afectar de manera masiva el rendimiento del servidor. Solo debe usarse como una guía, junto con otras métricas como% CPU ocupado.

Stephen Harris
fuente
4

El promedio de carga no es algo específico de una herramienta o distribución en particular, es una medida proporcionada por el Kernel, o más precisamente, el planificador, por lo tanto, es una medición independiente de la distribución. La medición se registra dentro del sistema de archivos proc/proc

Según su interpretación, la métrica promedio de carga no es una indicación de qué tan duro está trabajando la CPU, sino cuánto trabajo hay que hacer. No creo que sea realmente necesario multiplicarlo por nada porque es una medida directa del número de procesos en un estado ejecutable o ininterrumpible.

Intente consultar las siguientes dos páginas de manual: getloadavg(3)y uptimepara obtener más información.

La métrica promedio de carga puede ser un concepto difícil de entender al principio, creo que mucha gente piensa que es una indicación de lo duro que está trabajando la CPU, pero eso no es realmente así.

pmyjavec
fuente
1
Bien, pero ¿estamos absolutamente seguros de que el promedio de carga descrito en la getloadavg()descripción de la función es el mismo promedio de carga que topmuestra el comando en rhel? ¡Lo pregunto porque realicé una búsqueda de texto completo en el contenido no tarrado del paquete procps-3.2.8 (que se indica mediante el comando top -v) y no hay una sola mención de la función getloadavg ()! Entonces, quizás top calcula el promedio de carga de una manera diferente ...
Angelos Asonitis