apache 2.4 の MPM(Multi-Processing Module) は Worker, Prefork, event の 3つのモジュールが存在します。
で、何が違うのかという話し
  1. モジュールについて
  2. 各モジュールの設定の例

モジュールについて
モジュールの説明の前に
違いの説明に入る前に覚えておきたい用語
  • プロセス
    • CPU, メモリを仮想的に作り出されたものがプロセスで、1プロセスで1CPU使う
      • 仮想的に完全分離されているから、セキュリティ的に強い。
      • 他のアプリケーションの影響を受けにくい
  • スレッド
    • CPUは別だけど、メモリは共有されているのがスレッド
      • CPUの切り替えのみなので、プロセスで実行されるアプリケーションよりCPUの切り替えが早い
  • フォーク
    • 自分自信をコピーして新たに子プロセスを起動する

モジュール
代表的な3つもモジュールの特徴
  •  prefork
    • マルチプロセス
1つのプロセスから子プロセスを起動し、子プロセス1つが1つの接続をみる。あらかじめ、子プロセスを作成しておき対応するのがprefork。
  •  worker
    •  マルチプロセス/マルチスレッド
1つのプロセス内で複数のスレッドを起動しスレッドで接続を見る。また子プロセスを多く起動せずに済むからメモリの使用量を減らすことができる。
  • event
    • マルチプロセス/マルチスレッド
workerと同じ仕組みで動いている。workerとの違いは keep-aliveの処理を別のスレッドに割り振るため、待機時間が無駄にならない。2.4.1で正式採用された。

各MPM設定の目安


prefork worker event 備考
ServerLimit MaxRequestWorkers ≦ ServerLimit MaxClients / ThreadsPerChild ≦ SserverLimit MaxClients / ThreadsPerChild ≦ SserverLimit
子プロセス数の上限

StartServers StartServers ≦ MaxRequestWorkers StartServers ≦ MaxRequestWorkers/ ThreadsPerChild StartServers ≦ MaxRequestWorkers/ ThreadsPerChild
起動時に生成する子プロセスの数
Prefork
MinSpareThreads -

アイドルな子プロセスの最小個数
MaxSpareThreads - MinSpareThreads + ThreadsPerChild ≦ MaxSpareThreads MinSpareThreads + ThreadsPerChild ≦ MaxSpareThreads アイドルな子プロセスの最大個数
ThreadLimit
ThreadPerChild ≦ ThreadLimit
MaxRequestWorkers≦ SesrverLimit * ThreadLimit
ThreadPerChild ≦ ThreadLimit
MaxRequestWorkers≦ SesrverLimit * ThreadLimit
子プロセス毎のスレッド数の上限
ThreadsPerChild - ThreadsPerChild ≦ ThreadLimit ThreadsPerChild ≦ ThreadLimit 子プロセスごとに生成されるスレッド数
MaxRequestWorkers(2.2までMaxClients) 1≦ MaxRequestWorkers≦ ServerLimit ThreadsPerChild ≦ MaxRequestWorkers * ThreadsPerChild ThreadsPerChild ≦ MaxRequestWorkers * ThreadsPerChild 最大同時リクエスト数
MaxConnectionsPerChild(2.2までMaxRequestsPerChilds)


子プロセスが稼働中に扱うリクエストの上限
MinSpareServers
- - アイドルな子プロセスの最小個数
MaxSpareServes MinSpareSservers + 1 ≦ MaxSpareServers - - アイドルな子プロセスの最大個数





参考URL:
今こそ見直すApacheの設定: http://blog.nomadscafe.jp/2011/07/apache.html
mod_statusでApache の稼働状況を記録する: https://www.inter-office.co.jp/contents/83/
Apache MPM, 「prefork」と「worker」を切り替える方法: http://blog.flatlabs.net/20110222_232623/
Apache Document Malti Processing Module: http://httpd.apache.org/docs/2.4/ja/mpm.html
Apache HPPT Server: MPMパラメータ チートシート: http://heartbeats.jp/hbblog/2015/02/apache-mpm.html
Apache マルチプロセッシングモジュール (MPM) : Prefork と Workerの違い: https://kb.plesk.com/jp/113007
Apache 2.4からはデフォルトで Event MPMになってるのに気がつかなかった話: http://blog.wnotes.net/blog/article/apache-event-mpm
Apache MPM設定を見直したら、CPU負荷が下がりWordPressが軽くなった: http://www.checksite.jp/apache-mpm-cpu-load-falls/
Apacheのmpm, プロセスとスレッド: http://totem3.hatenablog.jp/entry/2013/10/15/062243
Apache document module 一覧: http://httpd.apache.org/docs/2.4/ja/mod/
Apache2.4新機能 ~MPMのevent~ その1: http://apache24.jugem.jp/?eid=5
Apache2.4新機能 ~MPMのevent~ その1: http://apache24.jugem.jp/?eid=6
プロセスとスレッドの話し: http://onoono-life.blogspot.jp/2014/01/blog-post.html
プロセス、スレッド、ファイバ、タスク、ジョブ、違いを整理してみよう: http://hiroakiuno.hatenablog.com/entry/20070316/p1