こんにちは、OSSよろず相談室のSKです。
OSS に関するお問い合わせが日々寄せられる中で、今回はよくお問い合わせのあるエラーについて深掘りしていくシリーズを始めます!
シリーズ第1弾は、Apache のエラー AH03490 に焦点を当て、原因や対処法を解説していきます。
AH03490: scoreboard is full, not at MaxRequestWorkers. Increase ServerLimit.
このメッセージは、Apache Http Serverのエラーログに、httpdのリロード時や起動時に出力されることがあります。
以下の流れでこのエラーを深堀りしてゆきたいと思います。
メッセージの意味は?
直訳します。
MaxRequestWorkersの制限には達していませんが、スコアボードがいっぱいです。 ServerLimitの値を増やしてください。
このメッセージは、Apache の MPM というモジュールの設定が影響しています。
MPM とは、Apache HTTP サーバがリクエストを処理するためのプロセスやスレッドの管理方法を決定するモジュールです。
Apacheは並行して複数のリクエストを処理するために、MPMを使ってプロセスの生成、管理、終了を行います。
MPMはApacheのパフォーマンスや動作に大きな影響を与えます。
まずはメッセージの意味を1つ1つ確認しましょう。
scoreboard is full / スコアボードがいっぱいです
スコアボードは、Apacheのメモリ領域で、1つ1つのリクエストの処理の状態が記録される領域です。
1つ1つのリクエストはスロットという入れ物で処理します。
使用するモジュールが Prefork MPM の場合はスロットはプロセスで、Worker MPM や Event MPM の場合はスレッドです。
インストール時にどの MPM モジュールが選択されるかは OS をインストールするときに決まりますが、通常は Event MPM です。(※)
エラーの意味に戻りますが、「スコアボードがいっぱいです」ということなので、リクエストがたくさん来て、スロットがなくなり、スコアボードがいっぱいになってしまっていることが分かります。
※どの種類のMPMが使用されるかは、以下のドキュメントを参考にしてください。(日本語にすると詳細の説明が無いので英語版を案内しています) Multi-Processing Modules (MPMs) / MPM Defaults |
not at MaxRequestWorkers / MaxRequestWorkersの制限には達していませんが
MaxRequestWorkersは、Apacheが同時に処理できるリクエストの最大数です。
httpd.confの<IfModule mpm_event_module>タグ内に設定する設定項目です。
例えば、httpd.confで以下のように設定されています。
★mpm_event_moduleの設定例
<ifmodule mpm_event_module>
ServerLimit 16
StartServers 2
MaxRequestWorkers 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
</ifmodule>
Apacheドキュメント / Apache MPM workerより設定の典型例を抜粋
Increase ServerLimit / ServerLimitの値を増やしてください
ServerLimitは、Apacheがリクエストを処理するために生成できる子プロセス数の最大数です。
httpd.confの<IfModule mpm_event_module>タグ内に設定する設定項目です。
ServerLimitの設定は、MaxRequestWorkers の値を設定する際に影響します。
上記の★mpm_event_moduleの設定例をもう一度見てみましょう。 ThreadsPerChildは各子プロセスが生成するスレッドの数です。
設定例の値をあてはめると、以下のように、MaxRequestWorkersを 150 に設定する必要があります。
ServerLimit (16) × ThreadsPerChild (25) = MaxRequestWorkers (150) 子プロセスの最大数× 子プロセスが生成するスレッド数 = 最大リクエスト処理数
つまり、サーバへのアクセスが多く、リクエストがたくさん来てスレッドが使われてしまっているので、子プロセスの最大数(ServerLimit)と最大リクエスト処理数(MaxRequestWorkers)を増やしてください、というメッセージになります。
なぜ出力されるのか
ざっくりいうと、リクエスト数がMPMに設定した値よりも多く来た場合にこの出力がされるのです。
Apacheのドキュメントにこのエラーについての説明があります。
Apache MPM event / Graceful process termination and Scoreboard usage
Apacheのソースコードも併せて確認すると、このエラーが出力される条件は、以下の3つの条件が重なった場合です。
- アイドルスレッド数が MinSpareThreads 未満となった
- 追加子プロセスが起動できる状態
- 必要な子プロセス数に対して、MaxRequestWorkers や ServerLimit に制限されて起動できる子プロセス数が少ない状態が 3回 (以上) 続いた場合
アイドルスレッドとは、現在特定のタスクを実行していないが、すぐに新しいタスクを処理できる状態で待機しているスレッドのことです。
MinSpareThreads はアイドルスレッドの最小数を定義します。
Apache では必ず MinSpareThreads 数 (以上) のアイドルスレッドを確保します。
どうやったら出力されないのか
メッセージが出力されないように対策をするのであれば、以下のようにするとよいでしょう。
- MaxRequestWorkersを「想定最大アクティブスレッド数」+「MinSpareThreads」+α (アクセスが集中した場合の余力) となるように設定
- StartServers、ServerLimit、ThreadsPerChild、MaxSpareThreads については以下の関係式のように設定
- ServerLimit x ThreadsPerChild = MaxRequestWorkers
- StartServers x ThreadsPerChild ≧ MaxSpareThreads
出力されても問題ないのか
AH03490 は、エラーログとして出力されますが、プロセス起動の余裕が少なくなっている旨の INFO レベルのメッセージですので、このメッセージの出力自体は無視しても構わないと思います。
リクエストの待機状態が発生してパフォーマンスが悪い状態ではあるので、頻発するようであれば設定値を見直して再設定しましょう。
参考文献
StartServers、ServerLimit、ThreadsPerChild、MaxSpareThread等、各MPMの値のパラメータの説明は以下を参照してください。
Apacheドキュメント / Apache MPM Common Directives
なお、このエラーメッセージについては、ApacheやRed Hat社の公式ドキュメントにも書かれています。(Red Hat社の有料ポータルログインIDが必要です)
Red Hatドキュメント / AH03490: scoreboard is full, not at MaxRequestWorkers.Increase ServerLimit.