環境
Apache2.4.41
Ubuntu20.4
はじめに
MPMとはMulti Processing Moduleの略で、マルチプロセスを実現するための仕組みのことです。Webサーバーへの接続数が多くなってきた場合、シングルプロセスで処理をしていれば、効率が悪くなり、レスポンスの低下につながることになります。レスポンスを上げるためには、マルチプロセスで処理が行えるようチューニングを行う必要があります。Apache2.2系までは、シングルプロセスにしか対応していませんでしたが、Apache2.4系以降、マルチプロセスに対応できるようになっています。
MPMにはプロセス管理の仕方に、大きく3つの仕様が用意されています。
- prefork
- event
- worker
preforkがシングルプロセスで、eventとworkerがマルチプロセスです。Apache2.2系まではpreforkで動いていたが、Apache2.4系以降は、eventがデフォルト値に採用されるようになりました。
確認
自分の環境で、MPMに何が設定されているかを確認するコマンドです。自分の環境はApache2.4.41なので、デフォルトでeventになっています。
$ apachectl -V | grep MPM
Server MPM: event
大抵の場合、MPMにはeventを採用しておいて問題ないと思いますが、状況に応じて、他のMPMに変更することができます。MPMはモジュールで提供されており、Apache2をインストールすると3つともインストールされています。mods-availableディレクトリに保存されています。
$ls -l /etc/apache2/mods-available | grep mpm_
mpm_event.conf
mpm_event.load
mpm_prefork.conf
mpm_prefork.load
mpm_worker.conf
mpm_worker.load
mods_enabledディレクトリを見ると、eventだけが有効になっています。
$ls -l /etc/apache2/mods-enabled | grep mpm_
mpm_event.conf
mpm_event.load
mpm_prefork.confの設定を見ると、待機プロセスの最小値と最大値が設定できるディレクティブが存在します。
MinSpareServers 5
MaxSpareServers 10
mpm_event.confの設定を見ると、待機プロセスではなく、待機スレッドの最小値と最大値を設定するディレクティブになっています。
MinSpareThreads 25
MaxSpareThreads 75
シングルプロセスであれば、1つの接続に対して1つのプロセスが起動しますが、マルチプロセスの場合、1つのプロセスの中で複数のスレッドが動き、1つ接続に対し1つのスレッドが起動します。
接続数が増えてくると新しいスレッドが起動されるため、その分レスポンスが遅くなることになります。また、接続数が少なくなってくると、無駄に起動しているスレッド数が多くなるため、メモリが圧迫されることになります。スレッドの値と接続数はトレードオフの関係になっています。
おまけ
PHPの環境でMPMの設定をする場合、PHPから提供されている、mod_phpといったモジュールが利用されます。こちらは、内部的にpreforkが使われています。eventに対応するには、php-fpmに変更することになります。