Jak opróżniasz bufory i pamięć podręczną w systemie Linux?

315

W jaki sposób przed zwolnieniem pamięci (RAM) zużywanej przez jądro Linuksa na jego bufory i pamięć podręczną?


Pamiętaj, że jest to szczególnie przydatne w testach porównawczych. Opróżnianie buforów i pamięci podręcznej zmniejsza wydajność! Jeśli jesteś tutaj, ponieważ myślałeś, że zwolnienie buforów i pamięci podręcznej było czymś pozytywnym, idź i przeczytaj Linux zjadł moją pamięć RAM! . Krótka historia: wolna pamięć to niewykorzystana pamięć to zmarnowana pamięć.

slm
źródło
1
Jakie jest zainteresowanie otwartym pytaniem i odpowiedzią na siebie? unix.stackexchange.com/questions/58553 / ... & unix.stackexchange.com/questions/17936/…
innocent-world
1
@ innocent-world - nigdy ich nie widziałem, kiedy szukałem, więc wyglądało to na dziurę w bazie wiedzy na tej stronie i próbowałem ją wypełnić.
slm
2
@ innocent-world - patrząc na te 2 pytania myślę, że wciąż jest miejsce na te pytania i odpowiedzi. Ten działa jako kanoniczne pytania i odpowiedzi na stronie. Są one dość szczegółowe w tym, do czego się odnoszą. Dodatkowo ten pokazuje informacje o analizie buforów i pamięci podręcznej, a także jak ustawić parametry za pomocą sudo. Żadne z pozostałych 2 pytań nie rozwiązuje żadnego z tych problemów.
slm
Przeczytaj ten artykuł linuxatemyram.com Jeśli rozumiesz ryzyko, możesz zrobić bezpłatnie && sync && echo 3> / proc / sys / vm / drop_caches && free

Odpowiedzi:

491

Opróżnianie pamięci podręcznej buforów

Jeśli kiedykolwiek chcesz go opróżnić, możesz użyć tego łańcucha poleceń.

# 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

Możesz zasygnalizować, że jądro Linux wyrzuci różne aspekty buforowanych elementów, zmieniając argument numeryczny na powyższe polecenie.

  • Aby zwolnić pamięć podręczną:

    # echo 1 > /proc/sys/vm/drop_caches
    
  • Aby uwolnić dentries i i-węzły:

    # echo 2 > /proc/sys/vm/drop_caches
    
  • Aby zwolnić pamięć podręczną, dentries i i-węzły:

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

Powyższe mają być uruchamiane jako root. Jeśli próbujesz to zrobić sudo, musisz nieco zmienić składnię na coś takiego:

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

UWAGA: Istnieje bardziej ezoteryczna wersja powyższego polecenia, jeśli jesteś w to zaangażowany:

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

Dlaczego zmiana składni? Z tego /bin/echopowodu program działa jako root, sudoale powłoka przekierowująca dane wyjściowe echa do pliku zawierającego tylko root nadal działa jako użytkownik. Twoja bieżąca powłoka dokonuje przekierowania przed uruchomieniem sudo.

Sprawdzanie zawartości buforów i pamięci podręcznej

Sprawdź, linux-ftoolsczy chcesz przeanalizować zawartość buforów i pamięci podręcznej. W szczególności, jeśli chcesz zobaczyć, które pliki są obecnie buforowane.

fincore

Dzięki temu narzędziu możesz zobaczyć, które pliki są buforowane w danym katalogu.

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.

Na przykład /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

Z powyższych danych wyjściowych widać, że obecnie jest buforowanych kilka plików * .MYD, * .MYI i * .frm.

Zamiana

Jeśli chcesz wyczyścić swap, możesz użyć następujących poleceń.

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

Następnie użyj tego polecenia, aby wyłączyć zamianę:

$ swapoff -a

Możesz potwierdzić, że jest teraz pusty:

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

Aby ponownie włączyć:

$ swapon -a

A teraz potwierdź free:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7785572     201920          0      41556     491508
-/+ buffers/cache:    7252508     734984
Swap:      5963772          0    5963772
slm
źródło
13
nigdy nie słyszałem o linux-ftools po tylu latach, chociaż wiedziałem, jak upuścić pamięć podręczną. jesteś naprawdę guru. Dzięki za udostępnienie!
johnshen64
5
To, co mówisz o synchronizacji, jest złe: zgodnie z linux doc zapisanie do drop_cache wyczyści tylko czystą zawartość (już zsynchronizowaną). Poza tym, nawet jeśli upuszcza niezsynchronizowane dane, powiedzenie, że wpisanie polecenia synchronizacji tuż przed wyczyszczeniem pamięci podręcznej uratowałoby dane, jest błędne: między poleceniem synchronizacji zapisywania drop_cache jest niezerowy czas, więc w tym czasie można dodać dowolne dane. Nie ma tu nic atomowego.
Congelli501,
3
Mam tę informację tutaj: kernel.org/doc/Documentation/sysctl/vm.txt - „To jest nieniszcząca operacja i nie uwolni żadnych brudnych przedmiotów.”. Mówi także, że synchronizacji można użyć do zwiększenia wielkości upuszczonej pamięci podręcznej (w przypadku pamięci podręcznych z zapisem).
Congelli501
26
Wolę „sudo sysctl vm.drop_caches = 1” nad „sudo sh -c 'echo 1> / proc / sys / vm / drop_caches'”
Raúl Salinas-Monteagudo
8
@slm Lubię używać teedo zapisu jako root:echo 3 | sudo tee /proc/sys/vm/drop-caches
pqnet