apache MPM(Multi-Processing Module)について調査と設定修正を行いました。MPMは今まで明確に意識していなかったところもあり、今回は少し突っ込んで調べてみましたので、その内容を記録しておきます。
もし、MPMについて今まで意識していなかった方で、以下のようなサイトをお持ちの方がいれば、MPMの設定を再確認したほうが良いかもしれません。
- アクセス数は言うほど多くはないが、CPU負荷が高い!
- アクセス数は言うほど多くはないが、WordPressが重い!
ちなみに、私の環境は、CentOS(6系)+apache(2.4系) + PHP(5.4系) + MySQL + WordPress です。WordPressの動作が遅い事に悩んでおり、その過程でまずはベースとなるapacheの設定を見直した次第です。
作業概要と結果
作業概要と結果を先にお知らせします。
MPM関連で設定を修正し、高かったCPU負荷が下がり、WordPressの動作も軽くなりました。(WordPressの動作が軽くなったのは、経過観察が必要ですが。)
お恥ずかしながら、apacheのMPM関連の設定でマズいところがあり、そこを修正した次第です。httpd.conf の中でMPM関連の設定が入っている「httpd-mpm.conf」を呼び出す必要があったのですが、コメントアウトしたままになっていました・・・。
CPU負荷も高い状態になっていたのですが、かなり低減しました。以下は抜粋ですがCPU負荷(Processor load 1 min average)のグラフです。グラフがある程度平坦になったあたりが、apacheの設定を変更したタイミングです。
今のところの稼働実績は3日間ですが、今後もCPUの低負荷状態は続くかと思います。
MPMについて
Apache 2.0以降では、MPM(Multi-Processing Module)という基本モジュールの仕組みを採用しています。プロセスの挙動として prefork と worker がありましたが、apache 2.4以降では、event がデフォルトのMPM になりました。
それぞれのマルチプロセッシングモジュールの特徴は以下になります。
- prefork
- マルチプロセス
- スレッドを使わず、先行して fork を行なうウェブサーバを実装
- スレッドを避ける必要のあるサイトでは、このモジュールの使用が適切
- worker
- マルチスレッドとマルチプロセスのハイブリッド型 ウェブサーバを実装
- event
- workerの一種でマルチスレッドで動作する
- Keep-Aliveの処理を別のスレッドに割り振って通信を処理する
今回、MPMを event に設定した事になります。
作業後の設定内容
組み込まれているモジュールの確認結果は以下となります。
# ./httpd -l Compiled in modules: core.c mod_so.c http_core.c event.c # ./httpd -M | grep mpm mpm_event_module (static) #
event が入っています。
次に、conf ファイルの event MPM に関する設定になります。
まずは、httpd.conf です。
# Server-pool management (MPM specific) Include conf/extra/httpd-mpm.conf
コメントは外してあります・・・。
次に、httpd-mpm.conf です。
# event MPM # StartServers: initial number of server processes to start # MinSpareThreads: minimum number of worker threads which are kept spare # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadsPerChild: constant number of worker threads in each server process # MaxRequestWorkers: maximum number of worker threads # MaxConnectionsPerChild: maximum number of connections a server process serves # before terminating <IfModule mpm_event_module> StartServers 2 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestWorkers 150 MaxConnectionsPerChild 0 </IfModule>
※値としてはデフォルトのままです。
次に psコマンドでのプロセス数とスレッド数の確認結果です。(conf は反映されています。)
# ps -ef|grep httpd | grep -v grep | wc -l (←プロセス) 3 # ps -efL|grep httpd | grep -v grep | wc -l (←スレッド) 55 #
confファイルの設定と合致する、想定通りの値に収まっています。
今後、CPU負荷状況などを定期的に確認しながら値を変更する事もあると思いますが、とりあえず現時点での状況は以上です。このまま良い状態が続けば良いのですが。
Pingback: apache MPM設定を見直したら、CPU負荷が下がりWordPressが軽くなった | Check!Site : ちゅどん道中記