Algo se come toda la memoria (sospecho que hay pérdida de memoria en alguna aplicación). ¿Cómo detectar qué?

16

Tengo un servidor que ejecuta el paquete liquidsoap + icecast y un sitio web simple (httpd + mysqld). Nada especial. Visitantes alrededor de 2000+ por día, con alrededor de 50 en línea simultáneamente en promedio.

El servidor tiene 8 GB de RAM. A medida que pasa el tiempo, la cantidad de memoria libre disminuye constantemente, aunque no se inicia nada nuevo en el servidor y no hay nuevos usuarios. En algún momento comienza a intercambiarse, la carga en el servidor aumenta y deja de responder. Por lo general, lo que hago es simplemente reiniciar el servidor ...

¿Qué se puede hacer para detectar qué es exactamente la pérdida de memoria? Uso top para monitorear el uso de recursos, pero por lo que veo no muestra nada útil:

ingrese la descripción de la imagen aquí

¿Hay alguna forma de averiguar qué usa tanta memoria? o lo que comienza a intercambiar en el disco en gran medida? ¿Alguna forma de liberar memoria sin reiniciar el servidor?

jayarjo
fuente
¿Alguna razón por la que no intentas reiniciar algunos de los servicios (apache, liquidsoap) en lugar del servidor?
jamespo
Originalmente respondí para el uso normal de la memoria. He actualizado con un conjunto de herramientas que pueden ayudar a identificar el problema.
BillThor
@jamespo, en realidad lo intenté, pero no tuvo ningún efecto, así que reiniciar fue lo único que sabía que podía ayudar.
jayarjo
El 4027092k en caché debería explicar el uso de la memoria, ¿no? En este momento estoy trabajando en un problema similar en otro lugar, y hasta ahora he logrado averiguar que la transferencia de memoria se puede regular con los siguientes parámetros: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio Esto no es una solución completa y cualquier comentario bienvenido Espero que sea una dirección correcta.

Respuestas:

16

La ejecución topen modo por lotes para informar periódicamente los tamaños de memoria se puede usar para ver quién está usando la memoria cuando las cosas van mal. La ejecución saren modo por lotes debería proporcionar algunos buenos diagnósticos sobre el uso de la memoria y las E / S relacionadas. Ejecutar muninpara monitorear el sistema debería darle un gráfico con buenos detalles sobre para qué memoria se está utilizando. Esto puede ayudar mucho.

Puede usar limits.conf para limitar el tamaño máximo de núcleo de los programas. Establecido correctamente, esto debería matar a cualquier programa que esté perdiendo memoria. Esto funciona con el módulo pam_limits. Los límites también se pueden establecer con el ulimitscomando.

Está ejecutando algunos programas que podrían utilizar grandes cantidades de memoria. Algunas cosas que podrías mirar incluyen.

  • Las aplicaciones mal programadas que se ejecutan bajo apache2pueden perder memoria. Debería ver que el tamaño de la memoria aumenta cuando esto sucede. Puede ajustar apache2 para reciclar a los niños después de un cierto número de usos estableciéndolo MaxRequestsPerChilden aproximadamente 100. Si esto resuelve el problema, entonces debe resolver la fuga. Vería esto primero.
  • MySQL puede intentar cargar datos en la memoria. Si tiene una gran cantidad de datos en la memoria, esto puede causar cierta agitación, pero no debería ser tan dramático como está viendo.
  • Si tiene un tmpfssistema de archivos grande montado, puede perder memoria si los archivos no se eliminan cuando se usan. Los archivos grandes de larga duración también pueden ser un problema.
  • Si el problema se produce aproximadamente a la misma hora del día, es posible que tenga un programa programado que está perdiendo memoria.
  • Si tiene un programa que asigna memoria compartida, pero no la libera antes de salir, tendrá una pérdida de memoria relativamente invisible. Si la memoria compartida está bloqueada en la memoria, puede forzar el intercambio. La cantidad de memoria compartida disponible suele ser relativamente limitada.
  • El paquete liquidsoap + icecast podría tener problemas de almacenamiento en búfer que usan memoria. No he usado esta combinación, así que no estoy seguro de cómo aparecería.

Uso normal de la memoria: la memoria libre no es algo que desee mucho. Si su sistema ha estado funcionando durante mucho tiempo y tiene mucha memoria libre, algo está mal. Cada vez que lea o escriba un archivo, los bloques irán al caché del búfer. Esto reducirá su memoria libre, y es algo bueno. El sistema mantendrá suficiente espacio libre para iniciar algunos programas sin buscar memoria en otro lugar. Como muchos programas se ejecutan rápidamente, su memoria volverá al grupo libre cuando dejen de ejecutarse.

Cuando lee un archivo que está en la memoria caché del búfer, no se requiere acceso al disco y la lectura se resuelve desde la memoria caché del búfer. Las escrituras usan un mecanismo similar. Si su sistema necesita memoria, la memoria caché del búfer es uno de los primeros lugares que se utiliza. La mayoría de los buffers se pueden liberar de inmediato.

Si tiene una pérdida de memoria, verá que la memoria libre y las memorias intermedias comienzan a reducirse. Esto todavía no es un problema grave, ya que la memoria perdida eventualmente debería trasladarse al espacio de intercambio. Su sistema seguirá funcionando bien hasta que complete el espacio de intercambio, y extraiga el espacio libre restante para que los programas de punto no puedan iniciarse. Es típico que se pueda usar una pequeña cantidad de espacio de intercambio.

BillThor
fuente
El problema en mi caso es un poco raro. Incluso cuando la carga es enorme y el servidor intercambia mucho, hay mucha memoria libre (como entendí después de leer sobre memorias intermedias y cachés). top no muestra ningún proceso que acapare la memoria cada vez más. Pero la carga aumenta y en algún momento el servidor queda inutilizable: | Gracias por la respuesta detallada.
jayarjo
2
@jayarjo: Munin y sar deberían ayudar a detectar lo que está sucediendo. Si tiene mucha memoria libre, no debería intercambiar. Es posible que tenga un problema de E / S diferente. sarayudará a determinar qué partición tiene la E / S y puede ayudar a descubrir el problema.
BillThor
+1 para MaxRequestsPerChild advice
jamespo
11

Puede usar este comando para ver las 10 aplicaciones principales con respecto al uso de RAM:

ps -A --sort -rss -o comm,pmem | head -n 11

A veces, este comando te ayuda si se han generado muchos subprocesos:

ps auxf

De esta manera puede ver qué procesos pertenecen juntos.

Raffael Luthiger
fuente
Estos son comandos útiles, gracias los anotaré para el futuro. Pero el problema es que siempre hay los mismos procesos en la parte superior (puedes verlos en la captura de pantalla adjunta): apache, mysql, liquidsoap, icecast. Y usan (o al menos se muestra que usan) la misma cantidad de memoria (realmente insignificante), incluso cuando el servidor está muriendo de carga: |
jayarjo
@jayarjo: ¿Cambia el número de procesos? ¿Tienes muchos más procesos? ¿Y es un servidor físico o virtual?
Raffael Luthiger
No he notado ningún cambio en el número de procesos. Básicamente, cuando hago la parte superior, mientras el servidor está muriendo de carga, veo una imagen muy similar a la que adjunté en la pregunta original, excepto la gran carga: | El servidor es físico.
jayarjo
2
Intente obtener más información con "vmstat" (por ejemplo, vmstat -s). O con la herramienta ya mencionada "sar". ¿Quizás tiene un sistema de archivos basado en RAM? Entonces, tal vez "iostat" puede dar más información también.
Raffael Luthiger
1
He estado en duda si el campo "pmem" (% MEM) en pso topsalida es lo correcto para mirar si se trata de detectar una pérdida de memoria: ¿no es este solo el porcentaje de la memoria física que el proceso está usando actualmente? Pero otras partes de la memoria utilizada (incluida la pérdida) del proceso pueden intercambiarse. ¿Quizás "tamaño" o "vsize" sería más apropiado para medir el tamaño de un proceso? Por ejemplo, ps -A --sort -size -o comm,size | head -n 11ops -A --sort -vsize -o comm,vsize | head -n 11
imz - Ivan Zakharyaschev
8

Nada está realmente usando esa memoria en términos de aplicaciones.

Debe deducir el valor 'en caché' que representa el caché de la página para tener una mejor idea de cuál es su uso real de memoria en términos de uso del programa.

Básicamente, esta es una buena administración de memoria y esto es idealmente lo que desea.

Vea el enlace aquí para más información: http://www.linuxatemyram.com/

Matthew Ife
fuente
Sí, encontré ese enlace y leí sobre buffers y cachés, pero por lo que pude obtener de lo que leí, no pueden causar el intercambio, ¿verdad?
jayarjo
@jayarjo Creo que para entender lo que sucede allí, necesitaríamos estadísticas que demuestren el problema. Los números que ha proporcionado no muestran intercambio o mucho uso de memoria real.
Matthew Ife
1

Realmente no soy un profesional en esto, pero el jabón líquido + icecast está relacionado con multimedia. Cuando el sistema es gratuito, almacena en caché y / u ocupa memoria para su uso futuro. Y si el tráfico aumenta en un momento determinado del día / durante un período de tiempo, comenzará a intercambiarse. En este punto, si aumentan las solicitudes (usuarios que ven contenido), los recursos necesarios serán más de 8 GB de RAM.

Yash
fuente