¿Cómo interpretar la salida del comando 'top' de Linux?

27

Después de una discusión hecha AQUÍ sobre cómo PHP-FPMconsumir memoria, acabo de encontrar un problema al leer la memoria al topmando. Aquí hay una captura de pantalla de mi topjusto después de reiniciar PHP-FPM. Todo es normal: alrededor de 20 PHP-FPMprocesos, cada uno de los cuales consume 5,5 MB de memoria (0,3% del total).

ingrese la descripción de la imagen aquí

Aquí está el servidor PHP-FPMantiguo justo antes del reinicio (un día después del reinicio anterior). Aquí, todavía tenemos alrededor de 25 PHP-FPMcon doble uso de memoria (10 MB que indican 0.5% del total). Por lo tanto, la memoria total utilizada debe ser 600-700 MB. Entonces, ¿por qué se ha utilizado la memoria de 1,6 GB?

ingrese la descripción de la imagen aquí

Googlebot
fuente
@ephemient no, no es el caso aquí. He revisado todas estas cosas. Esto es algo relacionado con PHP-FPM, y la memoria se liberará reiniciando PHP-FPM solamente. De todos modos, los valores de Mem y buffer / cache in freeson idénticos.
Googlebot
66
Parece que estás ejecutando un Virtuozzo "VM". Todas las apuestas están canceladas en lo que respecta a la contabilidad de memoria en esas cosas.
womble
Querido womble y ephemient: ¡Robé tus dos respuestas! carcajadas
Wesley

Respuestas:

34

TL; DR 1

Su servidor está dentro de algún tipo de contenedor virtuozzo / openvz / virtualization-du-jour . Intentar dar sentido al uso de la memoria se inclina en los molinos de viento.

TL; DR 2

¡Linux se comió tu RAM! Pero está bien, se lo hace a todos.


La larga historia

¡Vamos a desglosarlo!

En la Mem:sección tenemos:

  • $n total: la cantidad de RAM física en su máquina
  • $n used: cuánta memoria está consumiendo Linux, no solo la suma de los procesos.
  • $n free: Cuánta RAM no está siendo consumida por Linux. Esto no tiene en cuenta que la memoria almacenada en caché y en búfer es esencialmente "gratuita".
  • $n buffers: el espacio de almacenamiento intermedio es donde se almacenan los bloques de E / S de disco que se han leído o están pendientes de escritura. Un búfer es una representación RAM de un solo bloque de disco.

En la Swap:sección tenemos:

  • $n total: Autoexplicativo. Cantidad de espacio en disco disponible para intercambiar páginas.
  • $n used: Autoexplicativo. Cuánto espacio de intercambio de disco se usa.
  • $n free: Herp Derp.
  • $n cache: Estrechamente relacionado con los búferes anteriores. En realidad, es parte del caché de la página y no tiene espacio en el disco físico. No te preocupes por los detalles de esta conversación.

La parte interesante viene cuando corres free -m. Verás tres líneas, y todos los números se correlacionarán con la parte superior. Daré mi propia PC como ejemplo:

             total       used       free     shared    buffers     cached
Mem:          8070       7747        323          0        253       5713
-/+ buffers/cache:       1780       6290
Swap:         5055          0       5055

La fila Mem muestra RAM total en megabytes ( $n totalen la parte superior), cuánto se usa ( $n useden la parte superior), cuánto es libre ( $n freeen la parte superior), cuánto se comparte (ignore eso), ¡y ahora viene lo bueno! Las columnas buffersy cacheden free -mcorrelacionan, previsiblemente, $n buffersy $n cache. Pero eche un vistazo a la segunda fila con la free -mque comienza -/+ buffers/cache:. La matemática muestra que la cantidad utilizada es realmente (total) - ((used-buffers) -cached). Gratis es (total) - (theNewUsed).

¿Qué significa todo esto? ¡Significa que Linux se comió tu RAM! La historia corta es que el kernel de Linux engulle RAM ya que está disponible para usar para el almacenamiento en caché de disco. No puede hacer nada al respecto, a menos que tenga ganas de intentar compilar un núcleo personalizado. Consejo profesional: no lo hagas.

La RAM está realmente allí y libre para que los procesos la utilicen a su antojo. Eso es lo que significa la -/+ buffers/cache:fila de adentro free -m. Sin embargo, está dentro del contenedor de virtualización sin hipervisor que hace que las cosas sean un poco ardientes. Simplemente no puede hacer un balance de su memoria con precisión de byte en este momento. Sin embargo, no está viendo ningún comportamiento que sea terriblemente inusual.

Mantenga la calma y continúe. Además, obtenga un servidor físico (a menos que desee estadísticas de memoria que parezcan que Kreskin es su SysAdmin).

Wesley
fuente
¿La cantidad utilizada no es ((buffers usados) en caché)?
mac
1

Top no es la mejor manera de verificar el uso de la memoria. Sin embargo, dado que mi pregunta fue marcada como un duplicado de esta pregunta, voy a publicar mi resolución aquí.

Leí en un foro que ps_mem.py verificará el uso de memoria por usted.

Repositorio: https://github.com/pixelb/ps_mem/

Descargar:

pip install ps_mem

Uso:

ps_mem

Salida:

# ps_mem
 Private  +   Shared  =  RAM used   Program

  4.0 KiB +  15.5 KiB =  19.5 KiB   udevd
  4.0 KiB +  16.0 KiB =  20.0 KiB   mysqld_safe
  4.0 KiB +  25.5 KiB =  29.5 KiB   dbus-daemon
  4.0 KiB +  27.5 KiB =  31.5 KiB   xinetd
 60.0 KiB +  14.5 KiB =  74.5 KiB   epmd
108.0 KiB +  23.0 KiB = 131.0 KiB   init
  8.0 KiB + 135.0 KiB = 143.0 KiB   saslauthd (2)
180.0 KiB +  34.0 KiB = 214.0 KiB   check_scripts.s
796.0 KiB +  41.0 KiB = 837.0 KiB   bash
528.0 KiB + 359.0 KiB = 887.0 KiB   crond (7)
  1.2 MiB + 218.0 KiB =   1.4 MiB   sshd (2)
  1.6 MiB +  45.0 KiB =   1.6 MiB   rsyslogd
  2.0 MiB + 133.0 KiB =   2.1 MiB   beam.smp
  1.3 MiB +   2.3 MiB =   3.6 MiB   httpd (8)
 12.8 MiB + 956.0 KiB =  13.8 MiB   sendmail.sendmail (7)
 53.5 MiB + 114.0 KiB =  53.7 MiB   mysqld
317.6 MiB +   2.3 MiB = 320.0 MiB   python (6)
---------------------------------
                        398.5 MiB
=================================
Usuario
fuente