Wie leeren Sie die Puffer und den Cache auf einem Linux-System?

315

Wie kann man vor dem Benchmarking den Arbeitsspeicher (RAM) freigeben, den der Linux-Kernel für Puffer und Cache verbraucht?


Beachten Sie, dass dies vor allem für das Benchmarking nützlich ist. Das Leeren der Puffer und des Cache verringert die Leistung! Wenn Sie hier sind, weil Sie dachten, dass das Freigeben von Puffern und Cache eine positive Sache ist, lesen Sie, wie Linux meinen Arbeitsspeicher aufgefressen hat! . Die Kurzgeschichte: Freier Speicher ist ungenutzter Speicher ist verschwendeter Speicher.

slm
quelle
1
Was ist das Interesse an open dup question and answer self? unix.stackexchange.com/questions/58553/… & unix.stackexchange.com/questions/17936/…
unschuldige Welt
1
@ innocent-world - habe diese bei meiner Suche noch nie gesehen. Es schien sich also um eine Lücke in der Wissensdatenbank auf dieser Site zu handeln, und
ich habe
2
@ innocent-world - Wenn ich mir diese 2 Fragen ansehe, gibt es meiner Meinung nach immer noch Raum für diese Fragen und Antworten. Dieser fungiert als kanonische Q & A auf der Website. Diese sind ziemlich spezifisch in dem, was sie ansprechen. Zusätzlich werden Informationen zum Analysieren der Puffer und des Caches sowie zum Festlegen der Parameter mit sudo angezeigt. Keine der beiden anderen Fragen befasst sich mit irgendetwas davon.
SLM
Bitte lesen Sie diesen Artikel linuxatemyram.com Wenn Sie das Risiko verstehen, können Sie && sync && echo 3> / proc / sys / vm / drop_caches && free

Antworten:

491

Puffer-Cache leeren

Wenn Sie es jemals leeren möchten, können Sie diese Befehlskette verwenden.

# 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

Sie können dem Linux-Kernel signalisieren, verschiedene Aspekte von zwischengespeicherten Elementen zu löschen, indem Sie das numerische Argument in den obigen Befehl ändern.

  • So geben Sie den Pagecache frei:

    # echo 1 > /proc/sys/vm/drop_caches
    
  • So befreien Sie Einträge und Inodes:

    # echo 2 > /proc/sys/vm/drop_caches
    
  • So geben Sie Pagecache, Einträge und Inodes frei:

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

Die oben genannten sollen als root ausgeführt werden. Wenn Sie versuchen, sie zu verwenden, müssen sudoSie die Syntax leicht in etwas ändern:

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

ANMERKUNG: Es gibt eine esoterischere Version des obigen Befehls, wenn Sie dies möchten:

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

Warum die Syntaxänderung? Das /bin/echoProgramm wird aufgrund von als root ausgeführt, sudoaber die Shell, die die Ausgabe von echo in die reine root-Datei umleitet, wird weiterhin als Sie ausgeführt. Ihre aktuelle Shell führt die Umleitung durch, bevor sie sudo gestartet wird.

Anzeigen, was sich in den Puffern und im Cache befindet

Werfen Sie einen Blick darauf, linux-ftoolsob Sie den Inhalt der Puffer und des Caches analysieren möchten. Insbesondere, wenn Sie sehen möchten, welche Dateien gerade zwischengespeichert werden.

Fincore

Mit diesem Tool können Sie sehen, welche Dateien in einem give-Verzeichnis zwischengespeichert werden.

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.

Zum Beispiel /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

Mit der obigen Ausgabe können Sie feststellen, dass mehrere * .MYD-, * .MYI- und * .frm-Dateien im Cache gespeichert sind.

Wechsel

Wenn Sie Ihren Swap löschen möchten, können Sie die folgenden Befehle verwenden.

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

Verwenden Sie dann diesen Befehl, um den Tausch zu deaktivieren:

$ swapoff -a

Sie können bestätigen, dass es jetzt leer ist:

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

Und um es wieder zu aktivieren:

$ swapon -a

Und jetzt bestätigen Sie mit free:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7785572     201920          0      41556     491508
-/+ buffers/cache:    7252508     734984
Swap:      5963772          0    5963772
slm
quelle
13
Ich habe nach so vielen Jahren noch nie von Linux-Ftools gehört, obwohl ich wusste, wie man Cache löscht. Du bist wirklich ein Guru. Danke für das Teilen!
Johnshen64
5
Die Dinge, die Sie über die Synchronisierung sagen, sind falsch: Laut dem Linux-Dokument löscht das Schreiben in drop_cache nur bereinigten Inhalt (der bereits synchronisiert ist). Selbst wenn nicht synchronisierte Daten gelöscht werden und gesagt wird, dass die Eingabe des Synchronisierungsbefehls unmittelbar vor dem Löschen des Caches Ihre Daten speichern würde, ist dies falsch: Zwischen dem Schreiben des Synchronisierungsbefehls drop_cache liegt eine Zeit ungleich Null, sodass während dieser Zeitspanne alle Daten hinzugefügt werden können. Hier ist nichts atomar.
Congelli501
3
Ich habe diese Informationen hier: kernel.org/doc/Documentation/sysctl/vm.txt - "Dies ist eine zerstörungsfreie Operation und befreit keine schmutzigen Objekte." Es heißt auch, dass die Synchronisierung verwendet werden könnte, um die Größe des abgelegten Caches zu erhöhen (für Rückschreib-Caches).
Congelli501
26
Bevorzugen Sie "sudo sysctl vm.drop_caches = 1" gegenüber "sudo sh -c 'echo 1> / proc / sys / vm / drop_caches'"
Raúl Salinas-Monteagudo
8
@slm Ich benutze gerne tee, um als root zu schreiben:echo 3 | sudo tee /proc/sys/vm/drop-caches
pqnet