¿Cómo se vacían las memorias intermedias y el caché en un sistema Linux?


315

Antes de realizar un trabajo de evaluación comparativa, ¿cómo liberaría la memoria (RAM) que el kernel de Linux está consumiendo para sus memorias intermedias y caché?


Tenga en cuenta que esto es principalmente útil para la evaluación comparativa. ¡Vaciar las memorias intermedias y el caché reduce el rendimiento! Si estás aquí porque pensabas que liberar buffers y caché era algo positivo, ¡ve y lee que Linux se comió mi RAM! . La historia corta: la memoria libre es memoria no utilizada es memoria desperdiciada .


1
¿Cuál es el interés en open dup question y answer self? unix.stackexchange.com/questions/58553/… & unix.stackexchange.com/questions/17936/…
innocent-world

1
@ inocente en el mundo - nunca vio estos cuando yo estaba buscando, por lo que parecía ser un agujero en la base de conocimientos en este sitio, y estaba tratando de llenarlo.
SLM

2
@ innocent-world: al mirar esas 2 preguntas, creo que todavía hay espacio para estas preguntas y respuestas. Este actúa como un Q&A canónico en el sitio. Esos son bastante específicos en lo que están abordando. Además, este muestra información sobre el análisis de las memorias intermedias y la memoria caché y también sobre cómo configurar los parámetros usando sudo. Ninguna de las otras 2 preguntas aborda nada de esto.
slm

Lea este artículo linuxatemyram.com. Si comprende el riesgo, puede hacer && sync && echo 3> / proc / sys / vm / drop_caches && gratis

Respuestas:


491

Vaciar la memoria caché de búferes

Si alguna vez quieres vaciarlo, puedes usar esta cadena de comandos.

# free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

Puede indicar al kernel de Linux que deje caer varios aspectos de los elementos almacenados en caché cambiando el argumento numérico al comando anterior.

  • Para liberar pagecache:

    # echo 1 > /proc/sys/vm/drop_caches
    
  • Para liberar dentries e inodes:

    # echo 2 > /proc/sys/vm/drop_caches
    
  • Para liberar pagecache, dentries e inodes:

    # echo 3 > /proc/sys/vm/drop_caches
    

Lo anterior está destinado a ejecutarse como root. Si está tratando de hacerlos usando, sudoentonces necesitará cambiar la sintaxis ligeramente a algo como esto:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'

NOTA: Hay una versión más esotérica del comando anterior si te gusta eso:

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

¿Por qué el cambio en la sintaxis? El /bin/echoprograma se está ejecutando como root, sudopero el shell que está redirigiendo la salida de echo al archivo solo root sigue ejecutándose como usted. Su shell actual hace la redirección antes de sudo comenzar.

Ver lo que hay en las memorias intermedias y el caché

Eche un vistazo a linux-ftoolssi desea analizar el contenido de las memorias intermedias y el caché. Específicamente si desea ver qué archivos se almacenan actualmente en caché.

fincore

Con esta herramienta, puede ver qué archivos se almacenan en caché dentro de un directorio de donaciones.

fincore [options] files...

  --pages=false      Do not print pages
  --summarize        When comparing multiple files, print a summary report
  --only-cached      Only print stats for files that are actually in cache.

Por ejemplo /var/lib/mysql/blogindex:

root@xxxxxx:/var/lib/mysql/blogindex# fincore --pages=false --summarize --only-cached * 
stats for CLUSTER_LOG_2010_05_21.MYI: file size=93840384 , total pages=22910 , cached pages=1 , cached size=4096, cached perc=0.004365 
stats for CLUSTER_LOG_2010_05_22.MYI: file size=417792 , total pages=102 , cached pages=1 , cached size=4096, cached perc=0.980392 
stats for CLUSTER_LOG_2010_05_23.MYI: file size=826368 , total pages=201 , cached pages=1 , cached size=4096, cached perc=0.497512 
stats for CLUSTER_LOG_2010_05_24.MYI: file size=192512 , total pages=47 , cached pages=1 , cached size=4096, cached perc=2.127660 
stats for CLUSTER_LOG_2010_06_03.MYI: file size=345088 , total pages=84 , cached pages=43 , cached size=176128, cached perc=51.190476 
stats for CLUSTER_LOG_2010_06_04.MYD: file size=1478552 , total pages=360 , cached pages=97 , cached size=397312, cached perc=26.944444 
stats for CLUSTER_LOG_2010_06_04.MYI: file size=205824 , total pages=50 , cached pages=29 , cached size=118784, cached perc=58.000000 
stats for COMMENT_CONTENT_2010_06_03.MYI: file size=100051968 , total pages=24426 , cached pages=10253 , cached size=41996288, cached perc=41.975764 
stats for COMMENT_CONTENT_2010_06_04.MYD: file size=716369644 , total pages=174894 , cached pages=79821 , cached size=326946816, cached perc=45.639645 
stats for COMMENT_CONTENT_2010_06_04.MYI: file size=56832000 , total pages=13875 , cached pages=5365 , cached size=21975040, cached perc=38.666667 
stats for FEED_CONTENT_2010_06_03.MYI: file size=1001518080 , total pages=244511 , cached pages=98975 , cached size=405401600, cached perc=40.478751 
stats for FEED_CONTENT_2010_06_04.MYD: file size=9206385684 , total pages=2247652 , cached pages=1018661 , cached size=4172435456, cached perc=45.321117 
stats for FEED_CONTENT_2010_06_04.MYI: file size=638005248 , total pages=155763 , cached pages=52912 , cached size=216727552, cached perc=33.969556 
stats for FEED_CONTENT_2010_06_04.frm: file size=9840 , total pages=2 , cached pages=3 , cached size=12288, cached perc=150.000000 
stats for PERMALINK_CONTENT_2010_06_03.MYI: file size=1035290624 , total pages=252756 , cached pages=108563 , cached size=444674048, cached perc=42.951700 
stats for PERMALINK_CONTENT_2010_06_04.MYD: file size=55619712720 , total pages=13579031 , cached pages=6590322 , cached size=26993958912, cached perc=48.533080 
stats for PERMALINK_CONTENT_2010_06_04.MYI: file size=659397632 , total pages=160985 , cached pages=54304 , cached size=222429184, cached perc=33.732335 
stats for PERMALINK_CONTENT_2010_06_04.frm: file size=10156 , total pages=2 , cached pages=3 , cached size=12288, cached perc=150.000000 
---
total cached size: 32847278080

Con el resultado anterior, puede ver que hay varios archivos * .MYD, * .MYI y * .frm que se están almacenando en caché.

Intercambiar

Si desea borrar su intercambio, puede usar los siguientes comandos.

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7298164     689328          0      30416     457936
-/+ buffers/cache:    6809812    1177680
Swap:      5963772     609452    5354320

Luego use este comando para deshabilitar el intercambio:

$ swapoff -a

Puede confirmar que ahora está vacío:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7777912     209580          0      39332     489864
-/+ buffers/cache:    7248716     738776
Swap:            0          0          0

Y para volver a habilitarlo:

$ swapon -a

Y ahora reconfirme con free:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7785572     201920          0      41556     491508
-/+ buffers/cache:    7252508     734984
Swap:      5963772          0    5963772

13
Nunca había oído hablar de Linux-Ftools después de tantos años, aunque sabía cómo abandonar el caché. Eres realmente un gurú. ¡Gracias por compartir!
johnshen64

55
Las cosas que dice sobre la sincronización son incorrectas: según el documento de Linux, escribir en drop_cache solo borrará contenido limpio (ya sincronizado). Además, incluso si elimina datos no sincronizados, dice que escribir el comando de sincronización justo antes de borrar la memoria caché guardaría sus datos es incorrecto: hay un tiempo distinto de cero entre el comando de sincronización drop_cache write, por lo que cualquier información podría agregarse durante este lapso de tiempo. No hay nada atómico aquí.
Congelli501

3
Obtuve esa información aquí: kernel.org/doc/Documentation/sysctl/vm.txt - "Esta es una operación no destructiva y no liberará ningún objeto sucio". También dice que la sincronización podría usarse para aumentar el tamaño de la caché droped (para cachés de reescritura).
Congelli501

26
Prefiere "sudo sysctl vm.drop_caches = 1" sobre "sudo sh -c 'echo 1> / proc / sys / vm / drop_caches'"
Raúl Salinas-Monteagudo

8
@slm me gusta usar teepara escribir como root:echo 3 | sudo tee /proc/sys/vm/drop-caches
pqnet
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.