Cómo comprender el uso de memoria y el promedio de carga en el servidor Linux

57

Estoy usando un servidor Linux que tiene 128 GB de memoria y 24 núcleos. Uso top para ver cuánto se usa. Su salida se pega al final de la publicación. Aquí hay dos preguntas:

(1) Veo que cada uno de los procesos en ejecución ocupa un porcentaje muy pequeño de memoria (% MEM no más de 0.2%, y la mayoría solo 0.0%), pero cómo la memoria total casi se usa como en la cuarta línea de salida ( "Mem: 130766620k total, 130161072k usado, 605548k gratis, 919300k tampones")? Parece poco probable que la suma del porcentaje de memoria utilizada en todos los procesos alcance casi el 100%, ¿no?

(2) ¿cómo entender el promedio de carga en la primera línea ("promedio de carga: 14.04, 14.02, 14.00")?

¡Gracias y saludos!

Editar:

¡Gracias!

También me gusta escuchar algunos números aproximados basados ​​en el porcentaje de memoria utilizada para determinar si un servidor está muy cargado, ya que una vez me convertí en el que acosaba el servidor sin comprender la carga actual.

¿El intercambio se considera casi lo mismo que la memoria? Por ejemplo, cuando la memoria y el intercambio son casi del mismo tamaño, si la memoria se está agotando pero el intercambio aún está en gran parte libre, ¿puedo verlo como si el porcentaje utilizado de memoria + intercambio aún no fuera alto y ejecutara otro nuevo procesos?

¿Cómo considerarían juntos el uso de CPU o memoria (o memoria + intercambio)? ¿Te preocupa si alguno de ellos llega demasiado alto o ambos?

Salida de arriba:

$ top

 
arriba - 12:45:33 hasta 19 días, 23:11, 18 usuarios, promedio de carga: 14.04, 14.02, 14.00
Tareas: 484 en total, 12 corriendo, 472 durmiendo, 0 detenidos, 0 zombies
CPU (s): 36.7% us, 19.7% sy, 0.0% ni, 43.6% id, 0.0% wa, 0.0% hi, 0.0% si, 0.0% st
Mem: 130766620k total, 130161072k usado, 605548k gratis, 919300k buffers
Intercambio: 63111312k en total, 500556k usado, 62610756k gratis, 124437752k en caché

  PID USUARIO PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND
 6529 sanchez 18 -2 1075m 219m 13m S 100 0.2 13760: 23 MATLAB
13210 timothy 18 -2 48336 37m 1216 R 100 0.0 3: 56.75 absurdo
13888 timothy 18-2 48336 37m 1204 R 100 0.0 2: 04.89 absurdo
14542 timothy 18-2 48336 37m 1196 R 100 0.0 1: 08.34 absurdo
14544 timothy 18-2 2888 2076 400 R 100 0.0 1: 06.14 reunir Datos
 6183 sanchez 18 -2 1133m 195m 13m S 100 0.2 13676: 04 MATLAB
 6795 sanchez 18 -2 1079m 210m 13m S 100 0.2 13734: 26 MATLAB
10178 timothy 18-2 48336 37m 1204 R 100 0.0 11: 33.93 absurdo 
12438 timothy 18 -2 48336 37m 1216 R 100 0.0 5: 38.17 absurdo
13661 timothy 18 -2 48336 37m 1216 R 100 0.0 2: 44.13 absurdo
14098 timothy 18-2 48336 37m 1204 R 100 0.0 1: 58.31 absurdo
14335 timothy 18-2 48336 37m 1196 R 100 0.0 1: 08.93 absurdo
14765 timothy 18-2 48336 37m 1196 R 99 0.0 0: 32.57 absurdo
13445 timothy 18-2 48336 37m 1216 R 99 0.0 3: 01.37 absurdo
28990 raíz 20 0 0 0 0 S 2 0.0 65: 50.21 pdflush
12141 tim 18 -2 19380 1660 1024 R 1 0.0 0: 04.04 arriba
 1240 raíz 15-5 0 0 0 S 0 0.0 16: 07.11 kjournald
 9019 raíz 20 0 296 m 4460 2616 S 0 0.0 82: 19.51 kdm_greet
    1 raíz 20 0 4028728592 S 0 0.0 0: 03.11 init
    2 raíz 15-5 0 0 0 S 0 0.0 0: 00.00 kthreadd
    3 raíz RT -5 0 0 0 S 0 0.0 0: 01.01 migración / 0
    4 raíz 15-5 0 0 0 S 0 0.0 0: 08.13 ksoftirqd / 0
    5 raíz RT -5 0 0 0 S 0 0.0 0: 00.00 perro guardián / 0
    6 raíz RT -5 0 0 0 S 0 0.0 17: 27.31 migración / 1
    7 raíz 15-5 0 0 0 S 0 0.0 0: 01.21 ksoftirqd / 1
    8 raíz RT -5 0 0 0 S 0 0.0 0: 00.00 perro guardián / 1
    9 raíz RT -5 0 0 0 S 0 0.0 10: 02.56 migración / 2
   10 raíz 15-5 0 0 0 S 0 0.0 0: 00.34 ksoftirqd / 2
   11 raíz RT -5 0 0 0 S 0 0.0 0: 00.00 perro guardián / 2
   12 raíz RT -5 0 0 0 S 0 0.0 4: 29.53 migración / 3
   13 raíz 15-5 0 0 0 S 0 0.0 0: 00.34 ksoftirqd / 3
Tim
fuente
2
Vea esto para una buena respuesta sobre la memoria. serverfault.com/questions/38065/#38074
Zoredache
Y esta respuesta para un resumen rápido sobre el promedio de carga (o esta lectura larga para los detalles).
Nickolay

Respuestas:

56

(1) Veo que cada uno de los procesos en ejecución ocupa un porcentaje muy pequeño de memoria (% MEM no más de 0.2%, y la mayoría solo 0.0%), pero cómo la memoria total casi se usa como en la cuarta línea de salida ( "Mem: 130766620k total, 130161072k usado, 605548k gratis, 919300k tampones")? Parece poco probable que la suma del porcentaje de memoria utilizada en todos los procesos alcance casi el 100%, ¿no?

Para ver cuánta memoria está usando actualmente, ejecute free -m. Proporcionará resultados como:

             total de buffers compartidos gratuitos usados ​​en caché
Memoria: 2012 1923 88 0 91 515
- / + memorias intermedias / caché: 1316 695
Intercambio: 3153 256 2896

El valor 'usado' de la fila superior (1923) casi siempre coincidirá con el valor mem de la fila superior (2012). Dado que a Linux le gusta usar cualquier memoria de reserva para almacenar en caché los bloques de disco (515).

La figura clave utilizada para mirar es el valor utilizado de la fila de búferes / caché (1316). Esta es la cantidad de espacio que utilizan actualmente sus aplicaciones. Para un mejor rendimiento, este número debe ser menor que su memoria total (2012). Para evitar errores de falta de memoria, debe ser menor que la memoria total (2012) y el espacio de intercambio (3153).

Si desea ver rápidamente cuánta memoria es libre, mire el valor libre de la fila de búferes / caché (695). Esta es la memoria total (2012), la actual utilizada (1316). (2012 - 1316 = 696, no 695, esto solo será un problema de redondeo)

(2) ¿cómo entender el promedio de carga en la primera línea ("promedio de carga: 14.04, 14.02, 14.00")?

Este artículo sobre el promedio de carga utiliza una buena analogía de tráfico y es la mejor que he encontrado hasta ahora: Comprensión de la carga de CPU de Linux: ¿cuándo debería preocuparse? . En su caso, como la gente señaló:

En el sistema multiprocesador, la carga es relativa a la cantidad de núcleos de procesador disponibles. La marca de "100% de utilización" es 1.00 en un sistema de un solo núcleo, 2.00, en un núcleo dual, 4.00 en un núcleo cuádruple, etc.

Entonces, con un promedio de carga de 14.00 y 24 núcleos, su servidor está lejos de estar sobrecargado.

Pascal Thivent
fuente
17

Los sistemas tipo Unix, incluido Linux, están diseñados para hacer el uso más eficiente posible de la RAM disponible. En términos muy generales, hay 3 estados en los que puede estar cada MB de RAM:

  1. Gratis
  2. Utilizado por un proceso
  3. Utilizado para tampones

El tercer estado solo se usa como espacio de memoria virtual y está destinado a reasignarse cuando sea necesario, es decir, su memoria total disponible para programas es realmente Free + UsedforBuffers. Como tal, realmente no verá el espacio asignado al búfer que se muestra como asignado a ningún proceso específico.

Su pregunta de promedio de carga es un poco más interesante, ya que puede malinterpretarse fácilmente. Para la historia completa, vea este artículo de linuxjournal . El mejor resumen es una cita directa del artículo,

El cálculo del promedio de carga se considera mejor como un promedio móvil de procesos en la cola de ejecución de Linux marcado como en ejecución o ininterrumpible

Lo que significa que puede pensar en su promedio de carga como (# de procesos en ejecución) + (# de procesos esperando en IO). Teniendo en cuenta que en cualquier momento puede tener un número de procesos $ CORE en ejecución, diría que su promedio de carga de 14 es bastante bajo.

Scott Pack
fuente
¡Gracias! ¿Cuál es el porcentaje de memoria utilizado (o memoria + intercambio) considerado como pesado y mejor no ejecutar nuevos procesos? ¿Miras tanto la memoria como la memoria + intercambio? ¿El intercambio utilizado se muestra en la parte superior del tamaño de intercambio utilizado realmente? Con respecto al promedio de carga de la CPU, ¿mide la carga real por "promedio de carga / número de núcleo"? ¿Cuánto le parece que el servidor está muy cargado? ¡Gracias y saludos!
Tim
2
La carga es solo un indicador. Como regla general, una carga mayor que los núcleos es algo malo. En general, un alto porcentaje de memoria utilizada es algo malo. No es un valor binario que se puede decir 'esto está bien'. Si te quedas sin RAM, no tienes suficiente para ejecutar más procesos. Si no te quedas sin nada, tienes mucho. Depende mucho de los detalles de su situación.
Cian
4

Desde la sarpágina del manual:

       El promedio de carga se calcula como el número promedio de 
       ejecutando tareas (estado R), y el número de tareas en ininterrumpible
       dormir (estado D) durante el intervalo especificado.

Desde la uptimepágina del manual:

       Los promedios de carga del sistema son el número promedio de procesos que son
       en un estado ejecutable o ininterrumpible. Un proceso en un estado ejecutable
       está usando la CPU o está esperando usar la CPU. Un proceso en unin‐
       El estado interrumpible está esperando algún acceso de E / S, por ejemplo, esperando el disco.
       Los promedios se toman durante los tres intervalos de tiempo. Promedios de carga
       no están normalizados para el número de CPU en un sistema, por lo que una carga promedio
       edad de 1 significa que se carga un solo sistema de CPU todo el tiempo mientras está en un 4
       Sistema de CPU significa que estuvo inactivo el 75% del tiempo.
Dennis Williamson
fuente
3
  1. Linux, desde hace algún tiempo, ha administrado su memoria de una manera que hace que esa línea sea topbásicamente inútil, generalmente manteniendo la mayor parte de la memoria de la máquina asignada para varios usos cuando no es requerida por un proceso de usuario.
  2. El promedio de carga es el número promedio de procesos en ejecución o en espera de ejecución. Por lo general, tiene una fuerte correlación negativa con la latencia / capacidad de respuesta del sistema, por lo que desea que sea lo más bajo posible. Sin embargo, dado que cada una de sus CPU puede ejecutar algo en un momento dado, parece que le va bastante bien a los 14 años.
caos
fuente
¡Gracias! Con respecto a 1, ¿quiere decir que algunos procesos no aparecen en la parte superior pero están usando mucha memoria? O que la cuarta línea de salida sobre la memoria ("Mem: 130766620k total, 130161072k usado, 605548k libre, 919300k buffers") es engañosa, debería mirar la suma del porcentaje de memoria utilizada por todos los procesos mostrados en la parte superior y en mi caso ¿Puedo ejecutar de forma segura algunos nuevos procesos que consumen memoria?
Tim
2
Como han señalado otras respuestas, el promedio de carga debe compararse con el número de procesadores, por lo que 14 no es tanto en un sistema de 24 núcleos. Sería algo así como 14/24 = 0.58 en un sistema de un solo núcleo (bueno, más o menos).
David Z
@Tim: Me refiero a lo último.
caos