サーバー上で大量の PHP プロセスが開いているのはなぜですか?

サーバー上で大量の PHP プロセスが開いているのはなぜですか?

今日、自分の Web サイトが機能していないことに気づいたので、サーバーに ssh で接続し、ps -eF を実行しました。約 200 個の PHP プロセスがすべて 4 時間実行されていることがわかりました。

Apache は mpm イベントと mod fcgid を使用して構築されています。

すべての PHP プロセスを終了したら正常に動作するようになりましたが、なぜこのようなことが起こるのでしょうか? これは想定された動作ですか?

Apache が PHP プロセスの数とプロセス ID をどのように追跡しているかはよくわかりません。そのため、これについて読むときに誰かが参考資料を提供してくれるとありがたいです。

また、これが常に発生するかどうかを確認するために、「ab」コマンド (Apache ベンチマーク) を使用しました。30 の同時リクエストで 4 ~ 5 回連続して実行したところ、やはり 150 個の PHP プロセスが実行されています。「ab」を引き続き実行しても、それ以上プロセスが生成されず、Web サイトは引き続き動作しています。明確にするために、私が「ab」を実行した 4 ~ 5 回は同時に実行されたわけではなく、1 つの「ab」プロセスが終了するとすぐに別のプロセスを実行しましたが、「ab」を実行するたびに 30 個の同時リクエストが実行されました。

これについて少し説明してください。ありがとうございます :)

答え1

はい、これは想定された動作です。5 つの ab​​ のコピーが同時に実行されていたようです。その結果、5 つの ab​​ プロセスごとに 30 件のリクエストを処理するために 150 の PHP プロセスが必要になりました。

Apache は、すべてのスレッドがメモリ内で実行できる場合に最もよく機能します。スレッドをディスクにスワップする必要がある負荷が発生します。これが発生すると、応答時間が急速に低下します。プロセスを強制終了すると、パフォーマンスが向上します。この場合、サーバーのパフォーマンスが低下する可能性があります。最大スレッド数が高すぎると、この動作を使用して DOS (サービス拒否) を実行するのが比較的容易になります。

問題が発生するもう 1 つの理由は、2 つのプロセスが 2 つのリソースでデッドロックする場合です。他のプロセスがこれらのリソースのいずれかを必要とする場合、応答に失敗する可能性があります。この場合、Apache は作成されるプロセスの数を制限します。デッドロックされたプロセスのいずれかを強制終了すると、問題は解決します。通常のロック順序によっては、別のデッドロックを防ぐために特定のプロセスを強制終了する必要がある場合があります。これは、サーバーのパフォーマンスにほとんどまたはまったく影響しません。

プログラミング エラーによってもスレッドがハングすることがあります。その結果、スレッドが停止することがあります。事後的に何が起こったのかを見つけるのは困難ですが、Apache サーバーのログの内容が役に立つ場合があります。エラー ログで問題を確認してください。アクセス ログには、プロセスを強制終了した頃に停止したリクエストのエントリが含まれている場合があります。

Apache は、一定期間使用されていないプロセスの一部を強制終了します。これはパラメータによって制御されますMaxSpareThreads。制御ファイルを確認してください。そこには、スレッド、サーバー、およびクライアントのパラメータに関するコメントが記載されているはずです。通常はデフォルト値で問題ありません。

コードに問題がある場合は、MaxRequestsPerChild5000 から 100 の範囲に設定すると役立つことがよくあります。数値が小さいほど、新しいスレッドを作成する必要が頻繁になり、Apache サーバーの負荷が高くなります。

編集: Apacheは起動時に複数のスレッドを開きます。これはいくつかのパラメータの相互作用に依存します。MPM 構成ドキュメントパラメータの詳細については、を参照してください。これはサーバーの負荷とは無関係であり、通常は実行中のサーバーが実行し続けるスレッドの最小数になります。

関連情報