Apache2系のMPMについてまとめた
Apache2系のMPM(Multi Processing Module)についてまとめてのでメモ。
MPMとは
Apacheの並列処理を行うモジュール。
環境やOSによる機能や実装の違いをモジュール化し、利用する環境に対応。
種類
Apache2.2系
- prefork(デフォルト) / worker / perchild / winnt etc...
Apache2.4系
- event mpmが追加(デフォルト)
以下、代表的なMPMであるpreforkとworkerの違いを比較してみた。
prefork | worker | |
---|---|---|
リクエストの処理方法 | マルチプロセス型 | マルチプロセス+マルチスレッド型 |
プロセス / スレッドの割り当て | 1リクエストに1プロセスを割り当てる。 | 1リクエストに1スレッドを割り当てる。 |
メモリの扱い | 各プロセスが独立して取得する | 1プロセスが取得したメモリを各スレッドが共有する。 |
メリット | 各プロセスは独立しているので、1つがコケてもWebサーバは稼働可能。 | プロセスを切り替えることが無いので処理は高速。 |
デメリット | プロセスの切り替えが発生するのでメモリを使う。 | メモリを共有するため、1つのスレッドの不安定な挙動が連鎖することも。 |
補足 | 1プロセス内に生成されるスレッド数は固定。リクエスト数に応じてプロセス数を増減。 |
スレッドは1プロセス内に生成される処理の単位
デフォルト設定
prefork
StartServers 8 # 最初に起動する子プロセスの数 MinSpareServers 5 # 待機する子プロセスの最小数 MaxSpareServers 20 # 待機する子プロセスの最大数 ServerLimit 256 # MaxClientsに設定可能な上限値 MaxClients 256 # 生成する子プロセスの最大数 MaxRequestsPerChild 4000 # それぞれの子プロセスが扱うリクエスト数の制限数
- MaxRequestsPerChildに設定された値の数のリクエストを処理したら、新しく子プロセスを生成し直す。
- 大量のアクセスをさばきたい場合はMaxClientsの値を増やせばよいが、その分メモリ消費量が大きくなる。
worker
StartServers 2 # 最初に起動する子プロセスの数 MinSpareThreads 25 # アイドル状態のスレッド最小数 MaxSpareThreads 75 # アイドル状態のスレッド最大数 ThreadsPerChild 25 # 子プロセスそれぞれに生成されるスレッド数 MaxClients 150 # 生成する子プロセスの最大数 MaxRequestsPerChild 0 # それぞれの子プロセスが扱うリクエスト数の制限数
workerの場合、ServerLimitは以下の「最大サーバプロセス数」の結果が16(デフォルト)を上回る場合に設定するとよい。
MaxClients(総スレッド数) / ThreadsPerChild(1子プロセスが生成するスレッド数) = 最大サーバプロセス数
またworkerにはThreadLimitという設定値もある。ThreadLimitとは、
- Apacheプロセス稼働中におけるThreadsPerChildに設定可能な上限値。
- デフォルト64
- ThreadsPerChildよりもずっと大きな値に設定された場合は、余計な未使用共有メモリが割り当てられるため注意。
event moduleについて
2.4系から新しく追加され、デフォルトになったMPM、「event」についても少し触れます。
- KeepAlive問題に対応したworker版
- "This MPM tries to fix the 'keep alive problem' in HTTP."
http://httpd.apache.org/docs/2.4/ja/mod/event.html - KeepAliveのタイムアウト待ち時間中に別のリクエストを処理できる。
- "This MPM tries to fix the 'keep alive problem' in HTTP."
- KeepAlive問題に対応できるのはHTTP通信の場合のみ。SSL通信時はworker版と同じ。
- マルチプロセス + マルチスレッド
一般的にはworkerの方がpreforkよりも性能が良いと言われているようですが、サービス(システム)への向き不向きについても今後調べてみたいと思います。
また、keep Alive問題については以下のエントリを参考にさせて頂きました。