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
- Apache の MaxClients の適正値
- MaxClients / MaxRequestWorkers に関する言及を時系列順にまとめたもの。基本的にメモリの値を参考に設定すれば良いことがわかる。メモリの取得、適正値の計算方法などもあって参考になる
- apacheのMaxClientsの適正値調べた. 2008.
- 理論値から実際に設定してみているものの一例。
- Apacheパフォーマンス・チューニングの実践
- 各ディレクティブの意味などを解説している良記事だが少し古いかも。worker の設定ではなさそうなので雰囲気だけ掴んだ
- ApacheのMPMを設定を確認する
- 丁寧に公式ドキュメントを参照しにいっている信頼できる記事。各方式の内容を深く確認したあとベンチマークテストまで行っていて参考になる
- worker MPMの設定
- workerに焦点を当てて解説している記事。他よりちょっと詳しい MaxConnectionsPerChild が元々 MaxRequestsPerChild だったことはこの記事で知った
- Apache設定を変えたことによりアプリが爆速になった話
- デフォルトでオンになっていた KeepAlive 設定のせいで事故った話。