リソースグループ
このトピックでは、StarRocks のリソースグループ機能について説明します。
この機能を使用すると、短いクエリ、アドホッククエリ、ETL ジョブなど、複数のワークロードを単一のクラスターで同時に実行でき、複数のクラスターを展開するための追加コストを節約できます。技術的な観点から見ると、実行エンジンはユーザーの指定に従って同時にワークロードをスケジュールし、それらの間の干渉を分離します。
リソースグループのロードマップ:
- v2.2 以降、StarRocks はクエリのリソース消費を制限し、同じクラスター内のテナント間でのリソースの分離と効率的な使用を実現します。
- StarRocks v2.3 では、大規模クエリのリソース消費をさらに制限し、過大なクエリ要求によってクラスターリソースが枯渇するのを防ぎ、システムの安定性を保証します。
- StarRocks v2.5 は、データロード(INSERT)の計算リソース消費を制限します。
- v3.3.5 以降、StarRocks は CPU リソースに対する厳しい制限を課すことをサポートします。
Internal Table | External Table | Big Query Restriction | INSERT INTO | Broker Load | Routine Load, Stream Load, Schema Change | CPU Hard Limit | |
---|---|---|---|---|---|---|---|
2.2 | √ | × | × | × | × | × | x |
2.3 | √ | √ | √ | × | × | × | x |
2.5 | √ | √ | √ | √ | × | × | x |
3.1 & 3.2 | √ | √ | √ | √ | √ | × | x |
3.3.5 and later | √ | √ | √ | √ | √ | × | √ |
用語
このセクションでは、リソースグループ機能を使用する前に理解しておくべき用語について説明します。
リソースグループ
各リソースグループは、特定の BE からの計算リソースのセットです。クラスターの各 BE を複数のリソースグループに分割できます。クエリがリソースグループに割り当てられると、StarRocks は指定されたリソースクォータに基づいて、そのリソースグループに CPU とメモリリソースを割り当てます。
BE 上のリソースグループに対して、次のパラメータを使用して CPU とメモリのリソースクォータを指定できます。
パラメータ | 説明 | 値の範囲 | デフォルト |
---|---|---|---|
cpu_weight | BE ノード上のこのリソースグループの CPU スケジューリングの重み。 | (0, avg_be_cpu_cores ] (0 より大きい場合に有 効) | 0 |
exclusive_cpu_cores | このリソースグループの CPU ハードアイソレーションパラメータ。 | (0, min_be_cpu_cores - 1 ] (0 より大きい場合に有効) | 0 |
mem_limit | 現在の BE ノード上でこのリソースグループがクエリに利用できるメモリの割合。 | (0, 1] (必須) | - |
spill_mem_limit_threshold | ディスクへのスピリングをトリガーするメモリ使用量のしきい値。 | (0, 1] | 1.0 |
concurrency_limit | このリソースグループでの同時クエリの最大数。 | 整数 (0 より大きい場合に有効) | 0 |
big_query_cpu_second_limit | 各 BE ノードでの大規模クエリタスクの最大 CPU 時間(秒単位)。 | 整数 (0 より大きい場合に有効) | 0 |
big_query_scan_rows_limit | 各 BE ノードで大規模クエリタスクがスキャンできる最大行数。 | 整数 (0 より大きい場合に有効) | 0 |
big_query_mem_limit | 各 BE ノードで大規模クエリタスクが使用できる最大メモリ。 | 整数 (0 より大きい場合に有効) | 0 |
CPU リソースパラメータ
cpu_weight
このパラメータは、単一の BE ノード上のリソースグループの CPU スケジューリングの重みを指定 し、このグループからのタスクに割り当てられる CPU 時間の相対的なシェアを決定します。v3.3.5 以前では、これは cpu_core_limit
と呼ばれていました。
その値の範囲は (0, avg_be_cpu_cores
] で、avg_be_cpu_cores
はすべての BE ノードにおける CPU コアの平均数です。このパラメータは、0 より大きい値に設定された場合にのみ有効です。cpu_weight
または exclusive_cpu_cores
のいずれかが 0 より大きくなければなりませんが、両方ではありません。
注意
例えば、3 つのリソースグループ rg1、rg2、rg3 がそれぞれ cpu_weight 値 2、6、8 を持っているとします。完全に負荷がかかっている BE ノードでは、これらのグループはそれぞれ 12.5%、37.5%、50% の CPU 時間を受け取ります。ノードが完全に負荷がかかっていない場合、rg1 と rg2 が負荷を受けている間、rg3 がアイドル状態である場合、rg1 と rg2 はそれぞれ 25% と 75% の CPU 時間を受け取ります。
exclusive_cpu_cores
このパラメータは、リソースグループの CPU ハード制限を定義します。これには 2 つの意味があります。
- 専用:
exclusive_cpu_cores
CPU コアをこのリソースグループ専用に予約し、アイドル状態でも他のグループには利用できません。 - クォータ: リソースグループをこれらの予約された CPU コアのみを使用するように制限し、他のグループから利用可能な CPU リソースを使用できないようにします。
値の範囲は (0, min_be_cpu_cores - 1
] で、min_be_cpu_cores
はすべての BE ノードにおける CPU コアの最小数です。0 より大きい場合にのみ有効です。cpu_weight
または exclusive_cpu_cores
のいずれかのみが 0 より大きく設定できます。
exclusive_cpu_cores
が 0 より大きいリソースグループは専用リソースグループと呼ばれ、それに割り当てられた CPU コアは専用コアと呼ばれます。他のグループは共有リソースグループと呼ばれ、共有コアで実行されます。- すべてのリソースグループにわたる
exclusive_cpu_cores
の合計数はmin_be_cpu_cores - 1
を超えることはできません。上限は、少なくとも 1 つの共有コアを利用可能にするために設定されています。
exclusive_cpu_cores
と cpu_weight
の関係:
cpu_weight
または exclusive_cpu_cores
のいずれかのみが一度にアクティブにできます。専用リソースグループは、cpu_weight
を介して CPU 時間のシェアを要求することなく、独自の予約された専用コアで動作します。
共有リソースグループが専用リソースグループから専用コアを借りることができるかどうかを BE 設定 enable_resource_group_cpu_borrowing
を使用して設定できます。デフォルトでは true
に設定されており、専用グループがアイドル状態のときに共有グループが CPU リソースを借りることができます。
この設定を動的に変更するには、次のコマンドを使用します。
UPDATE information_schema.be_configs SET VALUE = "false" WHERE NAME = "enable_resource_group_cpu_borrowing";
メモリリソースパラメータ
mem_limit
現在の BE ノードでリソースグループが利用できるメモリ(クエリプール)の割合を指定します。値の範囲は (0,1] です。
spill_mem_limit_threshold
ディスクへのスピリングをトリガーするメモリ使用量のしきい値を定義します。値の範囲は (0,1] で、デフォルトは 1(非アクティブ)です。v3.1.7 で導入されました。
- 自動スピリングが有効(
spill_mode
がauto
に設定)で、リソースグループが無効な場合、クエリのメモリ使用量がquery_mem_limit
の 80% を超えると、システムは中間結果をディスクにスピルします。 - リソースグループが有効な場合、次の場合にスピリングが発生します:
- グループ内のすべてのクエリのメモリ使用量が
current BE memory limit * mem_limit * spill_mem_limit_threshold
を超える場合、または - 現在のクエリのメモリ使用量が
query_mem_limit
の 80% を超える場合。
- グループ内のすべてのクエリのメモリ使用量が