Pregunta ¿Por qué soltar cachés en Linux?


En nuestros servidores tenemos el hábito de soltar cachés a medianoche.

sync; echo 3 > /proc/sys/vm/drop_caches

Cuando ejecuto el código parece liberar mucha memoria RAM, pero realmente necesito hacer eso. ¿No es la memoria RAM libre un desperdicio?


81
2018-05-20 03:12


origen


Encuentra a la persona que puso esto y pregúntale por qué lo hizo. Como bien adivinaste, no hay una buena razón obvia para ello. - Michael Hampton♦
Depurando el kernel. Eso es todo. Esto no libera realmente ninguna RAM; deja caer las cachés, como su nombre indica, y por lo tanto reduce el rendimiento. - Michael Hampton♦
@ivcode Luego, debe encontrar y solucionar el problema con ese servidor en lugar de intentar evitar las condiciones que lo causan. Si mi automóvil se atasca cada vez que hago un giro brusco a la derecha, evitar los giros bruscos a la derecha es una mala solución. - David Schwartz
Relacionado thedailywtf.com/Articles/Modern-Memory-Management.aspx Argumentando fuertemente que es una mala idea. - Drunix
Relacionado, y una descripción útil del "problema": linuxatemyram.com - Bill Weiss


Respuestas:


Eres 100% correcto. Es no Una buena práctica para liberar RAM. Este es probablemente un ejemplo de la administración del sistema de culto de carga.


85
2018-05-20 04:59



+1 por mencionar la Administración del Sistema de Culto de Carga. Cualquier administrador de sistemas que no sepa ese término y lo que significa debe ser despedido. - Tonny
@Tonny: Nos quedaríamos sin el departamento de administrador de sistemas y luego :( - PlasmaHH
Como la mayoría de la humanidad, me encantan las aseveraciones tersas y temerarias con mucha aprobación, pero una cita o un razonamiento obtendrían el +1 de mi superyó. - Aaron Hall
Explique la administración del culto a la carga, así como lo anterior, si no le importa. Tal vez en una edición de seguimiento? Todavía estoy reteniendo mi +1 ...: P - Aaron Hall
"es posible que a pesar de que su aplicación no esté utilizando estos RAM, pero Linux esté almacenando en caché de forma agresiva en su memoria y aunque la aplicación necesite memoria, no liberará parte de este caché, sino que preferirá comenzar a intercambiar". No muy específico. En la práctica, la gestión de la memoria no es perfecta, y tener una perilla para girar cuando aparece esa imperfección es algo bueno. - Dan Pritts


Sí, borrar la memoria caché liberará RAM, pero hace que el kernel busque archivos en el disco en lugar de en la memoria caché, lo que puede causar problemas de rendimiento.

Normalmente, el núcleo borrará el caché cuando se agote la RAM disponible. Con frecuencia escribe contenido sucio en el disco utilizando pdflush.


62
2018-05-20 06:26



+1 por explicar por qué es una mala idea. - Ogre Psalm33


La razón para eliminar cachés como esta es para comparar el rendimiento del disco, y es la única razón por la que existe.

Cuando se ejecuta un banco de pruebas con uso intensivo de E / S, desea asegurarse de que las distintas configuraciones que intenta son las que realmente hacen E / S de disco, por lo que Linux le permite soltar cachés en lugar de hacer un reinicio completo.

Para citar de la documentación:

Este archivo no es un medio para controlar el crecimiento de varios kernel   cachés (inodes, dentries, pagecache, etc ...) Estos objetos son   Reclamado automáticamente por el kernel cuando se necesita memoria en otro lugar.   en el sistema

El uso de este archivo puede causar problemas de rendimiento. Ya que se desecha   objetos almacenados en caché, puede costar una cantidad significativa de E / S y CPU para   recrear los objetos caídos, especialmente si estaban bajo uso pesado.   Debido a esto, el uso fuera de un entorno de prueba o depuración es   no recomendado.


34
2018-05-20 13:51



Por supuesto, dependiendo de lo que esté intentando hacer, incluso un reinicio completo podría no borrar la memoria caché del disco. - α CVn
"estos objetos son reclamados automáticamente por el kernel cuando se necesita memoria" es el objetivo del diseño, pero puede que no siempre sea el comportamiento real. - Dan Pritts
@DanPritts ¿Qué te hace pensar que no es así? - Joe
El caso obvio es cuando se desea borrar la RAM para permitir la asignación de más páginas de mensajes (no parentales); Otro caso es transparente. Errores de pausa en la recolección de basura (vea mi respuesta / comentarios en esta pregunta). Pero mi comentario fue destinado al caso general. A veces las personas que operan el sistema saben mejor que las personas que lo diseñaron o implementaron. A menudo, no, es contra lo que tratan de protegerse sus comentarios. Me alegro de que el - Dan Pritts


La idea básica aquí probablemente no es tan mala (simplemente muy ingenua y engañosa): es posible que haya archivos en caché, a los que es muy poco probable que se acceda en un futuro cercano, por ejemplo, los archivos de registro. Estos ram "se comen", que luego deberán ser liberados cuando sea necesario por el sistema operativo de una u otra forma.

Dependiendo de la configuración de swappiness, patrón de acceso a archivos, patrón de asignación de memoria y muchas más cosas impredecibles, puede suceder que cuando no libere estos cachés, más tarde será forzado a ser reutilizado, lo que lleva un poco más de tiempo que asignación de memoria desde el conjunto de memoria no utilizada. En el peor de los casos, la configuración de swappiness de linux hará que la memoria del programa se intercambie, porque linux cree que es más probable que esos archivos se usen en un futuro cercano que la memoria del programa.

En mi entorno, Linux suele equivocarse, y al comienzo de la mayoría de las bolsas de valores de Europa (alrededor de las 0900 hora local), los servidores comenzarán a hacer las cosas que hacen solo una vez al día, necesitando intercambiar la memoria que previamente se había intercambiado porque la escritura Los archivos de registro, comprimiéndolos, copiándolos, etc. estaban llenando el caché hasta el punto en que las cosas tenían que ser intercambiadas.

Pero, ¿es la eliminación de cachés la solución a este problema? Definitivamente no. La solución aquí sería decirle a linux lo que no sabe: es probable que estos archivos ya no se utilicen. Esto se puede hacer mediante la aplicación de escritura usando cosas como posix_fadvise()o usando una herramienta de línea cmd como vmtouch (que también se puede utilizar para ver cosas así como archivos de caché).

De esa manera, puede eliminar los datos que ya no son necesarios de las memorias caché y mantener las cosas que deberían almacenarse en la memoria caché, ya que cuando se eliminan todas las memorias caché, es necesario volver a leer muchas cosas del disco. Y eso en el peor momento posible: cuando se necesita; causando retrasos en su aplicación que son notables y, a menudo, inaceptables.

Lo que debe tener en su lugar es un sistema que supervise los patrones de uso de la memoria (por ejemplo, si se está intercambiando algo) y luego los analice en consecuencia y actúe en consecuencia. La solución podría ser desalojar algunos archivos grandes al final del día usando vtouch; También podría ser agregar más ram porque el uso máximo diario del servidor es solo eso.


25
2018-05-20 19:46



Todas las aplicaciones en mi servidor se ejecutan en nohup. Tal vez nohup.out está siendo almacenado en caché y devorando memoria? - ivcode
@ivcode: Esto podría ser una razón, verifique qué tan grande es nohup.out. Tal vez use vmtouch para averiguar cuánto se almacena en caché. - PlasmaHH
Tengo un trabajo cron para cat /dev/null > path/nohup.out en cada 15 minutos como nohup.out está creciendo rápidamente. Tal vez Linux está almacenando en caché nohup.out incluso si lo estoy borrando - ivcode
@ivcode Si no necesita la salida de nohup deberías redirigirlo a /dev/null. Parece que en algún momento tenías algunos administradores de sistemas sin experiencia trabajando en tus sistemas. Ver stackoverflow.com/questions/10408816/… para saber cómo dirigir nohupsalida a /dev/null - David Wilkins
aunque nohup.out se borra en intervalos de 15 minutos, si el proceso de las aplicaciones se cancela por algún motivo, nohup.out se realizará automáticamente una copia de seguridad de otro script. probé vmtouch Es una muy buena herramienta - ivcode


He visto que los cachés de caída son útiles al iniciar un grupo de máquinas virtuales. O cualquier otra cosa que use páginas grandes, como algunos servidores de bases de datos.

Las páginas grandes en Linux a menudo necesitan desfragmentar la RAM para encontrar 2 MB de RAM física contigua para colocar en una página. Liberar todo el caché de archivos hace que este proceso sea muy fácil.

Pero estoy de acuerdo con la mayoría de las otras respuestas en que no hay una razón generalmente buena para eliminar el caché de archivos todas las noches.


16
2018-05-22 00:47



Upvote por señalar prejuicio de segundo orden es respuestas a caer cachés. - Noah Spurrier
Además, en aplicaciones HPC en nodos de memoria alta (1Tb), la lectura de unos pocos archivos grandes da como resultado una gran cantidad de memoria almacenada en caché. Debido a que muchas aplicaciones de HPC realizan cientos de GB de malloc, el sistema puede demorarse durante horas a medida que los procesos de migración mueven diminutos trozos de memoria fragmentada infructuosamente a través de los nodos NUMA una vez que el sistema alcanza el "borde" de la memoria caché. Peor aún, nada puede hacer en la zona de usuario para liberar los cachés, excepto engañar al sistema para que asigne todos los pequeños bloques de 2 MB que puede liberar al mismo tiempo, lo que permite desfragmentar y las aplicaciones se ejecutan normalmente. - user1649948
+1 El comando para crear páginas grandes (sysctl -w vm.nr_hugepages=...) se niega a trabajar incluso a menos que primero suelte cachés (Arch linux). - Aleksandr Dubinsky


Es posible que esto se instituyera como una forma de estabilizar el sistema cuando no había nadie con las habilidades o la experiencia para encontrar el problema.

Liberar recursos

Bajar cachés esencialmente liberará algunos recursos, pero esto tiene el efecto secundario de hacer que el sistema trabaje más duro para hacer lo que está tratando de hacer. Si el sistema está cambiando (intentando leer y escribir desde una partición de intercambio de disco más rápido de lo que realmente es capaz), el hecho de eliminar cachés periódicamente puede facilitar la síntoma, pero no hace nada para curar la porque.

¿Qué es comer memoria?

Debe determinar qué está causando una gran cantidad de consumo de memoria que hace que la eliminación de cachés parezca funcionar. Esto puede ser causado por cualquier número de procesos de servidor mal configurados o simplemente mal utilizados. Por ejemplo, en un servidor presencié la utilización máxima de memoria cuando un sitio web de Magento alcanzó un cierto número de visitantes dentro de un intervalo de 15 minutos. Esto terminó siendo causado por la configuración de Apache para permitir que muchos procesos se ejecuten simultáneamente. Demasiados procesos, usando mucha memoria (Magento es a veces una bestia) = intercambio.

Línea de fondo

No asuma simplemente que es algo que es necesario. Sea proactivo para averiguar por qué está allí, tenga las agallas para deshabilitarlo si otros sugieren que está mal, y observe el sistema: aprenda cuál es el problema real y corríjalo.


8
2018-05-20 15:16





Linux / m68k en realidad tiene un error en el kernel que hace que kswapd se vuelva loco y consuma el 100% de la CPU (50% si hay alguna otra tarea vinculada a la CPU, como un autocompilador de paquetes binarios de Debian - vulgo buildd - en ejecución ya), que puede (la mayoría de la época; no siempre) mitigarse ejecutando este comando en particular cada pocas horas.

Dicho esto ... lo más probable es que su servidor no sea un sistema m68k (Atari, Amiga, Classic Macintosh, VME, Q40 / Q60, Sun3) ;-)

En este caso, la persona que puso las líneas siguió un consejo cuestionable o, en el mejor de los casos, anticuado, o tuvo una idea de cómo se debe usar incorrectamente la RAM (el pensamiento moderno dice que "la RAM libre es una RAM desperdiciada" y sugiere almacenamiento en caché) , o "descubrió" que esto "arregla" [¡sic!] otro problema en otro lugar (y era demasiado perezoso para buscar una solución adecuada).


4
2018-05-21 08:03



"un error del kernel que hace que kswapd se vuelva loco" - ¿Qué error es este? - Ben
@Ben ver este hilo (este mensaje y un par de seguimientos, uno de los cuales incluye una conjetura de dónde podría provenir) - mirabilos
Estoy experimentando un problema similar (aunque es x86_64) y la única solución en este momento es eliminar cachés serverfault.com/questions/740790/… - Fernando
@Fernando también tengo un cronjob de "colocar cachés" en el cuadro m68k - mirabilos