Query queues
このトピックでは、StarRocks におけるクエリキューの管理方法について説明します。
v2.5 から、StarRocks はクエリキューをサポートしています。クエリキューが有効な場合、StarRocks は同時実行のしきい値やリソース制限に達したときに自動的に受信クエリをキューに入れ、過負荷の悪化を回避します。保留中のクエリは、実行を開始するのに十分な計算リソースが利用可能になるまでキューで待機します。v3.1.4 以降、StarRocks はリソースグループレベルでのクエリキューの設定をサポートしています。
CPU 使用率、メモリ使用率、クエリの同時実行数にしきい値を設定して、クエリキューをトリガーできます。
ロードマップ:
| バージョン | グローバルクエリキュー | リソースグループレベルのクエリキュー | 集合的同時実行管理 | 動的同時実行調整 |
|---|---|---|---|---|
| v2.5 | ✅ | ❌ | ❌ | ❌ |
| v3.1.4 | ✅ | ✅ | ✅ | ✅ |
クエリキューを有効にする
クエリキューはデフォルトで無効になっています。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;
リソースしきい値を指定する
グローバルクエリキューのリソースしきい値を指定する
次のグローバルセッション変数を使用して、クエリキューをトリガーするしきい値を設定できます。
| 変数 | デフォルト | 説明 |
|---|---|---|
| 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 に設定すると制限がないことを示します。 |
注意
デフォルトでは、BE は 1 秒間隔でリソース使用状況を FE に報告します。この間隔は、BE の設定項目
report_resource_usage_interval_msを設定することで変更できます。
リソースグループレベルのクエリキューのリソースしきい値を指定する
v3.1.4 以降、リソースグループを作成する際に個別の同時実行制限 (concurrency_limit) と CPU コア制限 (max_cpu_cores) を設定できます。クエリが開始されると、グローバルまたはリソースグループレベルのいずれかでリソース消費がしきい値を超えた場合、そのクエリはすべてのリソース消費がしきい値内に収まるまでキューに入れられます。
| 変数 | デフォルト | 説明 |
|---|---|---|
| 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を超えるクエリの急増に対応できるようにします。
クエリキューを設定する
次のグローバルセッション変数を使用して、クエリキューの容量とキュー内のクエリの最大タイムアウトを設定できます。
| 変数 | デフォルト | 説明 |
|---|---|---|
| query_queue_max_queued_queries | 1024 | キュー内のクエリの上限。このしきい値に達すると、受信クエリは拒否されます。0 より大きく設定された場合にのみ有効です。 |
| query_queue_pending_timeout_second | 300 | キュー内の保留中のクエリの最大タイムアウト。このしきい値に達すると、対応するクエリは拒否されます。単位: 秒。 |