負荷制御の設定

概要

Fess には、CPU 使用率に基づいてシステムの安定性を保護する2種類の負荷制御機能があります。

HTTPリクエスト負荷制御 (web.load.control / api.load.control):

  • OpenSearch クラスタの CPU 使用率をリアルタイムに監視

  • Web リクエストと API リクエストで独立した閾値を設定可能

  • 閾値を超えた場合、HTTP 429 (Too Many Requests) を返却

  • 管理画面・ログイン・静的リソースは制御対象外

  • デフォルトでは無効(閾値=100)

適応型負荷制御 (adaptive.load.control):

  • Fess サーバー自体のシステム CPU 使用率を監視

  • クローリング・インデキシング・サジェスト更新・サムネイル生成等のバックグラウンドタスクを自動スロットリング

  • CPU 使用率が閾値以上の場合、処理スレッドを一時待機させ、閾値を下回ると再開

  • デフォルトで有効(閾値=50)

HTTPリクエスト負荷制御の設定

fess_config.properties に以下のプロパティを設定します:

# Web リクエストの CPU 使用率閾値(%)
# OpenSearch の CPU 使用率がこの値以上の場合にリクエストを拒否
# 100 に設定すると無効(デフォルト: 100)
web.load.control=100

# API リクエストの CPU 使用率閾値(%)
# OpenSearch の CPU 使用率がこの値以上の場合にリクエストを拒否
# 100 に設定すると無効(デフォルト: 100)
api.load.control=100

# CPU 使用率の監視間隔(秒)
# OpenSearch クラスタの CPU 使用率を取得する間隔
# デフォルト: 1
load.control.monitor.interval=1

注釈

web.load.controlapi.load.control の両方が 100(デフォルト)の場合、 OpenSearch CPU 監視は開始されません。

動作の仕組み

監視の仕組み

負荷制御が有効な場合(いずれかの閾値が100未満)、LoadControlMonitorTarget が定期的に OpenSearch クラスタの CPU 使用率を監視します。

  • OpenSearch クラスタの全ノードの OS 統計情報を取得

  • 全ノードの中で最も高い CPU 使用率を記録

  • load.control.monitor.interval で指定した間隔(デフォルト1秒)ごとに監視

  • 監視は遅延初期化により、最初のリクエスト時に開始

注釈

監視情報の取得に失敗した場合、CPU 使用率は 0 にリセットされます。 連続して3回失敗するとログレベルが WARNING から DEBUG に変更されます。

リクエスト制御

リクエストが到着すると、LoadControlFilter が以下の順序で処理します:

  1. 対象外のパスかどうかを確認(対象外ならそのまま通過)

  2. リクエストの種類(Web / API)を判定

  3. 対応する閾値を取得

  4. 閾値が 100 以上の場合は制御しない(そのまま通過)

  5. 現在の CPU 使用率と閾値を比較

  6. CPU 使用率 >= 閾値の場合、HTTP 429 を返却

制御対象外のリクエスト:

  • /admin で始まるパス(管理画面)

  • /error で始まるパス(エラーページ)

  • /login で始まるパス(ログインページ)

  • 静的リソース(.css, .js, .png, .jpg, .gif, .ico, .svg, .woff, .woff2, .ttf, .eot

Web リクエストの場合:

  • HTTP 429 ステータスコードを返却

  • エラーページ(busy.jsp)を表示

API リクエストの場合:

  • HTTP 429 ステータスコードを返却

  • JSON レスポンスを返却:

{
    "response": {
        "status": 9,
        "message": "Server is busy. Please retry after 60 seconds.",
        "retry_after": 60
    }
}

設定例

Web リクエストのみ制限する

Web の検索リクエストのみ制限し、API は制限しない設定:

# Web: CPU 使用率 80% 以上でリクエストを拒否
web.load.control=80

# API: 制限なし
api.load.control=100

# 監視間隔: 1秒
load.control.monitor.interval=1

Web と API の両方を制限する

Web と API で異なる閾値を設定する例:

# Web: CPU 使用率 70% 以上でリクエストを拒否
web.load.control=70

# API: CPU 使用率 80% 以上でリクエストを拒否
api.load.control=80

# 監視間隔: 2秒
load.control.monitor.interval=2

注釈

API の閾値を Web より高く設定することで、高負荷時にまず Web のリクエストを制限し、 さらに負荷が高まった場合に API リクエストも制限するという段階的な制御が可能です。

レート制限との違い

Fess には負荷制御とは別に レート制限の設定 機能があります。 これらは異なるアプローチでシステムを保護します。

項目 レート制限 負荷制御
制御の基準 リクエスト数(単位時間あたり) OpenSearch の CPU 使用率
目的 過度なリクエストの防止 検索エンジンの高負荷保護
制限単位 IP アドレスごと システム全体
レスポンス HTTP 429 HTTP 429
適用対象 全HTTPリクエスト Web リクエスト / API リクエスト(管理画面等は除外)

両方の機能を組み合わせることで、より堅牢なシステム保護が可能です。

適応型負荷制御

適応型負荷制御は、Fess サーバー自体のシステム CPU 使用率に基づいて バックグラウンドタスクの処理速度を自動調整する機能です。

設定

fess_config.properties:

# 適応型負荷制御の CPU 使用率閾値(%)
# システム CPU 使用率がこの値以上の場合、バックグラウンドタスクを一時待機
# 0 以下に設定すると無効(デフォルト: 50)
adaptive.load.control=50

動作

  • Fess が動作するサーバーのシステム CPU 使用率を監視します

  • CPU 使用率が閾値以上の場合、対象の処理スレッドは CPU 使用率が閾値を下回るまで待機します

  • CPU 使用率が閾値を下回ると、処理が自動的に再開されます

対象となるバックグラウンドタスク:

  • クローリング(Web / ファイルシステム)

  • インデキシング(ドキュメントの登録)

  • データストア処理

  • サジェスト更新

  • サムネイル生成

  • バックアップ・リストア

注釈

適応型負荷制御はデフォルトで有効(閾値=50)です。 HTTPリクエスト負荷制御web.load.control / api.load.control)とは独立して動作します。

項目 HTTPリクエスト負荷制御 適応型負荷制御
監視対象 OpenSearch の CPU 使用率 Fess サーバーのシステム CPU 使用率
制御対象 HTTPリクエスト(Web / API) バックグラウンドタスク
制御方法 HTTP 429 を返却してリクエストを拒否 処理スレッドを一時待機
デフォルト 無効(閾値=100) 有効(閾値=50)

トラブルシューティング

負荷制御が有効にならない

原因: 設定が正しく反映されていない

確認事項:

  1. web.load.control または api.load.control が 100 未満に設定されているか

  2. 設定ファイルが正しく読み込まれているか

  3. Fess を再起動したか

正常なリクエストが拒否される

原因: 閾値が低すぎる

解決方法:

  1. web.load.controlapi.load.control の値を引き上げる

  2. load.control.monitor.interval を調整して監視頻度を変更する

  3. OpenSearch クラスタのリソースを増強する

警告

閾値を低く設定しすぎると、通常の負荷でもリクエストが拒否される可能性があります。 OpenSearch クラスタの通常時の CPU 使用率を確認した上で、適切な閾値を設定してください。

クローリングが遅い

原因: 適応型負荷制御によりスレッドが待機状態になっている

確認事項:

  1. ログに Cpu Load XX% is greater than YY% が出力されていないか

  2. adaptive.load.control の閾値が低すぎないか

解決方法:

  1. adaptive.load.control の値を引き上げる(例: 70)

  2. Fess サーバーの CPU リソースを増強する

  3. 0 に設定して適応型負荷制御を無効にする(推奨しません)

参考情報