これは何?

Apache のチューニングに使える情報を Datadog でモニタリングする手段を試した結果の共有です!

EC2 インスタンスサイズの最適化のためにサーバーのサイズに合わせて Apache をチューニングしたいという場合などに役立てば幸いです😌

構成図

理解しやすくなると思うので最終的な状態の構成図を先に見ていただきます!

登場する主な用語について

Amazon EC2 インスタンス

AWS の仮想サーバー
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instances-and-amis.html

Apache

Webサーバソフトウェア
https://httpd.apache.org/

status モジュール

Apache の状態を読み取ることができるモジュール
https://httpd.apache.org/docs/2.4/ja/mod/mod_status.html

Datadog

クラウド アプリケーションのための モニタリングとセキュリティ プラットフォーム
https://www.datadoghq.com/ja/

ゴールについて

Apache の status モジュールで読み取れる情報を Datadog ダッシュボードで表示する

前提

  • Datadog のインテグレーション設定で Apache Integration が有効になっている
  • AWS アカウントで EC2 インスタンスが起動している
  • EC2 インスタンス の OS は Amazon Linux 2 とする
  • EC2 インスタンス にはすでに Datadog エージェントがインストールされているものとする
  • EC2 インスタンス にはすでに Apache がインストールされているものとする
  • EC2 インスタンス の Apache のバージョンは 2.4 とする
  • EC2 インスタンス の Apache の MPM は event とする
  • EC2 インスタンス の Apache では VirtualHost を利用している前提とする

手順

EC2 インスタンスの Apache で status モジュールが有効になっているか確認する


以下のコマンドで現在 status モジュールがロードできているか確認します。

httpd -M | grep status

以下のような結果になったらすでに Apache で status モジュールが有効になっています。

# httpd -M | grep status
 status_module (shared)

上記で確認して有効になっていなかった場合は status モジュールを有効にします。
方法については割愛します。

EC2 インスタンスの Apache で status モジュール用の設定をする


今回は status モジュール用の VirtualHost として /etc/httpd/conf.d/localhost_vhost.conf を作成することにします。

vi /etc/httpd/conf.d/localhost_vhost.conf

以下の内容を保存します。

ExtendedStatus On
<VirtualHost 127.0.0.1:80>
  ServerName Localhost
  DocumentRoot /var/www/html
  ErrorLog /var/log/httpd/localhost.error.log
  CustomLog /var/log/httpd/localhost.access.log combined
  <Location /server-status>
    SetHandler server-status
    Require all denied
    Require ip 127.0.0.1
  </Location>
</VirtualHost>

設定のシンタックスチェックをします。

httpd -t

結果が Syntax OK になることを確認します。

設定を読み込ませるために Apache を再起動します。

systemctl restart httpd

EC2 インスタンスの Apache で status モジュールへの疎通確認をする

以下のコマンドを実行して status モジュールへの疎通確認をします。

curl http://localhost:80/server-status?auto

以下のような結果になれば疎通確認が成功となります。

# curl http://localhost:80/server-status?auto
localhost
ServerVersion: Apache/2.4.61 ()
ServerMPM: event
Server Built: Jul 16 2024 16:34:56
CurrentTime: Friday, 09-Aug-2024 08:45:51 UTC
RestartTime: Friday, 09-Aug-2024 08:26:35 UTC
ParentServerConfigGeneration: 1
ParentServerMPMGeneration: 0
ServerUptimeSeconds: 1155
ServerUptime: 19 minutes 15 seconds
Load1: 0.00
Load5: 0.00
Load15: 0.00
Total Accesses: 5
Total kBytes: 5
Total Duration: 1
CPUUser: .06
CPUSystem: .04
CPUChildrenUser: 0
CPUChildrenSystem: 0
CPULoad: .00865801
Uptime: 1155
ReqPerSec: .004329
BytesPerSec: 4.4329
BytesPerReq: 1024
DurationPerReq: .2
BusyWorkers: 1
GracefulWorkers: 0
IdleWorkers: 74
Processes: 3
Stopping: 0
ConnsTotal: 0
ConnsAsyncWriting: 0
ConnsAsyncKeepAlive: 0
ConnsAsyncClosing: 0
Scoreboard: _____________________________W_____________________________________________.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

EC2 インスタンスの Datadog エージェントの設定を変更する


以下のコマンドを実行して Datadog エージェントの Apache に関する設定ファイルのディレクトリの中身を確認します。

ls /etc/datadog-agent/conf.d/apache.d

以下のような結果が表示されます。

# ls /etc/datadog-agent/conf.d/apache.d
auto_conf.yaml  conf.yaml.example

この結果の中で auto_conf.yaml が存在する場合は注意が必要です。
これは Datadog エージェントがインストールされたときに自動で作成された設定ファイルになります。
ただ、今回のケースでは自動で作成された設定ファイルのままではやりたいことが実現できないため、このファイルはファイル名を変更して使えないようにします。
具体的には以下のコマンドを実行します。

mv /etc/datadog-agent/conf.d/apache.d/auto_conf.yaml /etc/datadog-agent/conf.d/apache.d/auto_conf.yaml_`date +'%Y%m%d'`

このコマンドを実行することでファイル名が auto_conf.yaml_20240809 のように末尾に年月日が付きます。

その後、今回のケースのために設定ファイルを新たに作ります。

vi /etc/datadog-agent/conf.d/apache.d/conf.yaml

中身は以下を書き込みます。

init_config:
instances:
  - apache_status_url: http://localhost:80/server-status?auto

今回のケースのための設定ファイルを作成したら Datadog エージェントを再起動して設定ファイルを読み込ませます。

systemctl restart datadog-agent

意図した通りに設定ファイルが読み込まれたかどうかを確認します。
具体的には以下のコマンドを実行します。

datadog-agent status

出力結果の中に以下のような項目が表示されていれば成功です。

=========
Collector
=========


  Running Checks
  ==============

    apache (4.5.1)
    --------------
      Instance ID: apache:XXXXXXXXXXXX [OK]
      Configuration Source: file:/etc/datadog-agent/conf.d/apache.d/conf.yaml
      Total Runs: 4
      Metric Samples: Last Run: 25, Total: 100
      Events: Last Run: 0, Total: 0
      Service Checks: Last Run: 1, Total: 4
      Average Execution Time : 62ms
      Last Execution Date : 2024-08-09 09:07:29 UTC (1723194449000)
      Last Successful Execution Date : 2024-08-09 09:07:29 UTC (1723194449000)

Apache の status モジュールで取得できる情報を Datadog で見てみる


今回は apache.performance.busy_workers という Apache でリクエストを処理しているワーカースレッドの数を表す項目について Datadog でデータの可視化を試みます。

この項目について公式ドキュメントでは以下のように説明されています。
https://docs.datadoghq.com/integrations/apache/?tab=host

The number of workers serving requests.

日本語訳 : リクエストを処理するワーカーの数

Apache のチューニング項目対象になるものとして MaxRequestWorkers, ThreadsPerChild, ServerLimit が挙げられると思います。

その際にそれらの値をチューニングする際に、実際にどんなリクエストがどれだけ来たらこれくらいの間にこれだけの数のワーカースレッドが処理中となることが分かればチューニングの助けになると思います。

そのため、今回は リクエストを処理するワーカーの数 に当たる apache.performance.busy_workers をモニタリングします。

モニターで見てみる

Datadog で apache.performance.busy_workers の値でのモニター作成を試みている様子が以下です。

query は以下のようにしています。

avg:apache.performance.busy_workers{host:【EC2 インスタンスの Datadog エージェントで設定されている hostname】} by {host}

ちゃんと値が取れていることが確認できました!

ダッシュボード見てみる


上記では以下を並べて確認しています。

  • Apache の リクエストを処理しているワーカースレッドの数 (apache.performance.busy_workers)
  • CPU 使用率
  • メモリ使用率

こうすることによってその時その時のリクエスト処理数とサーバーのリソース使用状況を見比べることができるので Apache のチューニングの参考として利用できるのではと思います。


以上です!