メモリ不足のサーバを効率的に使っているか

■以前、CPUとメモリの利用率をローテーション前にログに出力するスクリプトを書いた。
 ※今回は既知なので使用していない。

 sa_report.sh
 https://raw.github.com/labunix/sa_report/master/sa_report.sh

■上記でゲストOSを載せるには辛いスペックであることが分かってからは
 最小限の役割にしている。

$ free
             total       used       free     shared    buffers     cached
Mem:       1994744    1183648     811096          0     109716     393908
-/+ buffers/cache:     680024    1314720
Swap:      1951888          0    1951888

■最小とは言え、DNSやFWを分離している程度で、
 主な役割はプロキシサーバ。
 メモリは多用するが、CPUはほとんど使わないはず。

$ pstree
init─┬─acpid
     ├─amavisd-new───2*[amavisd-new]
     ├─apache2─┬─apache2
     │         └─2*[apache2───26*[{apache2}]]
     ├─clamd───{clamd}
     ├─cron
     ├─dbus-daemon
     ├─freshclam
     ├─7*[getty]
     ├─lwresd───3*[{lwresd}]
     ├─master─┬─pickup
     │        ├─qmgr
     │        └─tlsmgr
     ├─ntpd
     ├─postgres───4*[postgres]
     ├─rsyslogd───2*[{rsyslogd}]
     ├─smbd───smbd
     ├─snmpd
     ├─snmptrapd
     ├─spamd───2*[spamd]
     ├─squid───squid─┬─8*[squidGuard]
     │               └─unlinkd
     ├─sshd───sshd───sshd───bash───pstree
     └─udevd───2*[udevd]

■CPUは2.4GHzのAMD64bit版。

$ sudo dmidecode -t processor | grep "Current"
        Current Speed: 2400 MHz

■以下のような5分に一回取得している性能情報を1時間に一回にしたい。
 ディストリビューションによって異なるが、sysstatのデフォルトは大体10分か5分。
 以下は15分に一回のsarログを普通に変換した場合。

$  env LANG=C sar -u -f /var/log/sysstat/sa03 | head -10 | grep ^[0-9]
00:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
00:20:01        all      0.21      0.00      0.04      0.01      0.00     99.74
00:35:01        all      0.01      0.00      0.03      0.00      0.00     99.96
00:50:01        all      0.21      0.00      0.03      0.01      0.00     99.75
01:05:01        all      0.01      0.00      0.03      0.01      0.00     99.94
01:20:01        all      0.02      0.00      0.02      0.01      0.00     99.95
01:35:01        all      0.02      0.00      0.03      0.00      0.00     99.96

■一日の平均は以下で充分だとする。

$ for n in `seq -w 3 10`;do \
    env LANG=C sar -u -f "/var/log/sysstat/sa${n}" | grep Average | sed s%^%"2013/02/$n,"%g; \
  done
2013/02/03,Average:        all      0.51      0.00      0.16      0.21      0.00     99.11
2013/02/04,Average:        all      0.45      0.00      0.13      0.05      0.00     99.36
2013/02/05,Average:        all      0.52      0.00      0.10      0.04      0.00     99.34
2013/02/06,Average:        all      0.40      0.00      0.13      0.05      0.00     99.42
2013/02/07,Average:        all      0.46      0.00      0.08      0.02      0.00     99.44
2013/02/08,Average:        all      0.41      0.00      0.08      0.02      0.00     99.49
2013/02/09,Average:        all      0.29      0.00      0.08      0.01      0.00     99.61
2013/02/10,Average:        all      0.48      0.00      0.09      0.12      0.00     99.31

■一時間毎の性能情報を抜き出す。

$ env LANG=C sar -u -f /var/log/sysstat/sa03 | head -3 | grep %; \
  env LANG=C sar -u -f /var/log/sysstat/sa03 | grep ^[0-9] | \
  awk -F\: '{if ($1!=TIME){MSG=$0";"MSG;TIME=$1}}END{print MSG}' | \
  sed s/";"/"\n"/g | sort -n -k 1
00:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle

00:00:01        all      0.00      0.00      0.02      0.00      0.00     99.98
01:05:01        all      0.01      0.00      0.03      0.01      0.00     99.94
02:05:01        all      0.02      0.00      0.02      0.01      0.00     99.95
03:05:01        all      0.02      0.00      0.02      0.01      0.00     99.95
04:05:01        all      0.02      0.00      0.03      0.01      0.00     99.94
05:05:01        all      0.02      0.00      0.03      0.00      0.00     99.95
06:05:01        all      0.02      0.00      0.02      0.01      0.00     99.95
07:05:01        all      0.01      0.00      0.02      0.01      0.00     99.95
08:05:01        all      0.02      0.00      0.02      0.01      0.00     99.95
09:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
10:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
11:05:01        all      0.20      0.00      0.40      0.05      0.00     99.34
12:05:01        all      0.16      0.00      0.28      0.34      0.00     99.21
13:05:01        all      0.02      0.00      0.03      0.00      0.00     99.95
14:05:01        all      1.08      0.00      0.11      0.01      0.00     98.80
15:05:01        all      0.65      0.00      1.65      0.43      0.00     97.27
16:05:01        all      4.99      0.00      2.39      0.38      0.00     92.24
17:05:01        all      0.15      0.00      0.19      0.33      0.00     99.33
18:05:01        all      0.10      0.00      0.14      0.43      0.00     99.33
19:05:01        all      1.15      0.00      0.21      0.20      0.00     98.45
20:05:01        all      1.06      0.00      0.09      0.07      0.00     98.78
21:05:01        all      0.11      0.00      0.63      0.24      0.00     99.02
22:05:01        all      0.60      0.00      0.05      0.06      0.00     99.29
23:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96

■ユーザへのリソース割り当てが増えたタイミングを抜き出す。

$ env LANG=C sar -u -f /var/log/sysstat/sa03 | grep ^[0-9] | \
  awk '{if ($3>USER){MSG=$0";"MSG;USER=$3}}END{print MSG}' | \
  sed s/";"/"\n"/g | sort -n -k 1

00:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
00:20:01        all      0.21      0.00      0.04      0.01      0.00     99.74
03:50:01        all      0.92      0.00      0.10      0.08      0.00     98.89
10:50:01        all      1.94      0.00      0.24      0.04      0.00     97.78
16:05:01        all      4.99      0.00      2.39      0.38      0.00     92.24
22:20:01        all     24.26      0.00      1.50     13.51      0.00     60.73

■システムへのリソース割り当てが増えたタイミングを抜き出す。

$ env LANG=C sar -u -f /var/log/sysstat/sa03 | grep ^[0-9] | \
  awk '{if ($5>SYS){MSG=$0";"MSG;SYS=$5}}END{print MSG}' | \
  sed s/";"/"\n"/g | sort -n -k 1

00:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
00:20:01        all      0.21      0.00      0.04      0.01      0.00     99.74
03:50:01        all      0.92      0.00      0.10      0.08      0.00     98.89
07:50:01        all      0.48      0.34      0.11      0.02      0.00     99.04
10:50:01        all      1.94      0.00      0.24      0.04      0.00     97.78
11:05:01        all      0.20      0.00      0.40      0.05      0.00     99.34
11:20:01        all      0.30      0.00      0.76      0.03      0.00     98.90
15:05:01        all      0.65      0.00      1.65      0.43      0.00     97.27
16:05:01        all      4.99      0.00      2.39      0.38      0.00     92.24

■I/O WAITが増えたタイミングを抜き出す。
 これはユーザへのリソース割り当てが発生したタイミングと一致する。

$ env LANG=C sar -u -f /var/log/sysstat/sa03 | grep ^[0-9] | \
  awk '{if ($6>WAIT){MSG=$0";"MSG;WAIT=$6}}END{print MSG}' |   sed s/";"/"\n"/g | sort -n -k 1

00:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
00:20:01        all      0.21      0.00      0.04      0.01      0.00     99.74
03:50:01        all      0.92      0.00      0.10      0.08      0.00     98.89
12:05:01        all      0.16      0.00      0.28      0.34      0.00     99.21
15:05:01        all      0.65      0.00      1.65      0.43      0.00     97.27
20:50:01        all      0.28      0.00      0.09      1.23      0.00     98.39
22:20:01        all     24.26      0.00      1.50     13.51      0.00     60.73

■idle値が増えたタイミングを抜き出す。

$ env LANG=C sar -u -f /var/log/sysstat/sa03 | grep ^[0-9] | \
  awk '{if ($8>IDLE){MSG=$0";"MSG;IDLE=$8}}END{print MSG}' | \
  sed s/";"/"\n"/g | sort -n -k 1

00:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:00:01        all      0.00      0.00      0.02      0.00      0.00     99.98
00:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
05:35:01        all      0.02      0.00      0.02      0.00      0.00     99.97

■2/32/10までの一週間の間にユーザの利用率が上がった日と時間とその値。
 ※20%以上の箇所はclamscanで全ファイルをチェックしたタイミング。
  以降は一日以内に変更があったファイルだけ、日単位でチェックしている。

$ for n in `seq -w 3 10`;do env LANG=C sar -u -f "/var/log/sysstat/sa${n}" | \
  sed s%^%"2013/02/$n,"%g ;done | \
  grep ^[0-9] | grep -v CPU |\
  awk '{if($3>TMP){MSG=$0";"MSG;TMP=$3}}END{print MSG}' | \
  sed s/";"/"\n"/g | sort -n -k 1

2013/02/03,00:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
2013/02/03,00:20:01        all      0.21      0.00      0.04      0.01      0.00     99.74
2013/02/03,03:50:01        all      0.92      0.00      0.10      0.08      0.00     98.89
2013/02/03,10:50:01        all      1.94      0.00      0.24      0.04      0.00     97.78
2013/02/03,16:05:01        all      4.99      0.00      2.39      0.38      0.00     92.24
2013/02/03,22:20:01        all     24.26      0.00      1.50     13.51      0.00     60.73
2013/02/04,22:20:01        all     26.10      0.00      1.62      1.38      0.00     70.90

■システムへの負荷も無く、全ファイルをウイルスチェックするような負荷をかけても
 ゆとりのあるシステム利用が出来ている事がわかる。

$ for n in `seq -w 3 10`;do env LANG=C sar -u -f "/var/log/sysstat/sa${n}" | \
  sed s%^%"2013/02/$n,"%g ;done | \
  grep ^[0-9] | grep -v CPU | \
  awk '{if($5>TMP){MSG=$0";"MSG;TMP=$5}}END{print MSG}' | \
  sed s/";"/"\n"/g | sort -n -k 1

2013/02/03,00:05:01        all      0.02      0.00      0.02      0.00      0.00     99.96
2013/02/03,00:20:01        all      0.21      0.00      0.04      0.01      0.00     99.74
2013/02/03,03:50:01        all      0.92      0.00      0.10      0.08      0.00     98.89
2013/02/03,07:50:01        all      0.48      0.34      0.11      0.02      0.00     99.04
2013/02/03,10:50:01        all      1.94      0.00      0.24      0.04      0.00     97.78
2013/02/03,11:05:01        all      0.20      0.00      0.40      0.05      0.00     99.34
2013/02/03,11:20:01        all      0.30      0.00      0.76      0.03      0.00     98.90
2013/02/03,15:05:01        all      0.65      0.00      1.65      0.43      0.00     97.27
2013/02/03,16:05:01        all      4.99      0.00      2.39      0.38      0.00     92.24

■日単位ならばループの中で整形すればよい。

$ for n in `seq -w 3 10`;do \
    env LANG=C sar -u -f "/var/log/sysstat/sa${n}" | \
    sed s%^%"2013/02/$n,"%g | \
    grep ^[0-9] | grep -v CPU | \
    awk '{if($5>TMP){MSG=$0";"MSG;TMP=$5}}END{print MSG}' | \
    sed s/";"/"\n"/g | sort -n -k 1; \
  done

2013/02/03,00:05:01        all      0.02      0.00      0.02      0.00      0.00                99.96
2013/02/03,00:20:01        all      0.21      0.00      0.04      0.01      0.00                99.74
2013/02/03,03:50:01        all      0.92      0.00      0.10      0.08      0.00                98.89
2013/02/03,07:50:01        all      0.48      0.34      0.11      0.02      0.00                99.04
2013/02/03,10:50:01        all      1.94      0.00      0.24      0.04      0.00                97.78
2013/02/03,11:05:01        all      0.20      0.00      0.40      0.05      0.00                99.34
2013/02/03,11:20:01        all      0.30      0.00      0.76      0.03      0.00                98.90
2013/02/03,15:05:01        all      0.65      0.00      1.65      0.43      0.00                97.27
2013/02/03,16:05:01        all      4.99      0.00      2.39      0.38      0.00                92.24

2013/02/04,00:05:01        all      0.01      0.00      0.02      0.00      0.00                99.97
2013/02/04,00:20:01        all      0.21      0.00      0.03      0.01      0.00                99.76
2013/02/04,01:50:01        all      0.21      0.00      0.04      0.02      0.00                99.74
2013/02/04,03:50:01        all      0.34      0.00      0.07      0.04      0.00                99.54
2013/02/04,05:35:01        all      1.06      0.00      0.10      0.01      0.00                98.82
2013/02/04,05:50:01        all      0.61      0.00      0.49      0.24      0.00                98.67
2013/02/04,06:05:01        all      0.26      0.00      0.65      0.03      0.00                99.06
2013/02/04,06:20:01        all      0.47      0.00      0.72      0.02      0.00                98.79
2013/02/04,21:05:01        all      0.65      0.00      1.39      0.18      0.00                97.78
2013/02/04,22:20:01        all     26.10      0.00      1.62      1.38      0.00                70.90

2013/02/05,00:05:01        all      0.04      0.00      0.13      0.00      0.00                99.82
2013/02/05,00:20:01        all      0.54      0.00      0.15      0.00      0.00                99.30
2013/02/05,00:35:01        all      0.15      0.00      0.25      0.10      0.00                99.49
2013/02/05,00:50:01        all      1.12      0.00      2.06      0.42      0.00                96.40

2013/02/06,00:05:01        all      0.02      0.00      0.03      0.00      0.00                99.96
2013/02/06,01:50:01        all      0.36      0.00      0.10      0.04      0.00                99.50
2013/02/06,06:20:01        all      0.33      0.00      0.23      0.02      0.00                99.42
2013/02/06,06:50:01        all      0.54      0.00      0.59      0.08      0.00                98.79
2013/02/06,21:50:01        all      2.26      0.00      0.61      0.05      0.00                97.07
2013/02/06,22:05:01        all      0.28      0.00      0.66      0.03      0.00                99.03
2013/02/06,22:20:01        all     19.24      0.00      1.52      0.17      0.00                79.07

2013/02/07,00:05:01        all      0.02      0.00      0.03      0.00      0.00                99.95
2013/02/07,00:20:01        all      0.27      0.00      0.11      0.07      0.00                99.54
2013/02/07,07:50:01        all      0.63      0.30      0.14      0.18      0.00                98.75
2013/02/07,08:35:01        all      1.74      0.00      0.21      0.03      0.00                98.01
2013/02/07,08:50:01        all      0.39      0.00      0.35      0.05      0.00                99.20
2013/02/07,22:05:01        all      0.25      0.00      0.47      0.02      0.00                99.27
2013/02/07,22:20:01        all     25.44      0.00      1.58      0.42      0.00                72.56

2013/02/08,00:05:01        all      0.02      0.00      0.03      0.00      0.00                99.95
2013/02/08,01:50:01        all      0.21      0.00      0.04      0.00      0.00                99.76
2013/02/08,02:50:01        all      0.35      0.00      0.08      0.02      0.00                99.54
2013/02/08,05:35:01        all      0.10      0.00      0.17      0.03      0.00                99.71
2013/02/08,05:50:01        all      0.65      0.00      0.81      0.17      0.00                98.37

2013/02/09,00:05:01        all      0.02      0.00      0.03      0.00      0.00                99.96
2013/02/09,03:20:01        all      0.21      0.00      0.04      0.00      0.00                99.76
2013/02/09,07:50:01        all      0.47      0.31      0.08      0.03      0.00                99.11
2013/02/09,09:50:01        all      0.36      0.00      0.11      0.05      0.00                99.49
2013/02/09,11:35:01        all      1.23      0.00      0.36      0.05      0.00                98.36
2013/02/09,11:50:01        all      0.55      0.00      0.80      0.04      0.00                98.60

2013/02/10,00:05:01        all      0.02      0.00      0.03      0.00      0.00                99.95
2013/02/10,00:20:01        all      0.36      0.00      0.34      0.05      0.00                99.24
2013/02/10,09:20:01        all      0.42      0.00      0.54      0.03      0.00                99.01
2013/02/10,13:50:01        all      2.45      0.00      0.81      0.14      0.00                96.60
2013/02/10,22:20:01        all     23.91      0.00      1.23      7.79      0.00                67.08

■ちなみにユーザリソースのピーク(22:20)の原因は、「clamscandaily.sh」のログが
 一日のファイルの変更量が多く、2MBもあった。これはサーバの利用頻度に比例する。
 これをCRONがシステムメールで送る際にspamチェックと、clamavのチェックにかけていたため。
 「MAILTO=""」を追加して対応。
 ログは出しているし、必要なら「OK」を省いたシステムメールを送るスクリプトを別途記述すればよい。
 
 camavのチェックは何をしているのか。
 http://d.hatena.ne.jp/labunix/20130122

$ sudo find /var/log/ -type f -print | sudo grep "Feb  3 22\:[12][0-9]\:" `xargs` | \
  grep -v "Feb  3 22\:1[0-3]\:\|Feb  3 22\:2[6-9]\:" | \
  sed s%`hostname -s`%dummy-host%g | grep "clam\|mail" | \
  sort -t\: -k 2.3 -n | sed s/"\,\|\: "/"&\n"/g | grep size | sort -u
 size:
 size=2128013,
 size=2128524,

$ echo "2128013" | awk '{print $1/1024/1024"MB"}'
2.02943MB

■メモリは、「%memused」が日ごとの平均と、
 一週間のうち、メモリ使用量が増えたタイミングだけで充分でしょう。。。

$ for n in `seq -w 3 10`;do env LANG=C sar -r -f "/var/log/sysstat/sa${n}" | \
  sed s%^%"2013/02/$n,"%g ;done |   grep ^[0-9] | grep -v "Linux" | head -2 | tail -1
2013/02/03,00:00:01    kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit

$ for n in `seq -w 3 10`;do \
    env LANG=C sar -r -f "/var/log/sysstat/sa${n}" | grep Average | sed s%^%"2013/02/$n,"%g; \
  done
2013/02/03,Average:       470799   1523945     76.40    126202    739091   1255414     31.81
2013/02/04,Average:       174656   1820088     91.24    164063    916880   1251256     31.70
2013/02/05,Average:       133829   1860915     93.29    145373   1031054   1256412     31.84
2013/02/06,Average:       197307   1797437     90.11    174081    934154   1252349     31.73
2013/02/07,Average:       769225   1225519     61.44    169812    421379   1258852     31.90
2013/02/08,Average:       641970   1352774     67.82    201446    444173   1261966     31.98
2013/02/09,Average:       625756   1368988     68.63    218589    445176   1259962     31.92
2013/02/10,Average:       754269   1240475     62.19    183276    390616   1259533     31.91

$ for n in `seq -w 3 10`;do env LANG=C sar -r -f "/var/log/sysstat/sa${n}" | \
  sed s%^%"2013/02/$n,"%g ;done | \
  grep ^[0-9] | grep -v "kbmem\|Linux" | \
  awk '{if($4>TMP){MSG=$0";"MSG;TMP=$4}}END{print MSG}' | \
  sed s/";"/"\n"/g | sort -n -k 1

2013/02/03,00:05:01       789788   1204956     60.41    157648    382688   1251832     31.72
2013/02/03,00:20:01       789580   1205164     60.42    157800    382816   1251832     31.72
2013/02/03,00:50:01       789332   1205412     60.43    158100    382824   1251832     31.72
2013/02/03,01:05:01       789208   1205536     60.44    158220    382824   1251832     31.72
2013/02/03,01:35:01       788836   1205908     60.45    158560    382832   1251832     31.72
2013/02/03,01:50:01       788712   1206032     60.46    158708    382840   1251832     31.72
2013/02/03,02:05:01       788464   1206280     60.47    158936    382844   1251832     31.72
2013/02/03,02:20:01       788216   1206528     60.49    159172    382844   1251832     31.72
2013/02/03,02:50:01       787844   1206900     60.50    159548    382848   1251832     31.72
2013/02/03,03:05:01       787720   1207024     60.51    159692    382852   1251832     31.72
2013/02/03,03:20:01       787472   1207272     60.52    159948    382852   1251832     31.72
2013/02/03,03:35:01       787224   1207520     60.54    160216    382856   1251832     31.72
2013/02/03,03:50:01       786856   1207888     60.55    160524    382872   1251868     31.72
2013/02/03,04:05:01       786608   1208136     60.57    160736    382876   1251868     31.72
2013/02/03,04:20:01       786360   1208384     60.58    160932    382880   1251868     31.72
2013/02/03,04:35:01       786104   1208640     60.59    161156    382884   1251868     31.72
2013/02/03,04:50:01       785988   1208756     60.60    161380    382900   1251868     31.72
2013/02/03,05:05:01       785740   1209004     60.61    161616    382900   1251868     31.72
2013/02/03,05:20:01       785492   1209252     60.62    161852    382904   1251868     31.72
2013/02/03,05:35:01       785244   1209500     60.63    162128    382904   1251868     31.72
2013/02/03,05:50:01       784872   1209872     60.65    162428    382908   1251868     31.72
2013/02/03,06:05:01       784624   1210120     60.67    162716    382912   1251868     31.72
2013/02/03,06:20:01       784252   1210492     60.68    163028    382916   1251868     31.72
2013/02/03,06:35:01       784004   1210740     60.70    163356    382920   1251868     31.72
2013/02/03,06:50:01       783632   1211112     60.72    163652    382920   1251868     31.72
2013/02/03,07:05:01       783384   1211360     60.73    163944    382924   1251868     31.72
2013/02/03,07:20:01       783012   1211732     60.75    164240    382924   1251868     31.72
2013/02/03,07:35:01       781980   1212764     60.80    164568    382932   1253104     31.75
2013/02/03,12:05:01       736712   1258032     63.07    174360    409072   1265600     32.07
2013/02/03,12:20:01       604628   1390116     69.69    176092    535592   1265600     32.07
2013/02/03,12:35:01       480352   1514392     75.92    177920    653996   1266040     32.08
2013/02/03,12:50:01       351368   1643376     82.39    179568    777840   1265436     32.06
2013/02/03,13:20:01       351128   1643616     82.40    180012    777852   1265436     32.06
2013/02/03,15:05:01        17360   1977384     99.13     95052   1192600   1280328     32.44
2013/02/03,16:05:01        16460   1978284     99.17     65772   1290304   1262820     32.00
2013/02/03,16:20:01        16200   1978544     99.19     59748   1290688   1263148     32.01
2013/02/03,17:05:01        15712   1979032     99.21     31764   1327888   1263152     32.01
2013/02/06,23:05:01        14844   1979900     99.26    144496   1169348   1269008     32.15

■ちゃんとスワップしています。

$ env LANG=C sar -B -f "/var/log/sysstat/sa03" | head -3 | tail -1 | sed s%^%"2013/02/03,"%
2013/02/03,00:00:01     pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff

$ for n in `seq -w 3 10`;do \
    env LANG=C sar -B -f "/var/log/sysstat/sa${n}" | grep Average | sed s%^%"2013/02/$n,"%g; \
  done
2013/02/03,Average:        16.39     29.13    107.57      0.01     77.70      6.31      0.00      6.25     99.07
2013/02/04,Average:         0.51     10.05     92.61      0.00     62.19      0.50      0.00      0.49     98.45
2013/02/05,Average:         0.71     19.30    108.01      0.01     68.91      1.17      0.00      1.16     99.03
2013/02/06,Average:        17.40     16.14    106.80      0.00     62.31      2.80      0.00      2.79     99.75
2013/02/07,Average:         0.57     11.73     92.56      0.00     63.04      0.00      0.00      0.00      0.00
2013/02/08,Average:         0.02     10.18     88.28      0.00     55.13      0.00      0.00      0.00      0.00
2013/02/09,Average:         0.04      8.45     67.63      0.00     33.73      0.00      0.00      0.00      0.00
2013/02/10,Average:        10.95     10.47    102.76      0.00     66.61      0.08      0.00      0.07     77.28

$ for n in `seq -w 3 10`;do env LANG=C sar -B -f "/var/log/sysstat/sa${n}" | \
  sed s%^%"2013/02/$n,"%g ;done | \
  grep ^[0-9] | grep -v "pgfree\|Linux" | \
  awk '{if($10>TMP){MSG=$0";"MSG;TMP=$10}}END{print MSG}' | \
  sed s/";"/"\n"/g | sort -n -k 1

2013/02/03,15:05:01         1.00    747.31    150.41      0.02    366.05     81.61      0.00     77.53     95.00
2013/02/03,15:20:01         5.40    299.39    166.39      0.03    225.70     48.76      0.00     48.67     99.83
2013/02/03,15:50:01         0.12    103.15    118.25      0.00    105.60     20.51      0.00     20.51    100.00

$  sudo find /var/log/ -type f -print | sudo grep "Feb  3 22\:[025][05]:" `xargs` | \
   sed s%`hostname -s`%dummy-host%g
/var/log/cron.log.1:Feb  3 22:05:01 dummy-host /USR/SBIN/CRON[2189]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
/var/log/cron.log.1:Feb  3 22:20:01 dummy-host /USR/SBIN/CRON[2251]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
/var/log/cron.log.1:Feb  3 22:50:01 dummy-host /USR/SBIN/CRON[2415]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
/var/log/auth.log.1:Feb  3 22:05:01 dummy-host CRON[2187]: pam_unix(cron:session): session opened for user root by (uid=0)
/var/log/auth.log.1:Feb  3 22:05:01 dummy-host CRON[2187]: pam_unix(cron:session): session closed for user root
/var/log/auth.log.1:Feb  3 22:20:01 dummy-host CRON[2249]: pam_unix(cron:session): session opened for user root by (uid=0)
/var/log/auth.log.1:Feb  3 22:20:01 dummy-host CRON[2249]: pam_unix(cron:session): session closed for user root
/var/log/auth.log.1:Feb  3 22:50:01 dummy-host CRON[2413]: pam_unix(cron:session): session opened for user root by (uid=0)
/var/log/auth.log.1:Feb  3 22:50:01 dummy-host CRON[2413]: pam_unix(cron:session): session closed for user root

$ sudo swapon -s
Filename                                Type            Size    Used    Priority
/dev/sda2                               partition       1951888 5284    -1

■スワップ利用率が1%以上でメモリ使用率が70%以下ならば
 メモリ開放とスワップのリセットを行う。
 以前に書いたスクリプトが「test」以外がちゃんと動作していなかったので書き直した。

 オプションに「test」をつけると、
 スワップ利用率が0%以上でメモリ使用率が100%()以下ならば
 メモリ開放とスワップのリセットを行う。(つまり強制する)
 ※小数点以下切捨て

$ sudo ./autoclear.sh test
[Before]
2013/02/11,22:32:16,MEMUSED=59%,SWAPUSED=0%
             total       used       free     shared    buffers     cached
Mem:       1994744    1183648     811096          0     109716     393908
-/+ buffers/cache:     680024    1314720
Swap:      1951888          0    1951888
vm.drop_caches = 3
[After]
2013/02/11,22:32:16,MEMUSED=27%,SWAPUSED=0%
             total       used       free     shared    buffers     cached
Mem:       1994744     543732    1451012          0        780      24312
-/+ buffers/cache:     518640    1476104
Swap:      1951888          0    1951888

$ w3m -dump https://raw.github.com/labunix/sa_report/master/autoclear.sh
#!/bin/bash
set -e

# root check
if [ "`id -u`" -ne "0" ];then
  echo "Sorry,NotPermit User"
  exit 1
fi

# include /sbin,/usr/sbin PATH
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)

case $1 in
-t|test)
  SWAPLIMIT=0
  MEMLIMIT=100
  ;;
*)
  SWAPLIMIT=1
  MEMLIMIT=70
  echo "# Usage $0 [-t|test]"
  echo "# Default:"
  echo "#   SWAPUSED>0 && MEMUSED<70; -> clear cache and reset swap."
  echo "# -t|test"
  echo "# force clear, cache and reset swap"
  echo ""
  ;;
esac

MYDATE=`env LANG=C date '+%Y/%m/%d,%H:%M:%S'`
SWAPUSED=`free | grep ^Swap | awk '{printf "%d\n",($3/$2*100)}'`
MEMUSED=`free | grep ^Mem  | awk '{printf "%d\n",($3/$2*100)}'`

function kernel_mem_clear() {
    echo "[Before]"
    echo "$MYDATE,MEMUSED=${MEMUSED}%,SWAPUSED=${SWAPUSED}%"
    free
    sync;sync;sync
    sleep 1 && sysctl -w vm.drop_caches=3
    sync;sync;sync
    sleep 1 && swapoff -a && swapon -a
    echo "[After]"
    SWAPUSED=`free | grep ^Swap | awk '{printf "%d\n",$3/$2*100}'`
    MEMUSED=`free | grep ^Mem  | awk '{printf "%d\n",$3/$2*100}'`
    echo "$MYDATE,MEMUSED=${MEMUSED}%,SWAPUSED=${SWAPUSED}%"
    free
}

if [ "$SWAPUSED" -ge "$SWAPLIMIT" ];then
  if [ "$MEMUSED" -le "$MEMLIMIT" ];then
    kernel_mem_clear
  fi
else
  echo "$MYDATE,MEMUSED=${MEMUSED}%,SWAPUSED=${SWAPUSED}%"
fi
unset SWAPUSED MEMUSED SWAPLIMIT MEMLIMIT MYDATE PATH

exit 0