サーキットブレーカーの設定
Elasticsearchには、OutOfMemoryErrorを引き起こす操作を防ぐために使用される複数のサーキットブレーカーが含まれています。各ブレーカーは、使用できるメモリの制限を指定します。さらに、すべてのブレーカーで使用できるメモリの総量を指定する親レベルのブレーカーがあります。
特に記載がない限り、これらの設定は、cluster-update-settings APIを使用して、ライブクラスターで動的に更新できます。
サーキットブレーカーエラーに関する情報は、Circuit breaker errorsを参照してください。
親サーキットブレーカー
親レベルのブレーカーは、次の設定で構成できます:
indices.breaker.total.use_real_memory
(Static) 親ブレーカーが実際のメモリ使用量を考慮すべきか(
true
)、それとも子サーキットブレーカーによって予約された量のみを考慮すべきかを決定します(false
)。デフォルトはtrue
です。indices.breaker.total.limit
- (Dynamic) 全体の親ブレーカーの開始制限。
indices.breaker.total.use_real_memory
がfalse
の場合、JVMヒープの70%がデフォルトです。indices.breaker.total.use_real_memory
がtrue
の場合、JVMヒープの95%がデフォルトです。
フィールドデータサーキットブレーカー
フィールドデータサーキットブレーカーは、フィールドをフィールドデータキャッシュにロードするために必要なヒープメモリを推定します。フィールドのロードが事前定義されたメモリ制限を超える場合、サーキットブレーカーは操作を停止し、エラーを返します。
indices.breaker.fielddata.limit
(Dynamic) フィールドデータブレーカーの制限。デフォルトはJVMヒープの40%です。
indices.breaker.fielddata.overhead
- (Dynamic) フィールドデータのすべての推定値に掛け算される定数で、最終的な推定値を決定します。デフォルトは
1.03
です。
リクエストサーキットブレーカー
リクエストサーキットブレーカーは、Elasticsearchがリクエストごとのデータ構造(たとえば、リクエスト中の集計計算に使用されるメモリ)が特定のメモリ量を超えないようにすることを可能にします。
indices.breaker.request.limit
(Dynamic) リクエストブレーカーの制限、デフォルトはJVMヒープの60%です。
indices.breaker.request.overhead
- (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-factor
が6
の場合、foobarbaz
の正規表現は最大54(9 * 6)文字を考慮できます。この制限を超える場合、正規表現サーキットブレーカーがトリガーされ、エラーを返します。
Elasticsearchは、script.painless.regex.enabled
がlimited
の場合にのみこの制限を適用します。
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つの有効なオプションがあります:
noop
とmemory
。noop
は、サーキットブレーカーが過剰なメモリ使用を防ぐために何もしないことを意味します。memory
は、サーキットブレーカーがトレーニングモデルによって使用されるメモリを追跡し、OutOfMemory
エラーを防ぐ可能性があることを意味します。デフォルト値はmemory
です。