dev」カテゴリーアーカイブ

Apache を共有メモリ経由でモニタリングする

Apache のモニタリングと言えば mod_status を有効にして /server-status?auto にアクセスする方法が一般的にだと思います。

これは簡単でよいのですが MaxClients いっぱいまでリクエストが入ってこれ以上リクエストを受け付けられないような状態になると /server-status?auto にアクセスできずにモニタリングそのものができなくなります。(そもそもそういう状況を作ってはならないのですが、まあそれはとりあえず。)

server-status 用にワーカーを1つ予約できれば簡単なのですが、そういう設定は Apache にはないようです。もう少し探していると ScoreBoardFile という設定があることに気づきました。この設定にファイルを指定すれば、他のプロセスから統計情報にアクセスできるようです。

実際に FableTech Server Status for Apache というものがあり、これを使えば統計情報の内容を出力してくれます。ただ、これは C 言語で書かれて出力はもう少し加工したいので Python でアクセスするスクリプトを書いてみました。

https://github.com/jun66j5/apache-scoreboard/raw/master/apache-scoreboard.py

Apache の統計情報には ScoreBoardFile に指定したファイ名を apr_shm_attach() に渡すことで共有メモリにアクセスできます。このあたりは ctypes ライブラリを用いています。

スクリプトを試す前に以下のような設定を行いましょう。

LoadModule status_module modules/mod_status.so
ExtendedStatus On
ScoreBoardFile run/httpd.scoreboard

実際に試してみます。このスクリプトでは /server-status?auto と同じ出力が得られるようにしてあります。

$ sudo python ./apache-scoreboard.py /etc/httpd/run/httpd.scoreboard
Total Accesses: 2147
Total kBytes: 17961
Uptime: 5641
ReqPerSec: 0.380555
BytesPerSec: 3260.07
BytesPerReq: 8566
BusyWorkers: 0
IdleWorkers: 50
Scoreboard: ................................................................_________________________......................................................................................................._________________________.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

比較用に /server-status?auto の出力も上げておきます。

$ curl 'http://127.0.0.1/server-status?auto'
Total Accesses: 2148
Total kBytes: 17970
CPULoad: .0266784
Uptime: 5660
ReqPerSec: .379505
BytesPerSec: 3251.11
BytesPerReq: 8566.7
BusyWorkers: 1
IdleWorkers: 49
Scoreboard: ................................................................__W______________________......................................................................................................._________________________.......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

もっと細かい出力や監視サーバにデータを投げたい場合などは show_scoreboard() を変更するとよいです。