Como você esvazia os buffers e o cache em um sistema Linux?

315

Antes de fazer algum trabalho de benchmarking, como liberar a memória (RAM) que o Kernel Linux está consumindo para seus buffers e cache?


Observe que isso é útil principalmente para benchmarking. Esvaziar os buffers e o cache reduz o desempenho! Se você está aqui porque pensou que liberar buffers e cache era uma coisa positiva, leia o Linux comeu minha RAM! . A história curta: memória livre é memória não utilizada é memória desperdiçada .

slm
fonte
1
Qual é o interesse na pergunta aberta do dup e na resposta a si próprio? unix.stackexchange.com/questions/58553/… & unix.stackexchange.com/questions/17936/…
innocent-world
1
@ inocente do mundo - nunca vi estes quando eu estava procurando, por isso parecia ser um buraco na base de conhecimentos sobre este site, e estava tentando preenchê-lo.
SLM
2
@ mundo inocente - ao olhar para esses 2 Q's, acho que ainda há espaço para essas perguntas e respostas. Este atua como uma sessão de perguntas e respostas canônicas no site. Esses são bastante específicos no que estão abordando. Além disso, este mostra informações sobre a análise de buffers e cache e também como definir os parâmetros usando o sudo. Nenhuma das outras 2 perguntas aborda nada disso.
slm
Por favor, leia este artigo linuxatemyram.com Se você entender o risco, então você pode fazer livre && sync && echo 3> / proc / sys / vm / drop_caches && livre

Respostas:

491

Esvaziando o cache de buffers

Se você quiser esvaziá-lo, poderá usar esta cadeia 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

Você pode sinalizar ao Kernel do Linux para descartar vários aspectos dos itens em cache, alterando o argumento numérico para o comando acima.

  • 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
    

Os itens acima devem ser executados como root. Se você estiver tentando fazê-los usando sudo, precisará alterar a sintaxe ligeiramente para algo como estes:

$ 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: Existe uma versão mais esotérica do comando acima, se você preferir:

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

Por que a mudança na sintaxe? O /bin/echoprograma está sendo executado como root, sudomas o shell que está redirecionando a saída do eco para o arquivo somente raiz ainda está sendo executado como você. Seu shell atual faz o redirecionamento antes do sudo início.

Vendo o que há nos buffers e no cache

Dê uma olhada linux-ftoolsse você deseja analisar o conteúdo dos buffers e cache. Especificamente, se você deseja ver quais arquivos estão sendo armazenados em cache no momento.

fincore

Com esta ferramenta, você pode ver quais arquivos estão sendo armazenados em cache dentro de um diretório give.

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 exemplo /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

Com a saída acima, você pode ver que existem vários arquivos * .MYD, * .MYI e * .frm que estão sendo armazenados em cache no momento.

Troca

Se você deseja limpar sua troca, pode usar os seguintes comandos.

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

Em seguida, use este comando para desativar a troca:

$ swapoff -a

Você pode confirmar que agora está vazio:

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

E para reativá-lo:

$ swapon -a

E agora reconfirme com free:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7785572     201920          0      41556     491508
-/+ buffers/cache:    7252508     734984
Swap:      5963772          0    5963772
slm
fonte
13
nunca ouvi falar de linux-ftools depois de tantos anos, apesar de saber como eliminar o cache. você é realmente um guru. Obrigado por compartilhar!
precisa saber é o seguinte
5
As coisas que você diz sobre sincronização estão erradas: de acordo com o documento linux, gravar em drop_cache apenas limpará o conteúdo limpo (já sincronizado). Além disso, mesmo que ele solte dados não sincronizados, dizer que digitar o comando sync imediatamente antes de limpar o cache salvaria seus dados está errado: há um tempo diferente de zero entre o comando sync drop_cache write e, portanto, qualquer dado pode ser adicionado durante esse lapso de tempo. Não há nada atômico aqui.
Congelli501
3
Eu obtive essas informações aqui: kernel.org/doc/Documentation/sysctl/vm.txt - "Esta é uma operação não destrutiva e não liberará nenhum objeto sujo". Ele também diz que a sincronização pode ser usada para aumentar o tamanho do cache descartado (para caches de write-back).
Congelli501
26
Prefere "sudo sysctl vm.drop_caches = 1" over "sudo sh -c 'echo 1> / proc / sys / vm / drop_caches'"
Raúl Salinas-Monteagudo
8
@slm eu gosto de usar teepara escrever como root:echo 3 | sudo tee /proc/sys/vm/drop-caches
pqnet