■キャッシュクリアとスワップクリア〜閾値監視の一歩先〜
※メモリ操作を伴うので注意。
メモリ不足なら、役割を減らすか、物理メモリの増設か、HW構成の変更をしましょうw。
実メモリとスワップメモリの閾値監視
http://d.hatena.ne.jp/labunix/20120923
■スワップは正しくfstabに記載されていることが前提。
$ grep swap /etc/fstab | \
sed s/"UUID=[a-f0-9]*\-[a-f0-9]*\-[a-f0-9]*\-[a-f0-9]*\-[a-f0-9]* "/"UUID=dummy "/
UUID=dummy none swap sw 0 0
■以下のようにすると、自動的に使用していないキャッシュをクリアし、
メモリの開放、スワップの開放を行う。
キャッシュクリア前後のfreeコマンドの実行結果を「root」ユーザにシステムメールを送る。
※デフォルトは実メモリ「70%」、スワップ「0%」超え。
スワップ使用が「0%」を超えたら、実メモリのキャッシュをクリア
キャッシュクリアが成功し、メモリの使用率が70%以下ならスワップクリア
$ w3m -dump https://raw.github.com/labunix/sa_report/master/autoclear.sh
set -e
if [ "`id -u`" -ne "0" ];then
echo "Sorry,NotPermit User"
exit 1
fi
if [ "x${PATH}" == "x" ];then
echo "PATH Error, PATH=$PATH"
exit 2
fi
echo "$PATH" | sed s/"\:"/"\n"/g | grep '^/usr/sbin' > /dev/null 2>&1 || \
export PATH=/usr/sbin:$PATH
echo "$PATH" | sed s/"\:"/"\n"/g | grep '^/sbin' > /dev/null 2>&1 || \
export PATH=/sbin:$PATH
cd $(dirname $0)
FLAG=1
TEST=""
if [ "$#" -eq 1 ];then
case $1 in
-t|test)
TEST=test
;;
*)
echo "Do Nothing" > /dev/null
;;
esac
fi
LOGFILE=autoclear.log
test -f "$LOGFILE" || touch "$LOGFILE"
test -f swapcheck.sh || \
wget https://raw.github.com/labunix/sa_report/master/swapcheck.sh
test -f cache_clear.sh || \
wget https://raw.github.com/labunix/sa_report/master/cache_clear.sh
test -f "$LOGFILE" || exit 1
test -f swapcheck.sh || exit 1
test -f cache_clear.sh || exit 1
chmod +x swapcheck.sh
chmod +x cache_clear.sh
exec > "$LOGFILE" 2>&1
./swapcheck.sh $TEST | grep Swap && ./cache_clear.sh && FLAG=0
if [ "$FLAG" -eq "0" ] ;then
swapon -s
./swapcheck.sh $TEST | grep Mem || swapoff -a && swapon -a
fi
if [ -s "$LOGFILE" ];then
cat "$LOGFILE" | \
mail -s "cache_clear Report" root && \
rm "$LOGFILE"
else
rm "$LOGFILE"
fi
unset PATH LOGFILE FLAG
exit 0
■「swapcheck.sh」のテストオプションがそのまま使えるので、
以下の2つのどちらかも出来る。
実メモリは「0%」を超えて使用していたらキャッシュクリアを実行。
スワップは「-1%」を超えて使用していたら(0%も含む)スワップクリアを実行。
つまり、強制的にキャッシュクリアとスワップクリアを行う。
$ sudo ./autoclear.sh test
$ sudo ./autoclear.sh -t
■「cache_clear.sh」について
$ w3m -dump https://raw.github.com/labunix/sa_report/master/cache_clear.sh
echo "[Before]"
free
sync
sync
sync
sleep 1
sysctl -w vm.drop_caches=3
echo "[After]"
free
■そういえば最近、「cron」って書くほどでも無いと思って書いていなかったので。。。
実行タイミングは、「2,7,12,...」となる。ちょっとやりすぎかな。。。
「12,22,32,...」でも。。。
せいぜい1時間に1回とか、既知のアイドル時の方が良いかも。
$ sudo crontab -l
2-59/5 * * * * ./usr/local/bin/autoclear.sh
$ sudo crontab -l
2-59/10 * * * * ./usr/local/bin/autoclear.sh