O Linux mantém em memória os dados recentemente carregados do disco, e ali eles ficam enquanto possível. Isso acelera o processo de carregamento desses mesmos dados no futuro, como na execução de programas e na leitura de arquivos.
As áreas na memória que carregam esses dados chamam-se caches. Você pode notar os caches em ação quando roda um programa pela segunda vez e ele carrega muito mais rapidamente que na primeira.
Mas às vezes é necessário fazer algum teste no qual esse efeito de cache deve ser anulado. Por exemplo, medir tempo de carregamento de um programa, ou o tempo necessário para processar algum arquivo. Já vi gente reiniciando a máquina só para poder ter uma medição confiável no tempo de carregamento de um programa.
Outro ponto é quando temos, por exemplo, um servidor em que ao dar um simples df -h notamos que alguns diretórios (como o /var) estão lotados e, mesmo limpando arquivos desnecessários nesses diretórios, o tamanho dele não diminui.
Para economizar nosso tempo e paciência, e ter um efeito semelhante sem precisar reiniciar a máquina, podemos pedir ao kernel que limpe todos os caches que estiverem em memória. Basta usar uma entrada no /proc, existente nas versões mais recentes do kernel, rodando o comando:
Exemplos:
O comando sync faz com que todo o cache do sistema de arquivos, que está temporariamente armazenado na memória cache, seja despejado em disco e liberado, prevenindo assim que se tenha perda de dados.
# sync
Outra forma de limparmos o disco é alterarmos os seguintes arquivos:
# echo 1 > /proc/sys/vm/drop_caches
Seguem as opções:
Liberar apenas pagecache:
# echo 1 > /proc/sys/vm/drop_caches
Liberar pagecache e inodes:
# echo 2 > /proc/sys/vm/drop_caches
Faz o papel dos dois anteriores e também libera dentries:
# echo 3 > /proc/sys/vm/drop_caches
Obs: echo 3 só funcionará no kernel a partir da versão 2.6.16.
Também é possível manipular os files do proc. utilizando o comando “sysctl”:
# sysctl vm.drop_caches=1
# sysctl vm.drop_caches=2
# sysctl vm.drop_caches=3