Apache Workerモードで接続数アップ

Apache 2.2系の動作モードについて書きます。

■ Prefork と Worker

Apache 2.2系には動作モードが2種類あります。
Apache にはマルチプロセッシングモジュール(MPM)というものがあって、これを切り替えることで動作モードを切り替えます。

MPM には Prefork と Worker があります。

Preforkモード

これがデフォルト。
マルチプロセス、シングルスレッドモードです。
1接続=1プロセスです。
1人の1アクセスがサーバー上でApacheプロセスを1つ起動します。
もう1回アクセスすると別のApacheプロセスをもう1つ起動します。

Workerモード

マルチプロセス、マルチスレッドモードです。
1接続=1スレッドです。
1プロセスのスレッド数は ThreadsPerChild(デフォルト 25)で指定します。
1人の1アクセスがサーバー上のApacheプロセス内のスレッドを1つ起動します。
もう1回アクセスすると同Apacheプロセスのスレッド上限に余裕があればスレッドをもう1つ起動します。
こちらのほうが圧倒的にメモリ消費は少なくレスポンスのスピードが速いです。

★ただし、マルチスレッドに対応していないApache拡張モジュール(mod_xxxxx)が使えません。
(アクセス数が少ないと正常に使えるように見えますが、アクセス数が増えると誤動作します)
★致命的なのが mod_php で、PHPの php-mbstring や php-mysql がだめです。
★要するに WordPress や EC-CUBE が動かないということです。
(一見動いているように見えるかもしれませんが、そのうち誤動作でデータが消えたりします)

■ Prefork と Worker 切替方法

/etc/sysconfig/httpd


#HTTPD=/usr/sbin/httpd.worker


デフォルトでは上記の HTTPD がコメントアウトされています。
これをコメント解除すると Workerモードになります。
またコメントアウトすると Preforkモードになります。

設定ファイルを変更したらApacheを再起動します。

/etc/init.d/httpd restart

■ Prefork と Worker 性能比較

PreforkモードとWorkerモードでどのくらいの性能差があるのでしょうか?

客観的な数値データはありません。
経験上、大体のざっくりした話です。

★Preforkモードは1つの基準として同時接続数 100 というのがあります。
Preforkモードだと、CPU2コア メモリ2GBくらいのスペックだと、1サーバーに1ホームページのみの運営で、アクセスが同時に100接続来るとCPU負荷やディスクの遅延がひどくなり大体限界が来ると思います。

同じサーバーで、Workerモードに切り替えると、同時接続数 300~400 くらい大丈夫になります。(もちろんホームページのつくりによります)

ただし mod_php を使う限り、WordPress など PHP を使うブログは運営できません。これが落とし穴です。
では、mod_php を使わず別の方法で PHP を使えば・・・、それはまた別の機会に。

コメントを残す