負荷制御の設定

概要

Fess には、OpenSearch の CPU 使用率に基づいてリクエストを制御する負荷制御機能があります。 この機能により、検索エンジンの高負荷時にリクエストを自動的に制限し、システムの安定性を保護できます。

負荷制御の特徴:

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

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

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

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

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

設定

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

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

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

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

注釈

web.load.controlapi.load.control の両方が 100(デフォルト)の場合、 負荷制御機能は完全に無効となり、監視も開始されません。

動作の仕組み

監視の仕組み

負荷制御が有効な場合(いずれかの閾値が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
適用対象 検索API / AIモードAPI Web リクエスト / API リクエスト

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

トラブルシューティング

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

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

確認事項:

  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 使用率を確認した上で、適切な閾値を設定してください。

参考情報