ApacheのMPM、「prefork」と「worker」を切り替える方法

Apacheは2.0から、起動時にMPM(Multi-Processing Modules)という基本モジュールが選択できるように設計されています。

Apache 2.0 では、 このモジュール化された設計をサーバの基本機能にまで拡張しました。 サーバには精選されたマルチプロセッシングモジュール (MPM) が付いてきて、これらはマシンのネットワークポートをバインドしたり、 リクエストを受け付けたり、リクエストを扱うよう子プロセスに割り当てたり、 といった役割を持ちます。
マルチプロセッシングモジュール (MPM) – Apache HTTP サーバ

CentOSにパッケージされているApacheでは、マルチプロセスのpreforkと、マルチプロセス+マルチスレッドのworkerを選択することができます。

# httpd -V
Server version: Apache/2.2.3
Server built:   Aug 30 2010 12:28:40
Server's Module Magic Number: 20051115:3
Server loaded:  APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture:   64-bit
Server MPM:     Prefork
  threaded:     no
    forked:     yes (variable process count)

スレッドを使わず、先行して fork を行なう ウェブサーバを実装しています。
prefork – Apache HTTP サーバ

# httpd.worker -V
Server version: Apache/2.2.3
Server built:   Aug 30 2010 12:31:04
Server's Module Magic Number: 20051115:3
Server loaded:  APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture:   64-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)

マルチスレッドとマルチプロセスのハイブリッド型サーバを 実装しています。リクエストの応答にスレッドを使うと、 プロセスベースのサーバよりも少ないシステム資源で、 多くのリクエストに応答することができます。
worker – Apache HTTP サーバ

このへんをうまく使い分けると、効率の良いサーバ運用に繋がります。

例えば、サーバ運用の良書「サーバ/インフラを支える技術」にもリバースプロキシ用途のサーバでは、workerモデルを使いましょう。ということで、以下の記述があります。

リバースプロキシではなるべく多数のクライアントを同時に処理することができることが望ましく、クライアントあたりにプロセス1つを割り当てるpreforkモデルよりも、クライアントあたりにスレッド1本で済ませる「wokerモデル」のほうがベターです。
[24時間365日] サーバ/インフラを支える技術 ~スケーラビリティ、ハイパフォーマンス、省力運用

使い分け大事!ということで、MPMの切り替えについてまとめておきます。

MPMの切り替え

Apacheのデフォルトは、preforkで起動するように設定されています。

# apachectl -V | grep 'Server MPM'
Server MPM:     Prefork

これをworkerモードで起動するように設定してみます。

変更は、「/etc/sysconfig/httpd」ファイルの「HTTPD=/usr/sbin/httpd.worker」の行をコメントアウトしてApacheを再起動することで設定されます。

# vi /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
# /etc/init.d/httpd restart

確認してみます。

# apachectl -V | grep 'Server MPM'
Server MPM:     Worker

これで、変更設定完了です。

PHPを使う場合は注意

「/etc/sysconfig/httpd」ファイルに以下のコメント行があります。

# available, but does not work with some modules (such as PHP)

簡単に試してみた感じだと、workerモードでは、「php-mbstring」や「php-mysql」などのPHP拡張機能が使えない感じでした。

また、実際の運用の結果として以下のような記事もありました。

- apacheはpreforkで動作させる
これは高速化ではなく、むしろ鈍速化。
以前フォト蔵でworkerで動作させていたのですが、不安定だったのでpreforkに戻しました。
ウノウラボ by Zynga Japan: PHPで書かれたwebサービスを高速化する

ということで、PHPを動かすサーバでは、preforkの選択が無難な感じなので、このへんは注意が必要です。

カテゴリー: サーバ・インフラのこと   タグ: , ,   この投稿のパーマリンク

トラックバック

ApacheのMPM、「prefork」と「worker」を切り替える方法 への1件のコメント

  1. ピンバック: チューニンガソン#4に参加してきた | 大発見 | 大発見

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>