MPMの設定
Apache2.4よりMPMの切り替えがモジュールで変更可能になり、prefork
、worker
に加えてevent
が追加されています。
prefork
スレッド処理方式を行なわず、コネクションに対して親プロセスより子プロセスをforkする事でリクエストを処理します。
スレッドセーフでないライブラリとの互換性をとるために、スレッドを避ける必要のあるサイトでは、このモジュールの使用が適切。
あるリクエストで発生した問題が他のリクエストに影響しないように、個々のリクエストを単離するのにも、最適。
主な制御パラメータ
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 256
MaxRequestWorkers 256
MaxConnectionsPerChild 0
worker
マルチスレッドとマルチプロセスのハイブリッとMPM
preforkと違い、1スレッドを1プロセスで処理する。
主な制御パラメータ
ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
event
ひとつのプロセスで複数のリクエストを処理するらしい。
preforkにしろworkerにしろkeep-aliveを有効化したときに新しい接続が来た場合は新しいプロセスを立ち上げて処理していて、
keep-alive待ちのプロセスはタイムアウト待ちまで待ち続けるという事が起きていたが、
eventではkeep-alive周りの処理を整理し、HTTPに関してはひとつのプロセスで複数の処理を行なえる。
ThreadsPerChild = 10
ServerLimit = 4
AsyncRequestWorkerFactor = 2
MaxRequestWorkers = 40
ThreadsPerChild
プロセスの開始時に作成される初期スレッド値。
AsyncRequestWorkerFactor
スレッド毎の同時接続数制限。
MaxRequestWorkers
最大同時スレッド数。
昔でいうところのMaxClients
この値はThreadsPerChild
の整数倍の数であえる必要がある。
AH00513: WARNING: MaxRequestWorkers of 85 is not an integer multiple of
ThreadsPerChild of 10, decreasing to nearest multiple 80,
for a maximum of 8 servers.
ServerLimit
プロセスの設定可能上限ThreadsPerChild
とServerLimit
の乗数がMaxRequestWorkers
くらいを目安に設定。MaxRequestWorkers
より大きい値は設定しない。
MaxRequestWorkers = ThreadsPerChild * ServerLimit
最大接続数の計算
max_connections = (ThreadsPerChild + (AsyncRequestWorkerFactor * idle_workers)) * ServerLimit
= (10 + (2 * 10)) * 4 = 120
max_connections = (AsyncRequestWorkerFactor + 1) * MaxRequestWorkers
= (2 + 1) * 40 = 120
idle_workers
は実際のサーバ上アイドルプロセス数のこと。動的に変動する部分。
サービスイン前はThreadsPerChild
と同じ値になる。
最大接続数を256
くらいとしたい場合、MaxRequestWorkers
とServerLimit
を調整するのがいいのか。