7
4

More than 1 year has passed since last update.

PHPでお手軽にサーバリソースをモニタリング

Last updated at Posted at 2021-09-29

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で毎分実行してログファイルに保存。

sample.png

今回はCSV形式でログを残しておいて、Google Chart Toolsを使用してグラフ化してみました。
ついでにCPU使用率や転送量なども表示できるようにしています。
CPU使用率などはvmstatコマンドから算出、
転送量は/proc/net/devの情報をログに残しつつ、前回ログとの差分から毎分の転送量を算出してます。

さいごに

OSSの監視ツールなどには到底かないませんが、お手軽&超軽量なので、興味ありましたらぜひご参考ください。

7
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4