サーキットブレーカーの設定

Elasticsearchには、OutOfMemoryErrorを引き起こす操作を防ぐために使用される複数のサーキットブレーカーが含まれています。各ブレーカーは、使用できるメモリの制限を指定します。さらに、すべてのブレーカーで使用できるメモリの総量を指定する親レベルのブレーカーがあります。

特に記載がない限り、これらの設定は、cluster-update-settings APIを使用して、ライブクラスターで動的に更新できます。

サーキットブレーカーエラーに関する情報は、Circuit breaker errorsを参照してください。

親サーキットブレーカー

親レベルのブレーカーは、次の設定で構成できます:

  • indices.breaker.total.use_real_memory
  • (Static) 親ブレーカーが実際のメモリ使用量を考慮すべきか(true)、それとも子サーキットブレーカーによって予約された量のみを考慮すべきかを決定します(false)。デフォルトはtrueです。

  • indices.breaker.total.limit logo cloud
  • (Dynamic) 全体の親ブレーカーの開始制限。indices.breaker.total.use_real_memoryfalseの場合、JVMヒープの70%がデフォルトです。indices.breaker.total.use_real_memorytrueの場合、JVMヒープの95%がデフォルトです。

フィールドデータサーキットブレーカー

フィールドデータサーキットブレーカーは、フィールドをフィールドデータキャッシュにロードするために必要なヒープメモリを推定します。フィールドのロードが事前定義されたメモリ制限を超える場合、サーキットブレーカーは操作を停止し、エラーを返します。

  • indices.breaker.fielddata.limit logo cloud
  • (Dynamic) フィールドデータブレーカーの制限。デフォルトはJVMヒープの40%です。

  • indices.breaker.fielddata.overhead logo cloud
  • (Dynamic) フィールドデータのすべての推定値に掛け算される定数で、最終的な推定値を決定します。デフォルトは1.03です。

リクエストサーキットブレーカー

リクエストサーキットブレーカーは、Elasticsearchがリクエストごとのデータ構造(たとえば、リクエスト中の集計計算に使用されるメモリ)が特定のメモリ量を超えないようにすることを可能にします。

  • indices.breaker.request.limit logo cloud
  • (Dynamic) リクエストブレーカーの制限、デフォルトはJVMヒープの60%です。

  • indices.breaker.request.overhead logo cloud
  • (Dynamic) すべてのリクエスト推定値に掛け算される定数で、最終的な推定値を決定します。デフォルトは1です。

フライト中のリクエストサーキットブレーカー

フライト中のリクエストサーキットブレーカーは、ElasticsearchがトランスポートまたはHTTPレベルで現在アクティブなすべての受信リクエストのメモリ使用量がノード上の特定のメモリ量を超えないように制限することを可能にします。メモリ使用量はリクエスト自体のコンテンツ長に基づいています。このサーキットブレーカーは、メモリが生のリクエストを表すためだけでなく、デフォルトのオーバーヘッドによって反映される構造化されたオブジェクトとしても必要であることを考慮します。

  • network.breaker.inflight_requests.limit
  • (Dynamic) フライト中のリクエストブレーカーの制限、デフォルトはJVMヒープの100%です。これは、親サーキットブレーカーに設定された制限に従います。
  • network.breaker.inflight_requests.overhead
  • (Dynamic) フライト中のすべてのリクエスト推定値に掛け算される定数で、最終的な推定値を決定します。デフォルトは2です。

スクリプトコンパイルサーキットブレーカー

前のメモリベースのサーキットブレーカーとは少し異なり、スクリプトコンパイルサーキットブレーカーは、一定の期間内にインラインスクリプトのコンパイル数を制限します。

詳細については、scriptingドキュメントの「prefer-parameters」セクションを参照してください。

  • script.max_compilations_rate
  • (Dynamic) コンパイルが許可される特定の間隔内のユニークな動的スクリプトの数の制限。デフォルトは150/5mで、5分ごとに150です。

クラスターが定期的に指定されたmax_compilation_rateに達する場合、スクリプトキャッシュが小さい可能性があります。最近のキャッシュの排出数、script.cache_evictions_historyおよびコンパイルscript.compilations_historyを確認するには、Nodes Statsを使用してください。最近のキャッシュの排出やコンパイルが多数ある場合、スクリプトキャッシュが小さい可能性があるため、設定script.cache.max_sizeを介してスクリプトキャッシュのサイズを倍増することを検討してください。

正規表現サーキットブレーカー

不適切に記述された正規表現は、クラスターの安定性とパフォーマンスを低下させる可能性があります。正規表現サーキットブレーカーは、Painlessスクリプト内の正規表現の使用と複雑さを制限します。

  • script.painless.regex.enabled
  • (Static) Painlessスクリプト内での正規表現を有効にします。受け入れ値:

    • limited (デフォルト)
    • 正規表現を有効にしますが、script.painless.regex.limit-factorクラスター設定を使用して複雑さを制限します。
    • true
    • 複雑さの制限なしで正規表現を有効にします。正規表現サーキットブレーカーを無効にします。
    • false
    • 正規表現を無効にします。正規表現を含むPainlessスクリプトはエラーを返します。

  • script.painless.regex.limit-factor
  • (Static) Painlessスクリプト内の正規表現が考慮できる文字数を制限します。Elasticsearchは、この制限を設定値とスクリプト入力の文字長を掛け算することで計算します。
    たとえば、入力foobarbazの文字長は9です。script.painless.regex.limit-factor6の場合、foobarbazの正規表現は最大54(9 * 6)文字を考慮できます。この制限を超える場合、正規表現サーキットブレーカーがトリガーされ、エラーを返します。
    Elasticsearchは、script.painless.regex.enabledlimitedの場合にのみこの制限を適用します。

EQLサーキットブレーカー

シーケンスクエリが実行されると、クエリを処理するノードは、シーケンスマッチングを実装するアルゴリズムに必要な構造をメモリに保持する必要があります。大量のデータを処理する必要がある場合や、ユーザーがサイズクエリパラメータを設定することによって大量の一致したシーケンスを要求する場合、これらの構造が占有するメモリはJVMの利用可能なメモリを超える可能性があります。これにより、OutOfMemory例外が発生し、ノードがダウンします。

これを防ぐために、特別なサーキットブレーカーが使用され、EQLシーケンスクエリの実行中のメモリ割り当てを制限します。ブレーカーがトリガーされると、org.elasticsearch.common.breaker.CircuitBreakingExceptionがスローされ、circuit_breaking_exceptionを含む説明的なエラーメッセージがユーザーに返されます。

このサーキットブレーカーは、次の設定を使用して構成できます:

  • breaker.eql_sequence.limit
  • (Dynamic) EQLシーケンスクエリの実行中にメモリ使用量を制限するために使用されるサーキットブレーカーの制限。この値はJVMヒープのパーセンテージとして定義されます。デフォルトは50%です。親サーキットブレーカー50%未満に設定されている場合、この設定はその値をデフォルトとして使用します。
  • breaker.eql_sequence.overhead
  • (Dynamic) シーケンスクエリのメモリ推定値に掛け算される定数で、最終的な推定値を決定します。デフォルトは1です。
  • breaker.eql_sequence.type
  • (Static) サーキットブレーカーのタイプ。有効な値は:
    • memory (デフォルト)
    • ブレーカーはEQLシーケンスクエリのメモリ使用量を制限します。
    • noop
    • ブレーカーを無効にします。

機械学習サーキットブレーカー

  • breaker.model_inference.limit
  • (Dynamic) トレーニングモデルサーキットブレーカーの制限。この値はJVMヒープのパーセンテージとして定義されます。デフォルトは50%です。親サーキットブレーカー50%未満に設定されている場合、この設定はその値をデフォルトとして使用します。
  • breaker.model_inference.overhead
  • (Dynamic) すべてのトレーニングモデル推定値に掛け算される定数で、最終的な推定値を決定します。サーキットブレーカーの設定を参照してください。デフォルトは1です。
  • breaker.model_inference.type
  • (Static) サーキットブレーカーの基礎となるタイプ。2つの有効なオプションがあります:noopmemorynoopは、サーキットブレーカーが過剰なメモリ使用を防ぐために何もしないことを意味します。memoryは、サーキットブレーカーがトレーニングモデルによって使用されるメモリを追跡し、OutOfMemoryエラーを防ぐ可能性があることを意味します。デフォルト値はmemoryです。