キャッシュクリアとスワップクリア〜閾値監視の一歩先〜

■キャッシュクリアとスワップクリア〜閾値監視の一歩先〜
 ※メモリ操作を伴うので注意。
  メモリ不足なら、役割を減らすか、物理メモリの増設か、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 "/
# swap was on /dev/sda2 during installation
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
#!/bin/bash
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)
# pwd
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
#!/bin/bash
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