%20%E3%81%97%E3%80%81%E6%88%90%E9%95%B7%E4%B8%AD%20-%20%E3%80%8C%E3%82%B9%E3%82%B3%E3%82%A2%E3%83%9C%E3%83%BC%E3%83%89%E3%81%8C%E3%81%84%E3%81%A3%E3%81%B1%E3%81%84%E3%81%A7%E3%81%99%E3%80%8D.png)
MPM ワーカーを実行中、Apache 2.4.46、Debian 9
正常に終了するワーカーは時間の経過とともに増えるばかりで、決して終了しないようです。最終的に容量が不足し、「スコアボードがいっぱいです」というエラーが発生します。Apache を再起動すると、解放されます。
ハングしているリクエストの多くは単なる画像 GET であり、PHP は関係ないため、これは私の Web サイト コード (PHP) とは何の関係もないと思います。
<IfModule mpm_worker_module>
ServerLimit 500
StartServers 10
MinSpareThreads 50
MaxSpareThreads 100
ThreadLimit 64
ThreadsPerChild 64
MaxRequestWorkers 500
MaxConnectionsPerChild 0
</IfModule>
キープアライブのオンとオフを試した
答え1
MPM ワーカーを使用する場合、リクエストはプロセス内に存在するスレッドによって処理されます。
から詳しくは、http://httpd.apache.org/docs/2.4/mod/worker.html をご覧ください。
子プロセスを起動する役割は、単一の制御プロセス (親) が担います。各子プロセスは、ThreadsPerChild ディレクティブで指定された固定数のサーバー スレッドと、接続をリッスンし、到着時にサーバー スレッドに渡して処理するリスナー スレッドを作成します。
Linux では、プロセスにはスレッドが「含まれます」。つまり、1 つの PID には複数のスレッドがあり、それらのスレッドは、その PID 内の他のスレッドとメモリ (およびその他のリソース) を共有します。
実際のところ、Linuxは「タスク」だけを気にしており、非マルチスレッドプロセスはコンテナを持つPIDです。1つタスク。
Apache を正常にリロードすると、コンテナ プロセスが終了します。ここで起きているのは、コンテナ PID を再起動する前に、コンテナ プロセス内のすべてのスレッドが完了するまで、Apache が各スレッドを待機させることです。
つまり、あなたの場合、リスト内のすべてのプロセスの中に、まだビジー状態または何らかの理由でスタックしている単一のスレッドが含まれています。
いくつかの選択肢があります。
- とにかく待つのをあきらめて、再起動してください。
- 問題のあるスレッド(アプリケーションのバグである可能性があります)を見つけて修正します。
1 は簡単です。設定オプションGracefulShutdownTimeout
に、高くても無駄ではない値を追加します。たとえば、900 秒です。デフォルトではこれは無限であり、問題のあるスレッドが終了するまでスレッドは永遠に待機することになります。
この方法の主な欠点は、重要な処理の途中でプロセスにぶつかる可能性があることです。このプロセスを終了すると、ファイルが破損したり、アプリケーションが微妙に壊れたりする可能性があります。また、処理の途中でクライアントが終了する可能性も (ごくわずかですが) あります。
2 では、ワーカーのリスト内でスタックしているスレッドを見つけて、接続が何をしているかを診断する必要がありますが、設計上の欠陥が見つかる可能性が高く、問題のあるスレッドを単に削除する前に、より自信を持って動作を説明できます。