Apache のパフォーマンスをチューニングするときに知っておくべきこと

dev

Apache MPM

Apache を起動すると httpd プロセスが複数生成される。プロセスが複数あれば複数のリクエストを同時に処理することができる。複数のプロセスをどのように管理するかを設定できるモジュールがあって、これを Multi Processing Module 略して MPM と呼ぶ。

MPM には prefork, worker, event という3つの方式がある。prefork は1つのプロセスが1つのスレッドを持つシングルスレッド方式。worker は1つのプロセスが複数のスレッドを持つマルチスレッドプロセス方式。event は基本的には worker と似ているがプロセスを増やす挙動が異なる。

どの方式を採用しているかは httpd -V コマンドで、Server MPM の項目を確認するとわかる。

コアとかプロセスとかスレッドとか

  • コア: 実際に処理を行う部分。脳みたいなもの
  • プロセス: 実行中のプログラムのこと。同じプログラムでも複数起動すればプロセスを増やすことができる
  • スレッド: コアに対して要求する命令の単位。プログラムは命令の集合みたいなもので、それを順番に実行していく。そのひとつがスレッド

シングルスレッドは1つのプロセスが1スレッドだけを持っていて、マルチスレッドなら1つのプロセスが複数のスレッドを持つことができる。マルチスレッドのほうが複数の処理を同時に行えるのでパフォーマンスは良いが、プロセスごとにメモリ領域を共有しているのでスレッド間でメモリが重複しないような工夫が必要。

mpm worker の設定

自分の環境では worker 方式が使われているので、worker について。

mpm_worker で設定できる項目には次のようなものがある。

directive description
ThreadsPerChild プロセスごとに生成するスレッド数
ThreadLimit プロセスが持てるスレッドの上限
StartServers apacheの起動時に生成される初期プロセス数
MaxRequestWorkers 全体の最大スレッド数
ServerLimit プロセス数の上限
MinSpareThreads 待機スレッドの最小値
MaxSpareThreads 待機スレッドの最大値
MaxConnectionsPerChild 1プロセスの最大同時接続数

Server がプロセス、Thread がスレッドのことって感じみたい。

Apache 全体での最大同時接続数は ServerLimit x MaxConnectionsPerChild ということになる。

KeepAlive

1リクエストごとに接続を切断していては効率が悪い。そこで1コネクション(1セッション)の間に複数のリクエストを捌けるようにしようというの KeepAlive ディレクティブ。今はデフォルトでは On になっている。

しかし、接続時間が長すぎると使っていないのにリソースを保持したままになってしまい効率が悪くなる。この問題は MaxKeepAliveRequest や KeepAliveTimeout でコントロースする。MaxKeepAliveRequest は接続してから切断までにどれくらいのリクエストを受け付けるか、KeepAliveTimeout は接続しているセッションからリクエストが来なくなってから切断するまでの待ち時間を指定する。リクエスト数か待ち時間で接続を切断するというわけだ。

server-status

mod_status モジュールを有効にするとブラウザから Apache の動作状況を確認できる。コネクションとかスレッドの状況とか。

server-status を閲覧できるようにする

httpd.conf あるいは conf.modules.d/00-base.conf あたりを確認して

LoadModule status_module modules/mod_status.so

になっていることを確認する。mod_status をロードする記述があって、コメントアウトされていなければOK。

次にブラウザから閲覧できるように Location ディレクティブを設定する。読み込まれる設定ファイルのうち適切なものに次のように記述する。

ExtendedStatus On
<Location /server-status>
SetHandler server-status
Require all denied
Require ip 127.0.0.1
Require ip [アクセスを許可するIP]
</Location>

これでブラウザから http://localhost/server-status などにアクセスすると server-status を閲覧できる。ExtendedStatus は詳細な情報を表示する設定、不要ならば Off にする。設定ファイルの再読み込みを忘れないこと。

server-status の見方

ローカルで見るとして http://localhost/server-status にアクセスすると server-status が表示された。

状況は常に変わるので、自動更新させたい。こういうときはパラメータに refresh を使う。http://localhost/server-status?refresh=3 のようにすると3秒ごとにリロードしてくれる。

たくさん並んでいる . が空きスロット。W になっているものは処理中で、_ は待機スレッド。K は KeepAlive 状態のスレッド。. が多いようであればスレッド数を減らしても大丈夫。逆に K だらけになっているときは KeepAlive の値を小さくするか、KeepAlive の設定を無効にする。

Reference

タイトルとURLをコピーしました