ウェブサーバ - MPM - 概要

 クラウディア
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」のいずれかを選ぶことになっています。
「apache24」-「make config」

 いずれかひとつ選ぶのに、インストール先のディレクトリを見ると


/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)」)。
ハイスピードプランメンズミレット