読者です 読者をやめる 読者になる 読者になる

ApacheのMPMの基礎について

サーバ運用 理論

MPMとは

MPMとはMulti Processing ModuleというApacheで並列処理を行うモジュールです。
ApacheのMPMで利用可能な

  • prefork
  • worker

について書いていきたいと思います。

preforkについて

preforkはあらかじめ複数のプロセスを生成してクライアントの接続に備えるマルチプロセスモデルです。
1プロセスにつき1つのリクエストの処理を行います。
Apacheでのpreforkでは以下の設定があります。

  • StartServers : 最初に起動する子プロセスの数
  • MinSpareServers : 待機する子プロセスの最小数
  • MaxSpareServers : 待機する子プロセスの最大数
  • ServerLimit : 生成する子プロセスの最大数
  • MaxClients : 同時に接続できるクライアント数の上限
  • MaxRequestsPerChild : それぞれの子プロセスが扱うリクエスト数の制限数

preforkでは1クライアントを1プロセスで処理するためServerLimitとMaxClientsはほとんど同じ意味になります。
プロセス数を上げたい場合は基本的にServerLimitとMaxClientsを設定することになります。
注意事項としては
MaxClinets>ServerLimit
にはできない点です。

ServerLimitとMaxClientsをどの程度に設定したらよいのでしょうか。
値を考えるにあたり以下の数値が必要になります。

  • サーバが搭載している物理メモリ
  • 1プロセスあたりの平均メモリ消費量

例えば

  • 搭載メモリが4GB
  • httpdプロセス1つあたりのメモリ消費量100MB
  • OSが使用するメモリとして512MB

の場合
4GB-512MB=3.5GB
httpdに割り当てが可能になります。
3.5GB/100MB=35
となるのでServerLimitとMaxClientsは35に設定

簡単に考えると以上になります。
ただしLinuxでは物理メモリを親プロセスと子プロセスで一部メモリを共有するためもっと大きな値を設定することが可能になると思います。
ちなみにPHPを使う場合はworkerよりpreforkの使用が推奨されているみたいです。

workerについて

workerは1つのプロセスの中に複数のスレッドを生成し1つのリクエストは1つのスレッドで処理をします。
さらにそのプロセスを複数生成するマルチスレッドとマルチプロセスのハイブリット型になっています。
Apacheでのworkerでは以下の設定があります。

  • StartServers : 最初に起動する子プロセスの数
  • MinSpareThreads: アイドル状態のスレッド最小数
  • MaxSpareThreads: アイドル状態のスレッド最大数
  • MaxClients: 同時に接続できるクライアント数の上限(プロセス数xスレッド数)
  • ThreadsPerChild: 子プロセスそれぞれに生成されるスレッド数
  • MaxRequestsPerChild: それぞれの子プロセスが扱うリクエスト数の制限数
  • ServerLimit : 生成する子プロセスの最大数

MaxClientsが決まってThreadsPerChildが決まると自動的にServerLimitが決まります。
例えばMaxClientsを4096としてThreadsPerChildを128とするとServerLimitは32になります。
つまりは
ServerLimit>= MaxClients/ThreadsPerChild
に必ずなります。この設定が間違っているとエラーログがでます。

それぞれの値をいくつにするのかはpreforkと同じでシステムの搭載メモリ量と1スレッドあたりの消費メモリ量から簡単な値は計算することができます。

まとめ

今回はpreforkとworkerについて書きました。
MPMにはpreforkとworker以外もある(perchildやwinnt)のでその辺もできたらまとめたいなと思っています!
(いつになるかはわからないですが。。。)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

この記事はほぼサーバなどを触ったことがない人物が学んだことを整理するために書いていますので間違いなどが多々あると思います。間違いなどありましたら是非コメントなどで教えていただけると幸いです。