¿Por qué Linux purga la memoria caché cuando está casi llena?

14

Así es como se ve el gráfico de memoria en un VPS que ejecuta CentOS con 512 MB de RAM y contenido nginx / php-fpm / mysqld (principalmente estático) para un par de miles de visitantes por día.

Gráfico de memoria semanal

(esos son días en el eje x)

Como puede ver, es bastante nervioso en el área de caché y búfer. La memoria caché se purga a intervalos irregulares (descartando un trabajo cron responsable). Por lo general, pero no siempre, se purga en el punto donde no puede crecer más. A veces se borra casi por completo, otras veces solo a la mitad.

Estoy tratando de entender la lógica detrás de estas purgas. Esperaría que los datos del archivo se almacenen en caché mucho más tiempo y no veo ningún otro programa que use más memoria de lo habitual cuando se borra la memoria caché.

¿Es este comportamiento normal o me falta algo?

ACTUALIZACIÓN: Una actualización de memoria parece haber estabilizado el gráfico. Todavía veo pequeñas caídas, pero en ningún lugar tan significativo como antes de la actualización.

Después de la actualización de memoria

Redburn
fuente
¿Es este un contenedor OpenVZ / Virtuozzo o una VM real como XEN o KVM?
jordanm
1
No puedo explicar cuáles son, pero tengo un VPS que muestra el mismo comportamiento. dl.dropbox.com/u/1578899/memory-week.png
EightBitTony el
@jordanm Es una máquina virtual basada en Xen.
Redburn
@EightBitTony Gracias por compartir. El tuyo se ve un poco más 'natural', pero veo claramente un patrón similar (pero quizás más predecible) de caídas en la memoria caché.
Redburn
Me preguntaba si Munin 2 estaba graficando / recolectando los datos de manera lo suficientemente diferente como para dar lugar a algunas de las diferencias (gráfico más suave en el suyo), pero incluso el mío muestra una caída en la mitad de un ciclo en lugar de a diario. Es extraño, seguro.
EightBitTony

Respuestas:

3

Podrían ser muchas cosas. Tal vez uno de los programas que está ejecutando utiliza ocasionalmente y brevemente mucha RAM. Si eso es realmente semanas en el eje x, debe muestrear a una resolución mucho más alta (por ejemplo, una vez por minuto o incluso un segundo) para obtener más información sobre lo que está sucediendo que está causando la caída de la memoria caché. psy la topsalida (incluido el promedio de carga) durante ese tiempo también sería útil.

Jim Paris
fuente
Sí, supongo que podríamos teorizar que una ráfaga muy corta y repentina en el uso de la memoria que ocurre en un minuto más o menos, y que Munin no detecta, podría volcar el caché, que por supuesto, se detecta porque persiste.
EightBitTony
El encabezado es un poco confuso, ya que en realidad muestra una semana de datos, por lo que esos son días en la x-as, no semanas. En cuanto a la frecuencia de sondeo: Munin obtiene datos cada 5 minutos, y no creo que esa frecuencia pueda modificarse. Solo estoy ejecutando nginx, mysql, php-fpm y munin-node. ¿Puede tener algo que ver con el caché mysql, tal vez?
Redburn
Hice que Top (ordenado por uso de memoria) escribiera su salida en un archivo cada 5 segundos, luego analicé ese archivo y no encontré ningún proceso que mostrara un comportamiento inusual en el punto donde la memoria caché cayó repentinamente. A menos que un proceso pueda usar tanta memoria y aún así escapar de esa ventana de 5 segundos, no estoy convencido de que esta pueda ser la causa. Pero si no hay procesos en ejecución, ¿cuál podría ser?
Redburn
Este hilo es un poco rancio, pero una observación rápida sobre la metodología: cuánto contribuye un proceso a la memoria caché de la memoria del sistema no se reflejará (fácilmente) en la parte superior , ya que un proceso muy activo puede acumular cosas en la memoria caché muy rápidamente sin la suya propia. memoria asignada aumentando mucho. Por ejemplo, leer un archivo muy grande en pequeños fragmentos para la transmisión, mientras que el proceso puede que nunca use más de unos pocos MB asignados , esos pocos MB cambiarán constantemente y acumularán referencias en el caché. Entonces, lo que hay que ver en la salida superior sería una acumulación repentina de tiempo de CPU.
Ricitos de oro
También te puede interesar esto: cognitivedissonance.ca/cogware/plog
goldilocks
2

Una posible razón sería un archivo en crecimiento, como un registro, que se elimina, comprime o envía a otro lugar cuando alcanza un tamaño determinado.

En cualquier caso, su tamaño en caché, posiblemente todo si no hay presión de memoria en su sistema operativo, se liberaría de la caché tan pronto como se elimine el archivo original.

jlliagre
fuente
Una idea interesante, pero los archivos de registro más activos rara vez superan un tamaño de archivo de 25 MB antes de que se roten, y el uso de caché / búfer tiende a disminuir en unos 200 MB.
Redburn