CPU使用率を検出してアラート

ここ最近ずっと課題になっていたのがサーバーが過負荷になったときどうやって検知するのかということ、プロセスダウンでもすればわかりやすいがCPU使用率が危険な状態というのはどうしようかといろいろ探してみた。vmstatやtopを使う方法が一般的ですが、topコマンドがRHLとBSDで使い勝手が違いがあったので単純なvmstatを選びました。

どこかに載っていたコマンドですが
/usr/bin/vmstat|/bin/grep -E “^ ?[0-9]”|/usr/bin/awk ‘{print$18}’

このようにgrepでヘッダ部分を省きawkを利用してcpuの部分(BSDだと18番目)を抜き出す。
但し、ウチのBSDだとvmstatの1発目が正確な値を表示してくれないので2回分出力して2行目を取得。
そうするとコマンドはこのようになる。

/usr/bin/vmstat 1 2 | /usr/bin/tail -1 | /usr/bin/awk ‘{print$18}’

grepよりかtail -1の方が簡単だな。
これをアラート設定込みでシェルスクリプトに組み込んだのが下の例です。

#!/bin/sh

TO=webmaster@example.com
CC=user1@example.com

idle=`/usr/bin/vmstat 1 2 | /usr/bin/tail -1 | /usr/bin/awk ‘{print$18}’`
cpu=`expr 100 – $idle`

if [ 90 -lt $cpu ]
then
echo “CPU = $cpu” | mail -s “CPU Alert” -c $CC $TO
fi

exit 0

MySQLでテーブル定義だけエクスポート

SHOWやDESCでは見づらいのでSQL文で定義を見たい、でもデータは不要…と、phpMyAdminがあればそんなことは任せればよいのだが実環境では用意されていないことのほうが多い。そこでどうやって定義を抽出しているのか調べたら、phpMyAdminのインポート・エクスポートはmysqldumpをラッピングしているという情報を得た。ということはmysqldumpを使えば良いと言う事。結局それか…と思いデータを出力しないオプションを探す。

> mysqldump -h[ホスト] -u[ユーザ名] -p[パスワード] -d [データベース名] [テーブル名]

でOKだった。

ソケットの数のOS上限

オンラインゲームを作るに当たり全く考えてなかった問題があった。OSレベルでのファイルオープン数制限である。ソケットもOSレベルではファイルポインタとして扱われている為この制限にかかる。

C言語のプログラミングレベルであればFD_SETSIZEの定義を変えれば良いがそれだけではOSの制限は超えられない。調査方法は下記のコマンドを実行する。

Linuxの場合
# ulimit -a

この結果Linux系はデフォルトが1プロセス当たり1024個までのようだ。
これは少なすぎなのでRedHat系であれば/etc/security/limits.confに上限値を
入れてリログすると適用されるっぽい。

FreeBSDの場合
# limit
cputime unlimited
filesize unlimited
datasize 524288 kbytes
stacksize 65536 kbytes
coredumpsize unlimited
memoryuse unlimited
vmemoryuse unlimited
descriptors 7264
memorylocked unlimited
maxproc 3632
sbsize unlimited

FreeBSDは7264が上限になってた、これだけあれば大丈夫かな。