Apache は maxclient やその他の制約にもかかわらず、プロセスを生成しすぎます

Apache は maxclient やその他の制約にもかかわらず、プロセスを生成しすぎます

MPM 制約は次のとおりです。

<IfModule mpm_prefork_module>
    StartServers         10
    MinSpareServers      10
    MaxSpareServers      10
    MaxClients           10
    MaxRequestsPerChild  2000
</IfModule>

しかし、それにもかかわらず、現在 20 を超える Apache プロセスが実行されており、過去 1 ~ 2 時間では 40 ~ 50 にも達しました。MaxClient と MaxSpareServers はプロセス数を制御 (つまり、約 10) するべきではないでしょうか?

何か見落としている点はありますか?

答え1

Apacheにはさまざまな種類がありますが、最も一般的なものはプリフォークそしてワーカープリフォーク モデルでは複数のプロセスが生成されますが、各プロセスは一度に 1 つのリクエストのみを処理します。一方、ワーカー モデルでは複数のプロセスが生成され、各プロセスには複数のスレッドがあり、各スレッドは一度に 1 つのリクエストを処理します。

ディストリビューションによっては、期待しているモデルとは異なるモデルを実行している可能性があります。prefork を期待していますが、これが実行されているタイプであることは確かですか? 確認するには、次のように入力します。

$httpd -V
サーバーバージョン: Apache/2.2.15 (Unix)
サーバー構築日: 2010年5月28日 07:58:25
サーバーのモジュールマジックナンバー: 20051115:24
サーバーがロードされました: APR 1.4.2、APR-Util 1.3.9
コンパイルに使用したバージョン: APR 1.4.2、APR-Util 1.3.9
アーキテクチャ: 32 ビット
サーバー MPM: プリフォーク
  スレッド: いいえ
    フォーク: はい (プロセス数は可変)

この場合は私のServer MPMものですPreforkが、あなたのものは異なる可能性があります。Apache2 を実行している私の Debian サーバーでは次のようになりますWorker

#Apache2 の -V
サーバーバージョン: Apache/2.2.9 (Debian)
サーバー MPM: ワーカー

一部のマシン (RedHat など) では、prefork バイナリとワーカー バイナリの両方が存在することは珍しくありません (一方が と呼ばれhttpd、もう一方が と呼ばれる、または同様の名前)。実際に起動されているのはどちらなhttpd.workerのかを再確認することをお勧めします (psまたはtopまたは を使用)。cat /etc/init.d/httpd

答え2

この質問に遭遇した他の人にとっては、別の潜在的な原因があります。

すでに答えが見つかったとお考えだと思いますが、prefork では、プロセスをどちらの方法で見ても同じ結果になるはずです。prefork を使用していなかったに違いありません。

これが理由です:

プレフォークの最新バージョンは、http://httpd.apache.org/docs/2.4/mod/prefork.html にあります。

このマルチプロセッシング モジュール (MPM) は、スレッド化されていない、事前にフォークされた Web サーバーを実装します。


私が遭遇した別の説明

構成オプションの前に prefork モジュールをロードすると機能しますが、構成オプションの後にロードすると、代わりにいくつかのデフォルトがロードされ、IfModule ディレクティブが無効になります。ディストリビューションでは起動時に正しくセットアップされるため、カスタマイズされた Apache 構成でのみこれが表示される可能性があります。

作品- 設定が適用されます

LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so

<IfModule mpm_prefork_module>
StartServers         1
MinSpareServers      1
MaxSpareServers      0
ServerLimit          4
MaxClients           4
MaxRequestsPerChild  4000
</IfModule>

動作しません- 設定は効果がありません

<IfModule mpm_prefork_module>
StartServers         1
MinSpareServers      1
MaxSpareServers      0
ServerLimit          4
MaxClients           4
MaxRequestsPerChild  4000
</IfModule>

LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so

答え3

今ではちょっとバカみたいに感じますが、これです:htop では ps aux では表示されない多くの apache2 プロセスが表示されるのはなぜですか?私の問題を説明します。

関連情報