Webサービスなどを運用するにあたり、障害発生を未然に防ぐためにサーバ監視ツールを導入している方も多いかと思います。
検索すると多様なツールがあって選定に悩むところですが、高性能である必要性がなければ自作でいいじゃん!
ということで、PHPでお手軽にサーバリソースのモニタリングをやってみます。
環境
- CentOS 8
- PHP 8
- Apache(prefork MPM)
- MySQL
ロードアベレージ
// 過去1分間のロードアベレージを取得
$loadAverage = sys_getloadavg()[0];
if ($loadAverage > 1) {
// ロードアベレージが1を超えてたらアラートを飛ばす処理
}
ディスク
$diskFree = (int) disk_free_space('/') / 1024 / 1024; // 空き(MB)
$diskTotal = (int) disk_total_space('/') / 1024 / 1024; // 合計(MB)
if ($diskFree / $diskTotal < 0.1) {
// ディスク使用率が90%を超えてたらアラートを飛ばす処理
}
メモリ
// freeコマンドでtotal(メモリ合計)とavailable(利用可能な空きメモリ)の値を取得
[$memoryTotal, $memoryAvailable] = explode(' ', chop(`free -m | grep Mem | awk '{ print $2,$7 }'`));
if ($memoryAvailable / $memoryTotal < 0.1) {
// メモリ使用率が90%を超えてたらアラートを飛ばす処理
}
上記はfreeコマンドでavailableの項目がある事を前提としてます。
たとえばCentOS 6などは空きメモリを取得する方法が違ってきますが、ここでは割愛します。
メモリ(MySQL)
// psコマンドでMySQLプロセスのRSS (Resident Set Size)を取得
$mysqlRss = chop(`ps -u mysql uh | awk '{ print $6 }'`) ?: 0;
$mysqlRss = round($mysqlRss / 1024, 1); // MB
メモリ(Apache)
// psコマンドでApache親プロセスのRSSを取得
$apacheRss = chop(`ps -u root uh | grep httpd | grep -v grep | awk '{ print $6 }'`) ?: 0;
$apacheRss = round($apacheRss / 1024, 1); // MB
// pgrepコマンドでApache子プロセス数とUSS(Unique Set Size)合計を取得
exec('pgrep httpd -U apache | while read p; do cat /proc/$p/smaps | awk \'BEGIN { a = 0 } /Private/ { a += $2 } END { print a }\'; done', $apacheProcesses);
$apacheCount = count($apacheProcesses);
$apacheUss = round(array_sum($apacheProcesses) / 1024, 1); // MB
$apacheAverage = round($apacheUss / $apacheCount / 1024, 1); // MB
上記はMPMがpreforkである事を前提としてます。
他のMPMやnginxなどの場合は、それに合わせて作るようにしてください。
メモリ(slab)
// meminfoからslabのメモリ使用量を取得
$slab = chop(`cat /proc/meminfo | grep Slab | awk '{ print $2 }'`);
$slab = round($slab / 1024, 1); // MB
メモリ(tmpfs)
// dfコマンドからtmpfsのメモリ使用量を取得
$tmpfs = chop(`df -k | grep tmpfs | awk '{ a += $3 } END { print a }'`);
$tmpfs = round($tmpfs / 1024, 1); // MB
cronでログ保存
上記のようなスクリプトをcronで毎分実行してログファイルに保存。
今回はCSV形式でログを残しておいて、Google Chart Toolsを使用してグラフ化してみました。
ついでにCPU使用率や転送量なども表示できるようにしています。
CPU使用率などはvmstatコマンドから算出、
転送量は/proc/net/devの情報をログに残しつつ、前回ログとの差分から毎分の転送量を算出してます。
さいごに
OSSの監視ツールなどには到底かないませんが、お手軽&超軽量なので、興味ありましたらぜひご参考ください。