¿Por qué Linux no borra automáticamente los cachés?

¿Por qué Linux no borra automáticamente los cachés?

Fondo

Mi pregunta es básicamente una continuación de esto.preguntayrespuesta, y en particular, estecomentario.

Cada vez que tengo que copiar o sincronizar grandes cantidades de archivos, la memoria de mi sistema tiende a llenarse, así que ejecuto un script como este (como root):

while true ; do echo "syncing" && sync && echo 3 > /proc/sys/vm/drop_caches && echo "done" && sleep 60 ; done ;

Preguntas

  • ¿Podría esto dañar el sistema de alguna manera o causar algún efecto negativo? (En particular, ¿cuáles son los "riesgos" mencionados en el comentario al que se hace referencia?)
  • Si la respuesta es "no" (que es lo que sospecho), ¿por qué Linux no ejecuta este comando automáticamente de forma predeterminada? (No veo ningún cambio notable debido a esto, sólo noto que no me quedo sin memoria...)

Respuesta1

Porque nunca hay ningún beneficio en eliminar cachés. Olvidar cosas no es donde está la ganancia. La ganancia está en reutilizar la memoria, esto sucederá de todos modos. Como algunos datos puntuales serán desalojados de la memoria.

Sin embargo, realizar estos grandes trabajos puede perjudicar el rendimiento: si los datos se almacenan en caché, pero nunca se reutilizan, se provoca que otros datos sean desalojados, sin ningún beneficio.

Por lo tanto, debe ejecutar el trabajo sin almacenamiento en caché (desafortunadamente no recuerdo el comando para hacer esto).

Respuesta2

¿Por qué Linux no borra automáticamente los cachés?

Va a.

ron> free -g
             total       used       free     shared    buffers     cached
Mem:           504        415         88          1          0        352
-/+ buffers/cache:         62        441
Swap:            0          0          0

La memoria caché aún debe considerarse memoria libre.

Cuando free llegue a 0, se extraerá del caché.

¿Podría esto dañar el sistema de alguna manera o causar algún efecto negativo?

daño = no. Investiga echo 3 > /proc/sys/vm/drop_cachesy verás que es unno destructivooperación.

el efecto negativo sería la penalización en el rendimiento al tener que leer algo del disco que habría estado en la memoria caché. Por ejemplo, escriba un programa en C que lea un archivo de datos de 10 GB. La primera vez que se ejecute será lento porque se lee desde el disco, pero en cualquier momento posterior será mucho más rápido porque el archivo de datos está almacenado en caché en la memoria RAM. Elimine el caché y la siguiente ejecución del programa leyendo el archivo de datos será lenta como la primera vez que se ejecutó. Esto es fácilmente observable y repetible.

Si la respuesta es no, ¿por qué Linux no ejecuta este comando automáticamente de forma predeterminada?

Tendrías que explicar cómo y dónde ves que esto sucede. No lo sé en Linux actual como RHEL/CentOS 7.7. Pero en Linux más antiguos (como el kernel anterior a 3.x), es posible que haya sido una decisión tomada por esa distribución cuando el almacenamiento en caché no era tan sólido como lo es ahora (en mi opinión). Usando SLES 11.4 hace unos años, estoy bastante seguro de que la gente de SuSE no escribía código para que esa caída de caché ocurriera automáticamente, pero para algunos servidores de trabajo tenía a la gente a la que se los compramos y configuré SLES para nosotros en ese momento hizo un crontab. para realizar almacenamiento en caché periódico, por lo que es una especie de área gris en cuanto a por qué se hace. Sospecho que es una mentalidad de limpieza = buena y como nunca es una orden destructiva, realmente no puede hacer daño. Las pocas veces que lo hice manualmente echo 3 > drop_cachesen sles 11.4 fueron para solucionar problemas, ya que nunca resolvió nada que finalmente fuera necesario reiniciar.

Consulte la guía de ajuste del rendimiento de RHEL y el ajuste de la memoria virtual. No sé cuánto de esto es específico de RHEL versus un nivel lo suficientemente bajo como para estar todo relacionado con el kernel de Linux y no específico de una distribución de Linux. También lo que ha cambiado del kernel 2.6 a 3.xa 4.x, lo cual estoy seguro es significativo en este sentido, así que considere leer las notas de la versión del kernel de Linux.

información relacionada