Limpando o cache de forma rápida e automática

Aqueles que são administradores de redes e servidores já devem ter passado por problemas parecidos com este.

Nesta dica irei apresentar um comando simples para limpar sua memória em cache.

Resolvi escrever sobre isto por ter visto duas vezes na mesma semana problemas relacionados a isso. Um foi aqui mesmo onde trabalho, onde estávamos percebendo que o consumo de memória em um dos servidores estava muito alto, porém com pouca atividade no mesmo, no qual percebi que nada mais era do que muita memória alocada em cache sem necessidade no momento. Desenvolvedores java...vai entender.. hauhauha (brincadeira.. :p).

Outro caso foi uma dúvida que surgiu, bem parecida, em um fórum do qual faço parte, onde um rapaz estava passando pelo mesmo problema no servidor dele... Com consumo exagerado de memória. Ele até colou o resultado do top no qual podíamos ver claramente que não haviam processos consumindo tudo aquilo de memória, e mais uma vez pudemos ver que o grande vilão era o cache, o que lhe passava essa impressão de memória totalmente consumida.

O comando para se limpar este chache é o seguinte:


# echo 3 > /proc/sys/vm/drop_caches

Exemplo:

Aqui vai uma saída do meu top antes de rodar o comando. ( Reparem no consumo de memória armazenada em Cache na última linha!)

top - 09:40:03 up 1:42, 1 user, load average: 0.06, 0.20, 0.20
Tasks: 83 total, 2 running, 80 sleeping, 0 stopped, 1 zombie
Cpu(s): 4.3%us, 0.5%sy, 0.2%ni, 95.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1944240k total, 898916k used, 245324k free, 51176k buffers
Swap: 996020k total, 0k used, 996020k free, 969000k cached

Repare agora o resultado obtido pelo top depois de executar o comando para limpar o cache:

top - 09:45:03 up 1:47, 1 user, load average: 0.32, 0.16, 0.17
Tasks: 85 total, 3 running, 81 sleeping, 0 stopped, 1 zombie
Cpu(s): 11.2%us, 1.5%sy, 0.0%ni, 63.4%id, 23.9%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1944240k total, 329412k used, 1614828k free, 768k buffers
Swap: 996020k total, 0k used, 996020k free, 69088k cached

A memória armazenada em cache caiu de ~969mb para ~69mb. ;]

Bingo!

Agora vamos automatizar a coisa...

Aqui precisaremos apenas de um mínimo de intimidade com shell script e um pouco de conhecimento sobre o agendamento de tarefas no linux através do cron.

Mãos a obra...

A missão: Uma vez que nossos amigos não conseguem trabalhar de forma harmônica com a alocação e desalocação de memória em nossos servidores, iremos agendar a limpeza de cache para todos os dias no começo do expediente (8:00) e após o almoço. Lembrando que este é apenas um exemplo, mas você pode adaptar os horários de acordo com sua real necessidade.

Soldados Disponíveis: Shell Script e Cron

Plano: Um pequeno e simples script em shell será executado nos dias e horários informados anteriormente de forma a fazer uma limpeza no cache.

Execução:

Primeiro criaremos o script que fará a ação de limpeza do cache. Para isso abra o editor de textos de sua preferência. Particularmente prefiro o vim, mas este pode ser substituido por qualquer outro.

No seu corpo insira o seguinte conteúdo:

#!/bin/bash
#limpando cache

#o seguinte comando é o responsável pela limpeza
echo 3 > /proc/sys/vm/drop_caches

Feito isto, salve o arquivo com o nome de limpacache.sh

Sim, isto é tudo o que o seu script precisa. Com o script criado, você deverá agora lhe dar condições de execução. Utilize o seguinte comando:


# chmod a+x limpacache.sh

Agora que ele está pronto e com permissão de execução, iremos agendar a execução do mesmo. No terminal digite:


# crontab -e

Isto irá abrir um arquivo no qual você deverá fazer o agendamento de sua tarefa. No mesmo insira o seguinte conteúdo:

# mm HH DD MM DS tarefa
00 08 * * * /usr/bin/scripts/limpacache.sh
00 14 * * * /usr/bin/scripts/limpacache.sh

Ps: O caminho /etc/scripts/ precisa ser configurado de acordo com o caminho utilizado por você. ;]

Pronto. Pode salvar e encerrar este aquivo.

Traduzindo o comando as linhas do cron que utilizamos:

mm: minutos
HH: horas
DD: dia
MM: mês
DS: dia da semana

/usr/bin/scripts/limpacache.sh: tarefa a ser realizada

Feito isto, o plano está concretizado. Seu script será executado todos os dias nestes dois horários.

Sinta-se livre agora para customizar os dias e horários da maneira que for mais conveniente para você.

Abraços.
Marcelo Cavalcante Rocha / Kalib


Copyright (c) 2006-2007 - Comunidade de Software Livre Tux-CE.
Conteúdo licenciado sob a licença GNU Free Documentation License,
assim como as páginas derivadas Fórum e Blog