Limpando sua memória cache de forma simples (parte 2)
Muitos me pediram por aqui ou mesmo por email para explicar como seria a implementação desta técnica de forma automatizada.
Bom, utilizo-a para o servidor que citei no artigo anterior, utilizado pelos nossos amigos desenvolvedores Java. ;] Nada pessoal, heim?!
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, agendaremos 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 substituído 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 este criado, você deverá dar-lhe 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, agendaremos a execução do mesmo. No terminal digite:
# crontab -e
Isto 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 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ê.
[4] Comentário enviado por Sharkypt em 18/07/2008 - 12:52h
pois eu não sei até que ponto este artigo ou o 1º estão 100% correctos. Pelas pesquisas que fiz pela net sobre este tema (à já muito tempo) eis os passos a seguir:
Tudo isto após o sistema iniciar:
1- comando serve para sincronizar memória
$ sudo sync
2- comando serve para apagar o cache sempre até ao próximo reboot
$ sudo sysctl -w vm.drop_caches=3
Este 2º comando é equivalente ao:
echo 3 > /proc/sys/vm/drop_caches
Agora até desligarem o PC ou até modificarem o drop_caches, este parâmetro estará sempre activo. Podem sim querer colocar logo isto no arranque e para isso é colocar a linha do "sysctl" num /etc/init.d/rc.local ou algo parecido...
[5] Comentário enviado por Sharkypt em 18/07/2008 - 12:56h
PS:
- o comando 'sync' só o faço porque li algures que era bom fazer antes de alterar o drop_caches :-P
"""
As this is a non-destructive operation, and dirty objects are not freeable, the user should run "sync" first in order to make sure all cached objects are freed.
"""
[6] Comentário enviado por kalib em 18/07/2008 - 13:23h
O que você não entendeu ainda é a moral da história cara.. hauhuaha
Em nenhum momento eu disse que isso é algo que deva ser utilizado a torto e a direita.
Acontece que..por algum problema numa aplicação que está sendo criada aqui...a coisa vai crescendo de forma anormal no uso de memória..o que no final do dia gera problemas... e a pedidos dos prórpios desenvolvedores, adotei essa prática como forma de ajudar nos testes deles, já que eles monitoram esse crescimento anormal..como uma tentativa de saber onde tá o erro na aplicação..
Entendeu?
Foi mais algo como:
Cara...nossa aplicação tá com algum problema..estamos errando em algo. Tem uma forma de forçar essa limpeza para que possamos ficar testando?
[7] Comentário enviado por Sharkypt em 18/07/2008 - 13:28h
Mas o kernel quando tem a opção drop_caches=3 faz isso automaticamente mal o programa vai para fim. Não precisas de estar a colocar no cron nada pois so estas a alterar de 3 para 3 e nao força nada...
[8] Comentário enviado por kalib em 18/07/2008 - 13:35h
Na verdade eu não estou alterando de 3 para 3...
Isso é o que você faz com o comando sysctl -w vm.drop_caches=3
No meu caso:
echo 3 > /proc/sys/vm/drop_caches
Eu estou informando que deve ser feita a limpeza do nível 3. Apenas isso..
Colocando no cron.. informa que eu o farei em tal hora.
O seu comando apenas sinalizaria que a forma de dropar o cache seria o 3..O meu faz a dropagem. ;]
[9] Comentário enviado por Sharkypt em 21/07/2008 - 06:53h
Tens razão... cada vez que "sinalizas" o valor da variável 'drop_caches', o kernel limpa o cache consoante esse mesmo valor (mesmo que seja igual). o facto de usares o 'echo' ou o 'sysctl' é igual... em baixo segue o exemplo:
[10] Comentário enviado por cleberjsantos em 23/01/2010 - 08:59h
De fato, sugiro que para quem for fazer essa limpeza coloque o sync, isso é apenas para prevenir que tenha-se perda de dados, no caso do nosso amigo Marcelo, ele fala de uma situação específica, mas ainda assim, estemos falando de um comando que não importa em que senário é, ele vai limpar o cache da máquina, o que neste caso podemos simplesmente evitar futuros problemas com simples sync ;)
No qual irá apenas sincronizar as coisas antes dessa limpeza, eviando caso ocorra alguma perda de dados!