最終更新:2020-02-25 (火) 16:23:16 (1520d)  

Apache/MPM
Top / Apache / MPM

Multi-Processing Modules (MPMs)

種類

Apache/MPM/prefork

  • Apache HTTP サーバ 1.3 系以前のモデル
  • 1 つのリクエストに対して、1 プロセスを割り当てる (メモリを使う)
  • 負荷に応じて、子プロセスを増減させる
    # prefork MPM
    # StartServers: number of server processes to start
    # MinSpareServers: minimum number of server processes which are kept spare
    # MaxSpareServers: maximum number of server processes which are kept spare
    # ServerLimit: maximum value for MaxClients for the lifetime of the server
    # MaxClients: maximum number of server processes allowed to start
    # MaxRequestsPerChild: maximum number of requests a server process serves
    <IfModule prefork.c>
    StartServers       8
    MinSpareServers    5
    MaxSpareServers   20
    ServerLimit      256
    MaxClients       256
    MaxRequestsPerChild  4000
    </IfModule>
  • PHPを動かすサーバでは、preforkの選択が無難

Apache/MPM/worker?

  • スレッド対応型
  • リクエスト処理は、スレッドが対応する
  • 負荷に応じて、子プロセス数を増減させる
  • 1 子プロセスあたりのスレッド数は固定になっている
  • マルチスレッドでメモリ消費も少ないけど若干バギー
    # worker MPM
    # StartServers: initial number of server processes to start
    # MaxClients: maximum number of simultaneous client connections
    # 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
    # MaxRequestsPerChild: maximum number of requests a server process serves
    <IfModule worker.c>
    StartServers         2
    MaxClients         150
    MinSpareThreads     25
    MaxSpareThreads     75
    ThreadsPerChild     25
    MaxRequestsPerChild  0
    </IfModule>

Apache/MPM/event

  • A variant of the worker MPM with the goal of consuming threads only for connections with active processing
  • Apache 2.2
  • RHEL 8/CentOS 8ではeventがデフォルト

perchild?

  • スレッド数だけが増減する仕組み
  • Apache 2.2で削除

winnt

  • スレッド対応型
  • リクエスト処理は、スレッドが対応する
  • Windows NT に特化したスレッドモデル

確認方法

/usr/sbin/apachectl -V

すると

Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"

とか表示される

なぜ、Apache 2 のマルチスレッド MPM モードを実運用環境で使用するべきではないのですか?

PHP はグルー(糊)です。このグルーは、多くのサードパーティ製のライブラリを くっつけることによりクールな Web アプリケーションを構築するために使用され、 直観的で簡単に習得できる言語インターフェイスにより、一つの整合性のある実体として 見せることができます。 PHP の柔軟性と力は、プラットフォームの安定性と堅牢性に基づいています。 グルーによる結合をするためには、OS や Web サーバ、サードパーティ製のライブラリを 必要とします。 これらの一つの機能が停止した場合、PHP は問題を特定し、速やかに修正する 手段を必要とします。 実行スレッドを完全に分離しなかったり、 メモリセグメントを完全に分離しなかったり、 各リクエストで使用される強力なサンドボックスを有さないことで、 基本的なフレームワークをより複雑なものにした場合、 PHP のシステムに弱点が生まれます。

マルチスレッド MPM を使用する必要がある場合、 PHP が自分のメモリ空間で実行される FastCGI 設定を観てみてください。

最後に、この警告はマルチスレッド MPM の使用に対するものですが、 Windows システムではより多くのライブラリがスレッドセーフである傾向が あるため、この警告の度合はより弱くなります。

参考