メインコンテンツまでスキップ
バージョン: 3.2

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_limit0BE 上の同時クエリの上限。0 より大きく設定された場合にのみ有効です。0 に設定すると制限がないことを示します。
query_queue_mem_used_pct_limit0BE 上のメモリ使用率の上限。0 より大きく設定された場合にのみ有効です。範囲: [0, 1]。0 に設定すると制限がないことを示します。
query_queue_cpu_used_permille_limit0BE 上の 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_limit0単一の BE ノード上のリソースグループの同時実行制限。0 より大きく設定された場合にのみ有効です。
max_cpu_cores0単一の 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_queriesreport_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_queries1024キュー内のクエリの上限。このしきい値に達すると、受信クエリは拒否されます。0 より大きく設定された場合にのみ有効です。
query_queue_pending_timeout_second300キュー内の保留中のクエリの最大タイムアウト。このしきい値に達すると、対応するクエリは拒否されます。単位: 秒。

クエリの同時実行の動的調整を設定する

バージョン v3.1.4 以降、クエリキューによって管理され、Pipeline Engine によって実行されるクエリに対して、StarRocks は現在の実行中のクエリの数 num_running_queries、フラグメントの数 num_fragments、およびクエリの同時実行 pipeline_dop に基づいて、受信クエリのクエリ同時実行 pipeline_dop を動的に調整できます。これにより、スケジューリングのオーバーヘッドを最小限に抑えながらクエリの同時実行を動的に制御し、最適な BE リソースの利用を確保できます。フラグメントとクエリの同時実行 pipeline_dop についての詳細は、Query Management - Adjusting Query Concurrency を参照してください。

クエリキューの各クエリに対して、StarRocks は単一の BE 上のクエリの並行フラグメントを表すドライバーの概念を維持します。その論理値 num_drivers は、単一の BE 上のそのクエリのすべてのフラグメントの総同時実行を表し、num_fragments * pipeline_dop に等しいです。新しいクエリが到着すると、StarRocks は次のルールに基づいてクエリの同時実行 pipeline_dop を調整します。

  • 実行中のドライバーの数 num_drivers が同時ドライバーの低水準制限 query_queue_driver_low_water を超えるほど、クエリの同時実行 pipeline_dop は低く調整されます。
  • StarRocks は、クエリの同時ドライバーの高水準制限 query_queue_driver_high_water 以下に実行中のドライバーの数 num_drivers を抑制します。

次のグローバルセッション変数を使用して、クエリの同時実行 pipeline_dop の動的調整を設定できます。

変数デフォルト説明
query_queue_driver_high_water-1クエリの同時ドライバーの高水準制限。非負の値に設定された場合にのみ有効です。0 に設定すると、avg_be_cpu_cores * 16 に相当し、avg_be_cpu_cores はすべての BE ノードの平均 CPU コア数を表します。0 より大きい値に設定すると、その値が直接使用されます。
query_queue_driver_low_water-1クエリの同時ドライバーの低水準制限。非負の値に設定された場合にのみ有効です。0 に設定すると、avg_be_cpu_cores * 8 に相当します。0 より大きい値に設定すると、その値が直接使用されます。

クエリキューを監視する

次の方法を使用して、クエリキューに関連する情報を表示できます。

SHOW PROC

SHOW PROC を使用して、BE ノードの実行中のクエリの数、メモリおよび CPU の使用状況を確認できます。

mysql> SHOW PROC '/backends'\G
*************************** 1. row ***************************
...
NumRunningQueries: 0
MemUsedPct: 0.79 %
CpuUsedPct: 0.0 %

SHOW PROCESSLIST

SHOW PROCESSLIST を使用して、クエリがキューに入っているかどうか (IsPendingtrue の場合) を確認できます。

mysql> SHOW PROCESSLIST;
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+
| Id | User | Host | Db | Command | ConnectionStartTime | Time | State | Info | IsPending |
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+
| 2 | root | xxx.xx.xxx.xx:xxxxx | | Query | 2022-11-24 18:08:29 | 0 | OK | SHOW PROCESSLIST | false |
+------+------+---------------------+-------+---------+---------------------+------+-------+-------------------+-----------+

FE 監査ログ

FE 監査ログファイル fe.audit.log を確認できます。フィールド PendingTimeMs は、クエリがキューで待機した時間を示し、その単位はミリ秒です。

監視メトリクス

Monitor and Alert 機能を使用して、StarRocks のクエリキューのメトリクスを取得できます。次の FE メトリクスは、各 FE ノードの統計データに基づいています。

メトリクス単位タイプ説明
starrocks_fe_query_queue_pendingカウント瞬時値キュー内のクエリの現在の数。
starrocks_fe_query_queue_totalカウント瞬時値歴史的にキューに入れられたクエリの総数 (現在実行中のものを含む)。
starrocks_fe_query_queue_timeoutカウント瞬時値キュー内でタイムアウトしたクエリの総数。
starrocks_fe_resource_group_query_queue_totalカウント瞬時値このリソースグループで歴史的にキューに入れられたクエリの総数 (現在実行中のものを含む)。name ラベルはリソースグループの名前を示します。このメトリクスは v3.1.4 以降でサポートされています。
starrocks_fe_resource_group_query_queue_pendingカウント瞬時値このリソースグループのキュー内のクエリの数。name ラベルはリソースグループの名前を示します。このメトリクスは v3.1.4 以降でサポートされています。
starrocks_fe_resource_group_query_queue_timeoutカウント瞬時値このリソースグループのキュー内でタイムアウトしたクエリの数。name ラベルはリソースグループの名前を示します。このメトリクスは v3.1.4 以降でサポートされています。

SHOW RUNNING QUERIES

v3.1.4 以降、StarRocks は SQL ステートメント SHOW RUNNING QUERIES をサポートしており、各クエリのキュー情報を表示するために使用されます。各フィールドの意味は次のとおりです。

  • QueryId: クエリの ID。
  • ResourceGroupId: クエリがヒットしたリソースグループの ID。ユーザー定義のリソースグループにヒットしない場合は "-" と表示されます。
  • StartTime: クエリの開始時間。
  • PendingTimeout: キュー内で PENDING クエリがタイムアウトする時間。
  • QueryTimeout: クエリがタイムアウトする時間。
  • State: クエリのキュー状態で、"PENDING" はキュー内にあることを示し、"RUNNING" は現在実行中であることを示します。
  • Slots: クエリによって要求される論理リソース量で、現在は 1 に固定されています。
  • Frontend: クエリを開始した FE ノード。
  • FeStartTime: クエリを開始した FE ノードの開始時間。

例:

MySQL [(none)]> SHOW RUNNING QUERIES;
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+
| QueryId | ResourceGroupId | StartTime | PendingTimeout | QueryTimeout | State | Slots | Frontend | FeStartTime |
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+
| a46f68c6-3b49-11ee-8b43-00163e10863a | - | 2023-08-15 16:56:37 | 2023-08-15 17:01:37 | 2023-08-15 17:01:37 | RUNNING | 1 | 127.00.00.01_9010_1692069711535 | 2023-08-15 16:37:03 |
| a6935989-3b49-11ee-935a-00163e13bca3 | 12003 | 2023-08-15 16:56:40 | 2023-08-15 17:01:40 | 2023-08-15 17:01:40 | RUNNING | 1 | 127.00.00.02_9010_1692069658426 | 2023-08-15 16:37:03 |
| a7b5e137-3b49-11ee-8b43-00163e10863a | 12003 | 2023-08-15 16:56:42 | 2023-08-15 17:01:42 | 2023-08-15 17:01:42 | PENDING | 1 | 127.00.00.03_9010_1692069711535 | 2023-08-15 16:37:03 |
+--------------------------------------+-----------------+---------------------+---------------------+---------------------+-----------+-------+---------------------------------+---------------------+