この度、結構負荷がかかりそうなシステムに携わったのでMPMについて調べた。
MPMとは、Apache HTTP サーバではリクエストを処理する部分のことと解釈している。
方式もいくつかあって、
•prefork
•worker
•perchild
•winnt
とある。デフォルトはprefork。こいつはプロセス形式。
で、今回はスレッド形式であるworker形式に変えてみた。
# 一般的に、プロセスよりスレッドのが軽量&高速と言われてるからという陳腐な理由だが。。。
具体的な方法。
@./configure時に、--with-mpm=workerを付ける。
Aインストール後、httpd.conf内のInclude conf/extra/httpd-mpm.confを有効化。
Bconf/extra/httpd-mpm.confの調整。
<IfModule mpm_worker_module>
StartServers 2
MaxClients 250
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 10000
</IfModule>
# StartServers:Apache起動時のサーバプロセス数
# MaxClients:クライアントからの最大同時接続数
# MinSpareThreads:スペアとして待機しているスレッドの最小数
# MaxSpareThreads:スペアとして待機しているスレッドの最大数
# ThreadsPerChild:各サーバプロセスがコンスタントに起動するスレッド数
# MaxRequestsPerChild:サーバプロセスが処理するリクエストの最大数。
# ここで指定した数の要求を処理すると、自動的にプロセスが消滅します。
# 0は無限に稼動しつづけます。
1つ注意点は、「MaxClients 250」÷「ThreadsPerChild 25」=「ServerLimit 10」となるように、
必ず割り切れる数を指定すること。でなければ怒られる。。。
WARNING: MaxClients (1024) is not an integer multiple of ThreadsPerChild (25),
lowering MaxClients to 1000 for a maximum of 40 child processes,
ついでに、連携先のTomcatの設定も記録。
@tomcat/conf/server.xmlの調整。
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"
connectionTimeout="180000" maxThreads="300"
minSpareThreads="10" maxSpareThreads="100"/>
・connectionTimeout・・・接続のタイムアウト値(デフォルト60000(60秒))
・maxThreads・・・リクエスト処理スレッドの最大数(デフォルトは200)
・minSpareThreads・・・スレッドプールに存在するスペア・スレッドの最低数(デフォルトは4)
・maxSpareThreads・・・スレッドプールに存在できるスペア・スレッドの最大数(デフォルト50)
※DBのmaxconnetion値や、WEBのMaxClients値よって、maxThreadsを調整。
Apacheからの再接続が発生した場合でも耐えれるようにちょっと多めに。
※maxThreadsと、minSpareThreadsはApacheの設定を基準にちょっと多めに。
※tomcat6からはConnector じゃなくて、executorに記述する!
とりあえずこんな感じで試してみる。
以上!!