Quando deixamos o servidor ligado por muitos dias é comum o uso excessivo da memória devido ao cache não usado.
Fiz este script que limpa o cache apenas quando a memória livre fica abaixo de determinado valor, assim posso deixar ele executando do cron a cada hora e ele só vai limpar o cache quando for realmente necessário (memória livre abaixo do que você definir).
Changelog: Conforme sugestão dos colegas, troquei o grep pelo awk com menos comandos e acrescentei a possibilidade de loggar sempre que limpar o cache. Para isso achei melhor usar o logger, que é um utilitário do syslogd e que vai loggar no /var/log/messages.
Changelog: Nesta nova versão eu implementei a função de daemon, desta forma a pessoa não precisa colocar no crontab, é só configurar e executar...
Tem diversas mudanças interessantes no código: daemon, controle de PID, cálculo floating point, controle de processos...
Uso:
--help :: Show this Help
--force :: Drop caches without checking
--start :: Run in daemon mode
--stop :: Stop the daemon
--restart :: Stop and restart daemon
--meminfo :: Only print memory information
(without arguments) :: Same as start
Changelog: Coloquei no script uma validação da versão do kernel, pois nem todos possuem essa feature.
E na function clear_cache estava dando problema a linha do if.
#!/bin/bash
#
#
# Este script limpa o Cache da Memória RAM sempre que a memória livre estiver abaixo de $MEM_MIN
# No caso deixei pra limpar o cache sempre que a memória livre estiver abaixo de 1GB, adaptar às suas necessidades
# Eu deixo este script no cron do root para executar a cada hora, e ele só vai limpar o cache quando for necessário
#
# Escrito por Fernando B. Giannasi - março/2013
#
# Referências: http://blog.philippklaus.de/2011/02/clear-cached-memory-on-ubuntu/
# http://www.vivaolinux.com.br/dica/Limpando-a-memoria-cache-no-Linux
# Informações da memória
MEM_LIVRE=`cat /proc/meminfo | grep "^MemFree" | tr -s ' ' | cut -d ' ' -f2` && MEM_LIVRE=`echo "$MEM_LIVRE/1024.0" | bc`
MEM_TOTAL=`cat /proc/meminfo | grep "^MemTotal" | tr -s ' ' | cut -d ' ' -f2` && MEM_TOTAL=`echo "$MEM_TOTAL/1024.0" | bc`
MEM_MIN=`echo 1024`
# Só funciona como root, se não for root precisaremos usar o sudo
SUDO=`which sudo`
if [ "`whoami`" == "root" ]; then ROOT=true; fi
if [ ! "`which sudo`" ] && [ !$ROOT ]; then echo "Não é o superusuário e o SUDO não foi encontrado"; exit 1; fi
# Finalmente limpando o Cache...
if [ "$MEM_LIVRE" -le "$MEM_MIN" ]
then
echo "Efetuando limpeza do Cache da memória..."
if [ $ROOT ]; then sync; echo 3 > /proc/sys/vm/drop_caches; else $SUDO sync; echo 3 | $SUDO tee /proc/sys/vm/drop_caches > /dev/null; fi
MEM_APOS=`cat /proc/meminfo | grep "^MemFree" | tr -s ' ' | cut -d ' ' -f2` && MEM_APOS=`echo "$MEM_APOS/1024.0" | bc`
echo "Memória total instalada: $MEM_TOTAL MB"
echo "Memória livre antes: $MEM_LIVRE MB"
echo "Memória livre após: $MEM_APOS MB"
else
echo "Não é necessário limpar o Cache da memória"
fi
exit 0
[4] Comentário enviado por phoemur em 27/03/2013 - 11:14h
Essa parte de regex realmente não é o meu forte... Obrigado pela contribuição...
No cron por exemplo podeira deixar assim:
#crontab -e
e colocar:
47 * * * * /usr/sbin/clearcache.sh (ou o local onde copiar o arquivo)
Assim ele vai executar aos 47 minutos de cada hora, agora acho que como é um script leve não deve ter problema executar em intervalo de tempo menor... Ele só vai tomar a ação de limpar o cache se a memória livre ficar baixa, abaixo de $MEM_MIN... Eu achei esta forma melhor do que colocar pra limpar o cache 1x/dia que é como o pessoal vinha fazendo...
[6] Comentário enviado por removido em 30/03/2013 - 00:11h
[4] Comentário enviado por phoemur em 27/03/2013 - 11:14h:
Essa parte de regex realmente não é o meu forte... Obrigado pela contribuição...
No cron por exemplo podeira deixar assim:
#crontab -e
e colocar:
47 * * * * /usr/sbin/clearcache.sh (ou o local onde copiar o arquivo)
Assim ele vai executar aos 47 minutos de cada hora, agora acho que como é um script leve não deve ter problema executar em intervalo de tempo menor... Ele só vai tomar a ação de limpar o cache se a memória livre ficar baixa, abaixo de $MEM_MIN... Eu achei esta forma melhor do que colocar pra limpar o cache 1x/dia que é como o pessoal vinha fazendo...
abraços
Valeu! Agora tenho uma ideia de quando é melhor dele ser executado.
seria interessante acrescentar um >> /var/log/syslog por exemplo assim ficaria no registro do sistema caso necessite consultar, no caso dos sistemas debian e derivados
[10] Comentário enviado por phoemur em 07/04/2013 - 13:29h
Legal cara, no início eu realmente deixei pra sair se não fosse o root, mas depois achei melhor chamar o SUDO quando não fosse root, da forma que está no script...
Quando ao id -u ou whoami acho que não faz muita diferença, a não ser que o usuário tenha mudado o usuário com UID 0 de root pra qualquer outra coisa...
Basicamente um loop infinito com while, sleep pra dar o tempo e as funções start, stop, restart e status
Porém não postei porque o script de deixar no cron tem funcionado melhor...
Pro daemon ficar bom estou precisando ainda de dois arquivos, um pra ser o script e outro pra chamar no init, o rc.script... Se colocar tudo no mesmo arquivo ainda tenho percebido alguns bugs quando o arquivo tenta matar ele mesmo ou então fica com dois processos executando ao mesmo tempo... Ainda está em aperfeiçoamento.
[14] Comentário enviado por oficinaiti em 07/08/2013 - 09:30h
Olá pessoal...
Baixe a Versão 4 do Script e encontrei um erro qto a validação da versão do Kernel ... Caso seu Kernel seja 3.0.0 por exemplo, o script irá falhar... qdo na verdade deveria seguir ok...
Reescrevi a parte de validação da versão do Kernel para:
[15] Comentário enviado por phoemur em 07/08/2013 - 11:20h
Na verdade já havia visto issoo faz algum tempo, porém como a versão 4 não foi eu quem publicou eu deixei pro colega atualizar, mas acho que ainda está errado... No meu pc deixei assim: