- 1. 概要
- 2. 参考サイト
- 3. prefork・worker・event
1. 概要
ここのサイトでは、ウェブサーバと言いつつ、ウェブサーバに関しては、「Apache」に限定して記述しています。
「Nginx」まだ(2021年10月28日)、さわったことないしね。
「MPM」となれば、いよいよ「Apache」限定的な話になります。
「MPM」は、「Multi Processing Module」の略で、ウェブサーバの複数のアクセスをさばくのに、マルチプロセスでどうやるのかを実現するモジュールなのです。
なんか、うまく説明できないなぁ・・・。ま、わからないことは、次項の参考サイトを読んでくだされ。
2. 参考サイト
本節は、下記のサイトを参考にさせていただきました。
「Apache HTTP Server - Wikipedia」
「【図解/apache】MPM prefork/worker /event (イベント駆動)の違い~ CPU コアの使い方~」
3. prefork・worker・event
「MPM」には、3つの方式があって、どれかひとつを択一で選択することになります。
「FreeBSD」の「ports」で、「make config」すると、最後のページに
「The default MPM Module」てな選択肢があって、「prefork」「worker」「event」のいずれかを選ぶことになっています。

いずれかひとつ選ぶのに、インストール先のディレクトリを見ると
/usr/local/libexec/apache24/mod_mpm_event.so
/usr/local/libexec/apache24/mod_mpm_prefork.so
/usr/local/libexec/apache24/mod_mpm_worker.so
3つともインストールされています。
これ、実は、一番下の「all MPMs as loadable module」のチェックがデフォルトではいっていまして(択一の唯一に見えてはずすことができる)。
このチェックをいれていれば、3つともインストールすることができます。
(実は、このしかけは最近(2021年10月28日)知った)
さらに不思議なのは、「make config」で「prefork」以外を選択していても、作成された「httpd.conf」を見ると
#LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
#LoadModule mpm_worker_module libexec/apache24/mod_mpm_worker.so
と、「prefork」が有効化されているのです。
「all MPMs as loadable module」をはずすとどうなるんだろう?ってのは、怖くてやっていません。
ちなみに、「prefork」「worker」「event」の違いをわたしが理解している範囲で述べておきますと。
「prefork」
他の2つも「prefork」なのですが、これは、「prefork」しかしてまへんよ。てなことらしいです。
複数の接続を実現するために、プロセスを「fork(※1)」するのですが、起動時に前もっていくつか「fork」しておくので「prefork」ですな。
「prefork」では、1プロセス1スレッドで動作しているので、同時接続が多くなると、プロセス数がやたら増えるようです。
「worker」
このモジュールでは、スレッドで動作するそうです。
デフォルトで、1プロセス・27スレッドを扱うようになっているようです。
「event」
スレッドを使うのは、「worker」と同じ。
違いがあるのは、「worker」では、接続が足りなくなったら、単にプロセスを増やすのですが、「event」の場合、足りなくなったら、プロセスを起動すると同時に、前のプロセスは、それ以前の接続が切れても新たに接続せず、すべての接続がなくなったら、プロセス自体を停止するそうです。なんかようわかりませんが、「KeepAlive」のために、無駄な接続が残ることをさけているらしい(???)。
※1 「fork - Wikipedia」をご参照ください。
蛇足になりますが、特に設定していない場合、起動時に「fork」するプロセスは、5つです。
で、起動直後に「pgrep -lfa httpd」で見ると
33832 /usr/local/sbin/httpd -DNOHTTPACCEPT
33833 /usr/local/sbin/httpd -DNOHTTPACCEPT
33834 /usr/local/sbin/httpd -DNOHTTPACCEPT
33835 /usr/local/sbin/httpd -DNOHTTPACCEPT
33836 /usr/local/sbin/httpd -DNOHTTPACCEPT
33837 /usr/local/sbin/httpd -DNOHTTPACCEPT
みたいなことになっちょる。
あれ?なんで?6つあるじゃん。とか思ったのですが・・・。
「ps aux」で調べて納得
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
root 33832 0.0 0.5 181360 20424 - Ss 17:05 0:00.30 /usr/local/sbin/httpd -DNOHTTPACCEPT
www 33833 0.0 0.5 181360 20452 - S 17:05 0:00.02 /usr/local/sbin/httpd -DNOHTTPACCEPT
www 33834 0.0 0.5 181360 20452 - I 17:05 0:00.00 /usr/local/sbin/httpd -DNOHTTPACCEPT
ひとりだけ「USER」が違うわけで。
親分がひとりいて、子プロセスを5人起動するので、全員で6人になっとるわけです。
さらに余談。
「FreeBSD」では、「MPM」として、「prefork」「worker」「event」が、用意されているわけですが、実は、「MPM」には、他の種類もあるようです。
プラットフォームごとに、用意される「MPM」の種類が変わるようです。
/usr/local/etc/apache24/extra/httpd-mpm.conf
に他の種類の設定も書いていました。
有効化しているモジュールごとに設定ができるようで、「event」であれば
# event MPM
# StartServers: initial number of server processes to start
# 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
# MaxRequestWorkers: maximum number of worker threads
# MaxConnectionsPerChild: maximum number of connections a server process serves
# before terminating
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
</IfModule>
と記述されております。
「prefork」「worker」「event」の他に、「netware」「os2」「winnt」が用意されておりました(「Apache/2.4.51 (FreeBSD)」)。
|