Query queues
このトピックでは、StarRocks におけるクエリキューの管理方法について説明します。
v2.5 から、StarRocks はクエリキューをサポートしています。クエリキューが有効になると、同時実行の閾値やリソース制限に達した場合、StarRocks は自動的に受信クエリをキューに入れ、過負荷の悪化を防ぎます。保留中のクエリは、実行を開始するのに十分な計算リソースが利用可能になるまでキューで待機します。v3.1.4 以降、StarRocks はリソースグループレベルでのクエリキューの設定をサポートしています。
CPU 使用率、メモリ使用率、クエリの同時実行数に閾値を設定して、クエリキューをトリガーできます。
ロードマップ:
| Version | Global query queue | Resource group-level query queue | Collective concurrency management | Dynamic concurrency adjustment |
|---|---|---|---|---|
| v2.5 | ✅ | ❌ | ❌ | ❌ |
| v3.1.4 | ✅ | ✅ | ✅ | ✅ |
Query queues を有効にする
クエリキューはデフォルトで無効になっています。INSERT ロード、SELECT クエリ、および統計クエリに対して、対応するグローバルセッション変数を設定することで、グローバルまたはリソースグループレベルのクエリキューを有効にできます。
グローバルクエリキューを有効にする
- ロ ードタスクのクエリキューを有効にする:
SET GLOBAL enable_query_queue_load = true;
- SELECT クエリのクエリキューを有効にする:
SET GLOBAL enable_query_queue_select = true;
- 統計クエリのクエリキューを有効にする:
SET GLOBAL enable_query_queue_statistic = true;
リソースグループレベルのクエリキューを有効にする
v3.1.4 以降、StarRocks はリソースグループレベルでのクエリキューの設定をサポートしています。
リソースグループレベルのクエリキューを有効にするには、上記のグローバルセッション変数に加えて enable_group_level_query_queue を設定する必要があります。
SET GLOBAL enable_group_level_query_queue = true;
リソースの閾値を指定する
グローバルクエリキューのリソース閾値を指定する
以下のグローバルセッション変数を使用して、クエリキューをトリガーする閾値を設定できます。
| Variable | Default | Description |
|---|---|---|
| query_queue_concurrency_limit | 0 | BE 上の同時クエリの上限。0 より大きく設定された場合にのみ有効になります。0 に設定すると、制限が課されないことを示します。 |
| query_queue_mem_used_pct_limit | 0 | BE 上のメモリ使用率の上限。0 より大きく設定された場合にのみ有効になります。範囲: [0, 1]。0 に設定すると、制限が課されないことを示します。 |
| query_queue_cpu_used_permille_limit | 0 | BE 上の CPU 使用率のパーミル (CPU 使用率 * 1000) の上限。0 より大きく設定された場合にのみ有効になります。範囲: [0, 1000]。0 に設定すると、制限が課されないことを示します。 |
NOTE
デフォルトでは、BE は 1 秒間隔でリソース使用状況を FE に報告します。この間隔は、BE の設定項目
report_resource_usage_interval_msを設定することで変更できます。
リソースグループレベルのクエリキューのリソース閾値を指定する
v3.1.4 以降、リソースグループを作成する際に個別の同時実行制限 (concurrency_limit) と CPU コア制限 (max_cpu_cores) を設定できます。クエリが開始されると、グローバルまたはリソースグループレベルのいずれかでリソース消費がリソース閾値を超えた場合、そのクエリはすべてのリソース消費が閾値内に収まるまでキューに入れられます。
| Variable | Default | Description |
|---|---|---|
| concurrency_limit | 0 | 単一の BE ノード上のリソースグループの同時実行制限。0 より大きく設定された場合にのみ有効になります。 |
| max_cpu_cores | 0 | 単一の BE ノード上のこのリソースグループの CPU コア制限。0 より大きく設定された場合にのみ有効になります。範囲: [0, avg_be_cpu_cores]。ここで avg_be_cpu_cores はすべての BE ノードの平均 CPU コア数を表します。 |
各 BE ノードのリソースグループごとのリソース使用情報を表示するには、View Resource Group Usage Information を参照してください。
クエリの同時実行を管理する
実行中のクエリの数 (num_running_queries) がグローバルまたはリソースグループの concurrency_limit を超えると、受信クエリはキューに入れられます。num_running_queries を取得する方法は、バージョン < v3.1.4 と ≥ v3.1.4 で異なります。
-
バージョン < v3.1.4 では、
num_running_queriesはreport_resource_usage_interval_msで指定された間隔で BEs によって報告されます。そのため、num_running_queriesの変化の特定に遅延が生じる可能性があります。たとえば、BEs によって報告されたnum_running_queriesがグローバルまたはリソースグループのconcurrency_limitを超えていない場合でも、次の報告前に受信クエリが到着しconcurrency_limitを超えた場合、これらの受信クエリはキューで待機せずに実行されます。 -
バージョン ≥ v3.1.4 では、すべての実行中のクエリは Leader FE によって集中的に管理されます。各 Follower FE はクエリの開始または終了時に Leader FE に通知し、StarRocks は
concurrency_limitを超えるクエリの急増が発生した場合のシナリオを処理します。
クエリキューを設定する
クエリキューの容量とキュー内のクエリの最大タイムアウトを、以下のグローバルセッション変数を使用して設定できます。
| Variable | Default | Description |
|---|---|---|
| query_queue_max_queued_queries | 1024 | キュー内のクエリの上限。この閾値に達すると、受信クエリは拒否されます。0 より大きく設定された場合にのみ有効になります。 |
| query_queue_pending_timeout_second | 300 | キュー内の保留中クエリの最大タイムアウト。この閾値に達すると、対応するクエリは拒否されます。単位: 秒。 |