Blog Agility

Limpando inodes, cache de disco e File System no Linux

Limpando inodes, cache de disco e File System no Linux

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, bem 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 vez.

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.

Limpando inodes, cache de disco e File System no Linux

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.

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

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

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 comando echo.

  • 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.

  • 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.

Utilizando os exemplos de comandos demonstrados neste artigo podemos efetuar a limpeza de inodes, cache de disco e File System no Linux de forma simples e rápida, sem necessidade de reiniciar o servidor.