はじめに
サーバーを管理していると重く感じることがあり、その時SSHでLAを確認したりしています。
しかし、いちいち入るのが面倒なので、鯖落ちも考えて外部に記録するようにしてみました。
なるべくシンプルで導入の手間がかからないようにするために、新たに何かしらの監視ツールを導入をすることはしません。
用意するもの
- shellscript
- cronの実行権限
- phpを実行できる外部サーバー
shellscript
簡単に言うと、LAとunixtimeをGETで渡すだけである。
la_log.sh
# /bin/sh
## LAを/proc/loadavgから直接取る。なお5分間隔で記録するため5分毎のLA値を得る
LA5=`cat /proc/loadavg | awk '{print $2}'`
## LAを記録したUnixTimeを得る
UT=`date +%s`
## 記録する外部サーバーを記述する
LOG={yourExternalServer}/._la.php
## 外部サーバーにGETで値を渡す
wget -O - "${LOG}?la=${LA5}&ut=${UT}" 1>/dev/null 2>&1
exit
cron
今回は5分毎のLA値を取得しているため、記録も5分毎に実行する
*/5 * * * * {yourSavedPath}/la_log.sh
外部サーバー
これはPHPを実行して保存するために用意する。
同じネットワークでもいいし、レン鯖でもいい。
._la.php
<?php
// タイムゾーンを東京に設定。
date_default_timezone_set('Asia/Tokyo');
// UnixTimeが送られて来たらそれを使う。ないならこっちの時間を使う。
$_UT = ($_GET[ut]) ? $_GET[ut] : time();
if (!$_GET[la]) exit(1); // そもそもLAがないなら終了
// LOGのファイル名とフォーマットを決める。なおUnixTime依存
$LOGFILE = './_LA/'.date("ymd",$_UT).'.log'; // あらかじめ./_LA/を作成しておく
$LOGFORMAT = date("H:i:s",$_UT).'<>'.$_GET[la]; // HH:MM:SS<>LAのような書式である
if ($LOGFILE, $LOGFORMAT."\n", FILE_APPEND) ) // ログは追記モードで追加する
echo $LOGFORMAT; // ログの書き込みが成功すれば書き込みを返す
else
echo -1; // 失敗すれば-1を返す。
?>
運用方法
これらを正しく設置すれば、外部に5分毎のLAが記録される。
間隔が短いのであれば/proc/loadavから15分ごとの値を取って記録してもいい。
また戻り値をローカルに保存しておいてもいい。
外部では記録された値を加工して見やすくしたり、統計を取ったりできる。
鯖落ちしていたりすると記録されないので、直前の記録からどのように落ちたか簡易的に想像できたりするかな。