Apache/httpdプロセス数の固定は無益どころが有害になる場合もある

シェアする

Voiced by Amazon Polly

中規模サイトのApacheチューニングプロのサーバ管理者がApacheのStartServers, (Min|Max)SpareServers, MaxClientsを同じにする理由等で、StartServers, MinSpareServers, MaxSpareServers, MaxClients, ServerLimitをすべて同じ値に設定することでhttpdプロセス数を固定するアプローチがとられることがあります。
しかし、これは一部の例外を除き基本的に悪い発想になり得ます。

広告



一部の例外とは

次のような環境の場合は、このアプローチでの利益を最大限に発揮することが可能です。

  • 物理メモリが潤沢にある
  • 仮想メモリが無効になっている
  • vm.swappiness=0に設定されており、スワップが行われにくいようになっている
  • 大量のアクセスに波がなく、常にBusyなプロセスが数十~数百以上と大量に稼働する
    これ以外の場合は、プロセス数を固定する考え方は悪い発想です。

    Apacheによるプロセス管理の概要

    Apacheの場合、プロセス数はアクセスに応じて自動的に増減するような仕組みになっています。アクセスが大量に来た場合には増やし、少ない場合は減らすようになっています。これらは事前に設定したパラメータによって自動的に行われます。
    プロセスを立ち上げる際は確かにある程度の負荷がかかります。しかし、プロセスを立ち上げている間は常にメモリを消費し、そのメモリを転用することができない点には留意が必要です。

    なぜ悪い発想なのか

    プロセス数を固定するのが悪い発想になり得るのは、仮想メモリが有効な環境です。
    仮想メモリが有効な場合、メモリ上で使用されていない領域はディスクキャッシュに転用されることになります。次のグラフは、その様子を示したものです。
    メモリ

    ディスク

    CPU

    13時40分ごろにスワップを無効にし、仮想メモリ内のすべてのページを物理メモリに書き戻しました。しかし、その後徐々にページが仮想メモリにじわじわと書き出されている(メモリグラフで茶色の線で示されているswap usedが増えている)ことも視認できるかと思います。

    このサーバーでは、sysctl.confにvm.swappiness=1を設定しています。

    プロセスが待機しているだけであり、アクセスできないページは徐々に仮想メモリに書き出され、ディスクキャッシュに転用されてしまいます。この結果、待機しているプロセスが急遽必要となった場合に、仮想メモリに書き出されたページが急激に書き戻される(スワップインが大量に発生する)ことになり、結果としてディスクI/Oにより逆にCPUに負荷を掛けてしまう原因となります。

    問題への対処

    この問題に対処するには、メモリをスワップされない程度に増設するかスワップを無効にすることです。しかし、スワップがどうしても必要な環境や、使用できる物理メモリに制限がある場合はプロセス数の固定を行うべきではありません。LRU、もしくはそれに類似したアルゴリズムにより使用されていないページは仮想メモリに書き出されてしまうためです
    動的にプロセス数を変更することにより、余ったメモリはディスクキャッシュに活用されます。Apache自身がプロセスを立ち上げる負荷もそうですが、それ以上に既に立ち上がっているプロセスを仮想メモリから呼び戻すほうが大抵の場合、負荷がかかります。この負荷はディスクI/Oによるものであるため、I/O要求が集中した場合にサーバー全体の停止を引き起こす原因にもなり得ます。

    乱暴に言ってしまえば、Linux OS自身がhttpdを物理メモリ上で遊ばせておくより、ディスクキャッシュに使ったほうが効率が良いと判断した場合はhttpdを仮想メモリに追い出してしまいます。

    メモリに余裕があると断言できる環境でない場合は、基本的にプロセス数は動的に変更できるようにするべきです。プロセスの立ち上がる負荷が無視できない場合は、MinSpareServersやMaxSpareServersを引き上げることで軽減はできますが、上げすぎるとスワップインによるディスクI/O負荷により逆効果となってしまいます。

    同様の理由で、アプリケーションレベルのバッファやキャッシュは過度に大きく確保するべきではありません。MySQLやmemcachedでは動的に確保されるため問題が発生しにくいですが、一気にメモリ領域を確保するようなアプリケーションでは問題を引き起こす場合があります。

    結論

    Apache/httpdのプロセス数を固定するのは、メモリに十分な余裕があるサーバーやスワップが無効になっているサーバー以外ではやめましょう。