Neste post, vou mostrar como usar algumas ferramentas de linha de comando para escoar o cache da memória RAM.
O objetivo deste post é dar aos iniciantes um pouco mais de conhecimento sobre gerenciamento de memória no Linux e alguns comandos para gestão do sistema de cache.
Em que casos é necessário limpar a memória cache do meu sistema?
Em duas palavras: quase nunca.
O sistema já tem um excelente gerenciamento de memória e a tendência é sempre aproveitar toda a quantidade de memória disponível no seu computador ou smartphone, caso você esteja usando o Android.
A função do caching é tornar o sistema mais veloz, na medida em que ele mantém sempre à mão as informações mais requisitadas. O Linux é extremamente eficiente nisto e não há por que “se meter” neste processo e fazer o trabalho “manualmente”.
Em alguns casos, contudo, o processo de escoamento do cache pode ser útil.
Ao transferir arquivos muito volumosos (vídeos, por exemplo) do seu HD para um pendrive ou um HD externo, conectado na entrada USB, o Linux usa muito o sistema de caching, como sistema intermediário de armazenamento.
O motivo de o Linux usar intensivamente o caching é que o seu dispositivo interno transfere os dados muito mais rápido do que os dispositivos externos conseguem absorver.
Este é um dos motivos para você não conseguir desmontar/ejetar um pendrive ou qualquer outro dispositivo conectado — por que ele ainda não gravou todos os dados, ainda armazenados no cache.
Como esvaziar o cache
Os comandos sysctl e o sync podem ser usados em conjunto ou separados para realizar a tarefa.
Vamos verificar, antes, se o cache está sendo usado. Para isto, abra um terminal e digite o seguinte comando:
free -m
total usado livre compart. buffers em cache Mem: 3,6G 2,9G 723M 172M 3,5M 1,5G -/+ buffers/cache: 1,4G 2,2G Swap: 15G 0B 15G
Observe a última coluna em cache
.
No exemplo acima, há quase 1,5 Gb da memória cache em uso.
Para limpar o cache será necessário executar comandos com privilégios administrativos.
Veja como:
sudo sync sudo sysctl -w vm.drop_caches=3 sudo sysctl -w vm.drop_caches=0
alternativamente, você pode executar os 3 comandos, em uma linha só:
sudo sync && sudo sysctl -w vm.drop_caches=3 && sudo sysctl -w vm.drop_caches=0
Saiba o que a linha de comando acima faz:
- sync — este comando, assegura que os dados pendentes no sistema de cache sejam escoados pro disco.
- sysctl -w vm.drop_caches = 3 — limpa o cache na memória
- sysctl -w vm.drop_caches = 0 — reinicia o drop cache.
Veja o resultado:
total usado livre compart. buffers em cache Mem: 3,6G 1,7G 1,8G 124M 0B 351M -/+ buffers/cache: 1,4G 2,2G Swap: 15G 156K 15G
Observe como o uso do cache foi drasticamente reduzido.
Esta linha de comando pode ser usada para limpar o cache armazenado na memória RAM.
Método alternativo
O método anterior funciona bem no Ubuntu.
Mas pode não dar resultado em outras distros. Neste caso, recomendo usar o comando sync das seguintes formas:
Para liberar pagecache, dentries e inodes, use o sync desta maneira:
sudo sync; sudo echo 3 > /proc/sys/vm/drop_caches
Para liberar dentries e inodes use-o assim:
sudo sync; sudo echo 2 > /proc/sys/vm/drop_caches
Para liberar apenas o pagecache, faça assim:
sudo sync; sudo echo 1 > /proc/sys/vm/drop_caches
Se você conhece outras maneiras para realizar o serviço, seja bem vindo para comentar sobre isso.
Não esqueça de compartilhar o post! 😉
GLOSSÁRIO
- drop cache — versões superiores à 2.6.15 do kernel do Linux, dispõem de um mecanismo que faz o kernel eliminar o page cache e/ou o cache de inodes e o cache dentry — o que pode auxiliar significativamente na liberação de memória no sistema.
Para fazer uso manual do/proc/sys/vm/drop_caches
, basta gravar um número nele — o que pode ser feito com o comandoecho
.- page cache — também chamado de disk cache é uma cópia de parte dos dados do disco, mantida na memória RAM, pelo sistema operacional.
O objetivo é dar acesso mais rápido a estes dados ao usuário.- dentries — A palavra “dentry” é uma abreviatura para “directory entry” (entrada de diretório).
Uma dentry é nada além de um componente específico no caminho para um arquivo a partir da raiz do sistema. Sua função é prover acesso a arquivos e diretórios. Mohan, I. Chandra (2013)- inodes — “inode” é abreviatura para “index node“. Em um sistema de arquivos Unix, um inode é uma estrutura de dados usada para representar um objeto do sistema de arquivos – qual seja um arquivo, um diretório etc.
Cada inode armazena os atributos e localizações dos blocos do disco referentes ao sistema de arquivos.- buffers — memória usada temporariamente para armazenar dados em tráfego no sistema.
Se quiser ler mais sobre o assunto:
O sistema de arquivos /proc.
http://www.commandlinefu.com/commands/view/1026/empty-the-linux-buffer-cache
http://duopetalflower.blogspot.com.br/2009/09/clearing-cache-memory-in-linux-using.html
15 replies on “Use sync e sysctl para esvaziar a memória cache no Linux”
Senhores uma condição muito comum comigo é usar toda a RAM por um tempo, e por isso fazer swap. Sem problema!
Mesmo após liberar toda a RAM consumida o swap não zera, fica lá deixando o sistema lento mesmo tendo mais de 4G de RAM livre.
Esse é um problema antigo que não consigo resolver, alguma dica para fazer o linux zerar o uso de swap se tiver ram livre?
O sistema pode estar lento por outros motivos.
O swap sempre vai armazenar alguma coisa — principalmente se você tem a opção de hibernação ativada.
Não deu certo no Ubuntu 17.10.
Muito boa a explicação deste post. Funcionou legal no meu deepin. 🙂
Muito bom este seu artigo. Parabéns!
Caro Elias,
O que eu me “ferrei” para procurar alguma coisa inteligível nesta web Vc não imagina! O grande problema são os conceitos desta, até então “misteriosa” SWAP!!!
Com seu post e agora entendendo um pouco melhor é possível ir mais a fundo:
Ficava intrigado que em 02/2015 e após passar a usar Linux (Benção de Deus!), primeiramente Ubuntu e hoje Mint, que programas fechavam inesperadamente, máquina lerda, dedão no Off etc…com o tempo notei que era memória. Ram?Swap?Cache?Buffer? ou que diabos?
Entendo agora que Linux preza pela rapidez e por isso existe Swap!…Mas o que tambem não pode é ficar dias e dias e dias derretendo o computador em leitura e escrita de enormes arquivos e pastas…mesmo se tendo 8,16 ou 32 de Ram. Entendo que existe uma relação Ram verus R:W e isto deve ser equilibrado e respeitado. Ao que me parece existe a falta de um consenso de forma oficial nas Distros bem como respectivas traduções, e não custava nada o que escreveu em forma de “Help” embarcado.
Excelente e parabéns pelo Post. (minha Ram de 3,5 em Cache desceu a 546Kb)
Há um post do colega Ricardo para fazer automaticamente em horário pré definido e vale a pena dar uma olhada e se isto funcionar será o fim destes problemas…e poderia já vir nas Distros!!!: http://www.vivaolinux.com.br/dica/Limpar-cache-da-memoria-RAM
LLL (Linux, Long Life!)
Só uma correção
a SWAP não foi feita para manter o sistema rapido, muito pelo contrario sei uso torna o sistema lento, ela é uma equivalência mais eficiente para a “memória virtual” do windows, Seu uso consome processador e deixa o HD lento e por usar um meio mecânico é para ler e gravar informações,por isso por padrão, para usar a SWAP a pessoa tem de consumir 98% da RAM. Ela é uma válvula de emergência, se um software ou serviço usar recursos alem do que devia, a SWAP é acionada para tentar manter o sistema rodando.
o Buffer é um auxiliar de processamento, ele mantem funções e libs pré carregadas para agilizar os softwares, a Cache é diferente, ela mantem arquivos pré carregados na RAM para agilizar sua leitura, normalmente arquivos de Libs e de sistema como os arquivos da pasta /proc/, as outras ferramentas o artigo definiu muito bem
Obrigado pela contribuição e pelo esclarecimento, Rafael.
Escrevemos mais sobre o SWAP em perguntas e respostas sobre o swap.
Olha isso.
:~$ sudo sync && sudo sysctl -w vm.drop_caches=3 && sudo sysctl -w vm.drop_caches=0
[sudo] password for ubuntu:
vm.drop_caches = 3
sysctl: chave de configuração “vm.drop_caches”: Argumento inválido
vm.drop_caches = 0
Por que do ARGUMENTO INVÁLIDO?
Parece ocorrer em alguns sistemas…
Como observação, o comando
sudo sysctl -w vm.drop_caches=3
limpa o pagecache, os dentries e os inodes. Não há necessidade de ajustar o valor para 0.também deu isso aqui, se alguém puder dar uma dica!!!
Boa tarde pessoal tenho um sistema que ele usa muito memoria cache do linux, preciso saber o seguinte se tem como desativar a memoria cache do linux, se e viável ou não.
deste ja abradeco
Boa tarde, Reginaldo.
Obrigado pela sua contribuição — uma vez que fazer boas perguntas também é uma forma de contribuir. Eu te agradeço por isto.
Eu vou responder-te de uma forma bem genérica, inclusive por que você fez uma pergunta muito genérica.
Eu começo por dizer que interferir no sistema de cache do Linux não é uma boa ideia – por que ele já faz este trabalho muito bem.
Se você tem que mexer nisto, comece por alterar o uso do cache do próprio programa em questão. É comum os programas terem seus próprios arquivos de configuração, onde suas opções de caching são determinadas. Veja o caso do Transmission. Comece por aí.
Elias, agradeço muito esta sua postagem. Trabalho há algum tempo com GNU/Linux, mas não conhecia essa técnica para limpar o cache. Muito interessante.
Penso que poderia ser útil em computadores muito pequenos, com pouca memória. Uma ordem para esvaziar o cache talvez fosse mais rápido do que esperar o gerenciamento de memória perceber que certas informações não são mais úteis.
Obrigado pelo feedback. 😉