Desenvolvimento

13 abr, 2016

Limpando inodes, cache de disco e File System no Linux

Publicidade

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.

computer-memory-pyramid

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