めもめも のーと

ハマったこととか、覚えたこととか

Apache2系のMPMについてまとめた

Apache2系のMPM(Multi Processing Module)についてまとめてのでメモ。

MPMとは

  • Apacheの並列処理を行うモジュール。

  • 環境やOSによる機能や実装の違いをモジュール化し、利用する環境に対応。

種類

  • Apache2.2系

    • prefork(デフォルト) / worker / perchild / winnt etc...
  • Apache2.4系

    • event mpmが追加(デフォルト)

以下、代表的なMPMであるpreforkとworkerの違いを比較してみた。

prefork worker
リクエストの処理方法 マルチプロセス型 マルチプロセス+マルチスレッド型
プロセス / スレッドの割り当て 1リクエストに1プロセスを割り当てる。 1リクエストに1スレッドを割り当てる。
メモリの扱い 各プロセスが独立して取得する 1プロセスが取得したメモリを各スレッドが共有する。
メリット 各プロセスは独立しているので、1つがコケてもWebサーバは稼働可能。 プロセスを切り替えることが無いので処理は高速。
デメリット プロセスの切り替えが発生するのでメモリを使う。 メモリを共有するため、1つのスレッドの不安定な挙動が連鎖することも。
補足 1プロセス内に生成されるスレッド数は固定。リクエスト数に応じてプロセス数を増減。

スレッドは1プロセス内に生成される処理の単位


デフォルト設定

prefork

StartServers 8            # 最初に起動する子プロセスの数
MinSpareServers 5         # 待機する子プロセスの最小数
MaxSpareServers 20        # 待機する子プロセスの最大数
ServerLimit 256           # MaxClientsに設定可能な上限値
MaxClients 256            # 生成する子プロセスの最大数
MaxRequestsPerChild 4000  # それぞれの子プロセスが扱うリクエスト数の制限数
  • MaxRequestsPerChildに設定された値の数のリクエストを処理したら、新しく子プロセスを生成し直す。
  • 大量のアクセスをさばきたい場合はMaxClientsの値を増やせばよいが、その分メモリ消費量が大きくなる。

worker

StartServers 2         # 最初に起動する子プロセスの数
MinSpareThreads 25     # アイドル状態のスレッド最小数
MaxSpareThreads 75     # アイドル状態のスレッド最大数
ThreadsPerChild 25     # 子プロセスそれぞれに生成されるスレッド数
MaxClients 150         # 生成する子プロセスの最大数
MaxRequestsPerChild 0  # それぞれの子プロセスが扱うリクエスト数の制限数

workerの場合、ServerLimitは以下の「最大サーバプロセス数」の結果が16(デフォルト)を上回る場合に設定するとよい。

MaxClients(総スレッド数) / ThreadsPerChild(1子プロセスが生成するスレッド数) = 最大サーバプロセス数

またworkerにはThreadLimitという設定値もある。ThreadLimitとは、

  • Apacheプロセス稼働中におけるThreadsPerChildに設定可能な上限値。
  • デフォルト64
  • ThreadsPerChildよりもずっと大きな値に設定された場合は、余計な未使用共有メモリが割り当てられるため注意。

event moduleについて

2.4系から新しく追加され、デフォルトになったMPM、「event」についても少し触れます。

  • KeepAlive問題に対応したworker版
  • KeepAlive問題に対応できるのはHTTP通信の場合のみSSL通信時はworker版と同じ。
  • マルチプロセス + マルチスレッド

一般的にはworkerの方がpreforkよりも性能が良いと言われているようですが、サービス(システム)への向き不向きについても今後調べてみたいと思います。

また、keep Alive問題については以下のエントリを参考にさせて頂きました。

Apache2.4新機能 ~MPMのevent~ その1 | しんじつのなみだ