そーだいなるらくがき帳

そーだいが自由気侭に更新します。

Apache2(httpd)の監視 ~ mackerel-plugin-apache2を読み解く

この記事は Mackerel プラグインアドベントカレンダー(全部CRE) の2日目です。

qiita.com

soudai.hatenablog.com

それでは2日目は mackerel-plugin-apache2 です。

ここではApacheの細かい説明は割愛します。

mackerel-plugin-apache2はWebServerとして広く使われているApache2専用のpluginです。 こちらは README.md にも書いてある通り、 server-status を可視化してくれるプラグインで簡単に導入することができます。

github.com

インストールと設定手順

プラグインプラグイン集として提供しているパッケージの mackerel-agent-plugins に含まれています。 インストール先は /usr/bin/mackerel-plugin-apache2 です。

mackerel-plugin-apache2のインストールはこれだけではなく、Apache Server側にも追加の設定が必要です。 httpd.confを適宜設定して下記の内容を追記してください。

Listen 1080
ExtendedStatus On
<VirtualHost 127.0.0.1:1080>
    <Location /server-status>
        SetHandler server-status
    </Location>
</VirtualHost>

これにより http://127.0.0.1:1080/server-status/ にアクセスするとApache2の情報が見れるようになります。 実際にはプログラムで整形しやすいように http://127.0.0.1:1080/server-status?autoにアクセスしており、下記のような出力になります。

Apache Server Statusのサンプル

mackerel-plugin-apache2はこの情報をパースしてグラフにしてくれるのです。 次にMackerelのプラグインはコマンドですので実行する事ができます。

※/usr/bin はPATHが通っているので省略出来ます

-- /usr/bin はPATHが通っているので省略出来ます
# mackerel-plugin-apache2  -p 1080
apache2.workers.busy_workers    1.000000        1511852690
apache2.workers.idle_workers    9.000000        1511852690
apache2.bytes.bytes_sent        20.000000       1511852690
apache2.cpu.cpu_load    0.564763        1511852690
apache2.req.requests    20.000000       1511852690
apache2.scoreboard.score-_      9.000000        1511852690
apache2.scoreboard.score-W      1.000000        1511852690
apache2.scoreboard.score-       246.000000      1511852690

設定ファイルであるmackerel-agent.confは標準では /etc/mackerel-agent/mackerel-agent.conf にインストールされます。 こちらに下記のとおり追記しましょう。

[plugin.metrics.apache2]
command = "mackerel-plugin-apache2  -p 1080"

以上を行った上でmackerel-agentを再起動してください。

見れるメトリック

server-statusで見れる情報についてはApacheの公式ドキュメントに纏まっています。

mod_status - Apache HTTP サーバ バージョン 2.4

稼働状況の表示(ステータス情報表示)

ですがもう少し具体的に見ていきましょう。

各グラフ定義ごとに説明します。 また表に出てくるdiffとはプラグイン上で差分値計算をするかどうかです。 となっている項目はプラグインで前回の実行時の値と差分値計算して出力しています。

Apache Workers

メトリック名(ラベル) プラグインの出力名 diff 説明
Busy Workers apache2.workers.busy_workers リクエスト処理中のサーバプロセス(スレッド)数
Idle Workers apache2.workers.idle_workers リクエスト待ち状態のサーバプロセス(スレッド)数

前述のコマンドでは下記の部分です。

apache2.workers.busy_workers    1.000000        1511852690
apache2.workers.idle_workers    9.000000        1511852690

現状のApacheのプロセスまたはスレッドの状態がわかります。

StartServers 60
MinSpareServers 60
MaxSpareServers 60
MaxClients 60

上記のようにApacheに設定されていた場合、常に busy_workers+idle_workers=60 となります。 例えばbusy_workersが多い場合はApacheが忙しいと言えますし100%になるとリクエストが捌けていない状態です。 この場合はWebServerの台数を増やしてロードバランシングするかアプリケーションをチューニングが必要です。 busy_workersがMaxClientsに達する前に気づく必要がありますのでbusy_workersがMaxClientsの7割程度でWarningのアラートを設定するのが良いでしょう。 逆にWebサービスとしてはアクセスされてなさ過ぎることも問題です。 その場合はidle_workersを監視して場合によってはWebServerの台数を減らすなどのチューニングを行いましょう。

Apache Bytes

メトリック名(ラベル) プラグインの出力名 diff 説明
Bytes Sent apache2.bytes.bytes_sent 1分間あたりの合計通信量

前述のコマンドでは下記の部分です。

apache2.bytes.bytes_sent        20.000000       1511852690

元になるserver-statusは合計通信量ですがプラグインで出力される値は前回の実行された値との差分となっています。 例えばアクセスが少ないが画像ファイルが大量にあるようなWebページがボトルネックになっているなどがわかります。 この場合は更にCDNに移行してどれくらいトラフィックが減ったかなどもわかります。

Apache CPU Load

メトリック名(ラベル) プラグインの出力名 diff 説明
CPU Load apache2.cpu.cpu_load CPU使用率(UNIX版)

前述のコマンドでは下記の部分です。

apache2.cpu.cpu_load    0.564763        1511852690

こちらはシステムメトリックスのload average5やcpuとは違いApacheのみの値になります。 そのため該当のホストのCPUの高騰がApache起因なのか、それとも他のアプリケーション起因なのか切り分けすることが出来ます。 例えばWebServerがバッチ処理を兼任している場合など併せて見ると便利です。

Apache Requests

メトリック名(ラベル) プラグインの出力名 diff 説明
Requests apache2.req.requests 1分間あたりの合計アクセス回数

前述のコマンドでは下記の部分です。

apache2.req.requests    20.000000       1511852690

元になるserver-statusは合計アクセス回数ですがプラグインで出力される値は前回の実行された値との差分となっています。 その名のとおり、Apacheに対するアクセス数です。 多く捌ければ捌けるほどホストを有効活用しているといえます。 他の値でアラートが来た時に想定どおりのアクセス数を捌けているかの確認することが大切です。

Apache Scoreboard

メトリック名(ラベル) プラグインの出力名 diff 説明
Waiting for connection score-_ リクエスト待ち
Starting up score-S 起動処理中
Reading request score-R クライアントからのリクエストを受信中
Sending reply score-W リクエストの処理実行、およびクライアントへレスポンス送信中
Keepalive score-K アイドル接続状態でリクエスト受信待ち
DNS lookup score-D ルックアップ中
Closing connection score-C 接続終了
Logging score-L ログ出力処理中
Gracefully finishing score-G gracefulリスタートにおける処理終了待ち
Idle cleanup score-I スレッド停止中
Open slot score- 起動してない状態

前述のコマンドでは下記の部分です。

apache2.scoreboard.score-_      9.000000        1511852690
apache2.scoreboard.score-W      1.000000        1511852690
apache2.scoreboard.score-       246.000000      1511852690

前述の引用元にも書いてありますがスコアボートは稼働中のプロセスの個々の状態です。 上記のプロセス数をカウントした合計値がMackerelに投稿されています。 そのため、アクセス数が少なく、プロセスに余裕があればOpen slotが増えますし、アクセスが増えれば逆に他のプロセス状態が増えます。 そのためApacheの状態を知りたいときはスコアボートを活用することが重要ですがMackerelはとてもわかりやすくスコアボートを可視化してくれていますので是非ご活用ください。

2日目はWebServerで2大巨頭のApache2のプラグインについての説明でした。 明日は皆さんお待ちかね、Webサーバの2大巨頭のもう一つ、nginxです。 引き続き、Mackerel プラグインアドベントカレンダーをお楽しみに!

3日目 mackerel-plugin-nginx