Comment vider les tampons et le cache sur un système Linux?

314

Avant de procéder à des analyses comparatives, comment libérer la mémoire (RAM) consommée par le noyau Linux pour ses mémoires tampons et son cache?


Notez que cela est surtout utile pour l'analyse comparative. Vider les tampons et le cache réduit les performances! Si vous êtes ici parce que vous pensiez que la libération des mémoires tampons et du cache était une chose positive, allez lire Linux a mangé ma RAM! . La nouvelle: la mémoire libre est une mémoire inutilisée est une mémoire perdue .

slm
la source
1
Quel est l'intérêt de la question ouverte dup et de sa propre réponse? unix.stackexchange.com/questions/58553/… & unix.stackexchange.com/questions/17936/…
innocent-world
1
@ innocent-world - Je ne les ai jamais vues lorsque je cherchais. Cela semblait donc être un trou dans la base de connaissances de ce site.
J'essayais donc
2
@ innocent-world - en regardant ces 2 questions, je pense qu'il y a encore de la place pour ce Q & A. Celui-ci agit comme une question canonique sur le site. Ceux-ci sont assez spécifiques dans ce qu'ils abordent. De plus, celui-ci affiche des informations sur l'analyse des mémoires tampons et du cache, ainsi que sur la définition des paramètres à l'aide de sudo. Aucune des deux autres questions ne répond à cela.
slm
Veuillez lire cet article linuxatemyram.com Si vous comprenez le risque, vous pouvez faire gratuitement && sync && echo 3> / proc / sys / vm / drop_caches && free

Réponses:

490

Vider le cache des tampons

Si jamais vous voulez le vider, vous pouvez utiliser cette chaîne de commandes.

# 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

Vous pouvez indiquer au noyau Linux de supprimer divers aspects des éléments mis en cache en modifiant l'argument numérique de la commande ci-dessus.

  • Pour libérer pagecache:

    # echo 1 > /proc/sys/vm/drop_caches
    
  • Pour libérer les dentiers et les inodes:

    # echo 2 > /proc/sys/vm/drop_caches
    
  • Pour libérer pagecache, dentries et inodes:

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

Ce qui précède est destiné à être exécuté en tant que root. Si vous essayez de les utiliser en utilisant sudoalors vous devrez changer légèrement la syntaxe en quelque chose comme ceci:

$ 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'

NOTE: Il existe une version plus ésotérique de la commande ci-dessus si vous aimez ça:

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

Pourquoi ce changement de syntaxe? Le /bin/echoprogramme s'exécute en tant que root, sudomais le shell qui redirige la sortie de l'écho vers le fichier root ne fonctionne toujours pas. Votre shell actuel effectue la redirection avant de sudo commencer.

Voir ce qu'il y a dans les tampons et le cache

Examinez linux-ftoolssi vous souhaitez analyser le contenu des mémoires tampons et du cache. Spécifiquement si vous voulez voir quels fichiers sont actuellement mis en cache.

fincore

Avec cet outil, vous pouvez voir quels fichiers sont mis en cache dans un répertoire donné.

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.

Par exemple /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

Avec la sortie ci-dessus, vous pouvez voir qu'il y a plusieurs fichiers * .MYD, * .MYI et * .frm en cours de mise en cache.

Échanger

Si vous souhaitez effacer votre échange, vous pouvez utiliser les commandes suivantes.

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

Ensuite, utilisez cette commande pour désactiver le swap:

$ swapoff -a

Vous pouvez confirmer qu'il est maintenant vide:

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

Et pour le réactiver:

$ swapon -a

Et maintenant reconfirmer avec free:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7785572     201920          0      41556     491508
-/+ buffers/cache:    7252508     734984
Swap:      5963772          0    5963772
slm
la source
13
Je n'ai jamais entendu parler de linux-ftools après tant d'années, même si je savais comment supprimer le cache. tu es vraiment un gourou. Merci d'avoir partagé!
johnshen64
5
Ce que vous dites à propos de la synchronisation est faux: selon le doc de Linux, écrire dans drop_cache effacera uniquement le contenu épuré (déjà synchronisé). De plus, même si les données non synchronisées sont supprimées, il est erroné de taper la commande sync juste avant d'effacer le cache, car vos données sont erronées: l'intervalle de temps entre la commande sync drop_cache write est différent de zéro et toutes les données peuvent être ajoutées pendant ce laps de temps. Il n'y a rien d'atome ici.
Congelli501
3
J'ai eu cette information ici: kernel.org/doc/Documentation/sysctl/vm.txt - "Ceci est une opération non destructive et ne libérera aucun objet sale.". Il indique également que la synchronisation pourrait être utilisée pour augmenter la taille du cache supprimé (pour les caches en écriture).
Congelli501
26
Préférez "sudo sysctl vm.drop_caches = 1" à "sudo sh -c 'echo 1> / proc / sys / vm / drop_caches'"
Raúl Salinas-Monteagudo le
8
@slm j'aime utiliser teepour écrire en tant que root:echo 3 | sudo tee /proc/sys/vm/drop-caches
pqnet