Apache MPM ワーカーが G で停止 (正常に終了) し、成長中 - 「スコアボードがいっぱいです」

Apache MPM ワーカーが G で停止 (正常に終了) し、成長中 - 「スコアボードがいっぱいです」

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>

スコアボード ここに画像の説明を入力してください

例 g 労働者 ここに画像の説明を入力してください

Apache 1週間で空きスロットが減少 ここに画像の説明を入力してください

ここに画像の説明を入力してください

キープアライブのオンとオフを試した

ここに画像の説明を入力してください

答え1

MPM ワーカーを使用する場合、リクエストはプロセス内に存在するスレッドによって処理されます。

から詳しくは、http://httpd.apache.org/docs/2.4/mod/worker.html をご覧ください。

子プロセスを起動する役割は、単一の制御プロセス (親) が担います。各子プロセスは、ThreadsPerChild ディレクティブで指定された固定数のサーバー スレッドと、接続をリッスンし、到着時にサーバー スレッドに渡して処理するリスナー スレッドを作成します。

Linux では、プロセスにはスレッドが「含まれます」。つまり、1 つの PID には複数のスレッドがあり、それらのスレッドは、その PID 内の他のスレッドとメモリ (およびその他のリソース) を共有します。

実際のところ、Linuxは「タスク」だけを気にしており、非マルチスレッドプロセスはコンテナを持つPIDです。1つタスク。

Apache を正常にリロードすると、コンテナ プロセスが終了します。ここで起きているのは、コンテナ PID を再起動する前に、コンテナ プロセス内のすべてのスレッドが完了するまで、Apache が各スレッドを待機させることです。

つまり、あなたの場合、リスト内のすべてのプロセスの中に、まだビジー状態または何らかの理由でスタックしている単一のスレッドが含まれています。

いくつかの選択肢があります。

  1. とにかく待つのをあきらめて、再起動してください。
  2. 問題のあるスレッド(アプリケーションのバグである可能性があります)を見つけて修正します。

1 は簡単です。設定オプションGracefulShutdownTimeoutに、高くても無駄ではない値を追加します。たとえば、900 秒です。デフォルトではこれは無限であり、問​​題のあるスレッドが終了するまでスレッドは永遠に待機することになります。

この方法の主な欠点は、重要な処理の途中でプロセスにぶつかる可能性があることです。このプロセスを終了すると、ファイルが破損したり、アプリケーションが微妙に壊れたりする可能性があります。また、処理の途中でクライアントが終了する可能性も (ごくわずかですが) あります。

2 では、ワーカーのリスト内でスタックしているスレッドを見つけて、接続が何をしているかを診断する必要がありますが、設計上の欠陥が見つかる可能性が高く、問題のあるスレッドを単に削除する前に、より自信を持って動作を説明できます。

関連情報