メインコンテンツまでスキップ
に最終更新

同時実行制御とキューイング:高い同時実行数による OOM とシステムのハングを防ぐ

同時実行制御とキューイングは、Doris のワークロード管理における中核的な仕組みです。同時に実行中のクエリ数がシステムの上限を超えると、Doris は超過分のクエリをすぐに拒否したり、システムに過度な負荷をかけたりする代わりに、待機キューに入れます。これにより、OOM やシステムのハングなどの問題を防ぎます。

この仕組みは ワークロードグループ を通じて実装されます。各ワークロードグループは、同時実行数の上限、キューの長さ、キューでの待機タイムアウトを個別に設定できます。

同時実行制御とキューイングを設定する​

目的:ワークロードグループを作成または変更し、同時実行するクエリ数を制限してキューイングを有効にします。

コマンド:

CREATE WORKLOAD GROUP IF NOT EXISTS queue_group
PROPERTIES (
"max_concurrency" = "10",
"max_queue_size" = "20",
"queue_timeout" = "3000"
);

パラメータの説明:

パラメータ型デフォルト値範囲説明
max_concurrency整数2147483647[0, 2147483647]クエリの同時実行数の上限。デフォルト値は整数の最大値で、同時実行数に制限がないことを意味します。実行中のクエリ数がこの上限に達すると、新しいクエリはキューイング処理に入ります。
max_queue_size整数0[0, 2147483647]待機キューの長さ。キューが満杯になると、新しいクエリは直ちに拒否されます。デフォルト値の 0 は、キューイングしないことを意味します。
queue_timeout整数0[0, 2147483647]クエリがキューで待機できる最大時間(ミリ秒)。タイムアウトすると、クライアントに直接失敗が返されます。デフォルト値の 0 は、キューに入った直後に失敗が返されることを意味します。

例の説明:

上記の設定は、単一 FE 構成では次を意味します。

  • クラスタで同時に実行されるクエリは最大 10 件です。
  • 同時実行数が上限に達すると、新しいクエリは最大長 20 のキューに入ります。
  • キュー内のクエリは最大 3 秒(3000 ミリ秒)待機し、タイムアウトすると失敗が返されます。
複数 FE 構成での注意事項

キューイングのパラメータは FE ごと に適用され、クラスタ内の FE の総数は考慮されません。たとえば、次のようになります。

  • max_concurrency = 1 でクラスタ内の FE が 1 台の場合、同時に実行される SQL は最大 1 件です。
  • max_concurrency = 1 でクラスタ内の FE が 3 台の場合、同時に実行される SQL は最大 3 件です(FE ごとに 1 件)。

複数 FE のクラスタでは、クラスタ全体で目標とする同時実行数を FE の台数で割った値を max_concurrency に設定します。

現在のキューイング状態を確認する​

目的:各ワークロードグループで現在実行中のクエリ数とキューで待機中のクエリ数を確認します。

コマンド:

SHOW WORKLOAD GROUPS;

出力例:

mysql [(none)]> SHOW WORKLOAD GROUPS\G;
*************************** 1. row ***************************
Id: 1
Name: normal
cpu_share: 20
memory_limit: 50%
enable_memory_overcommit: true
max_concurrency: 2147483647
max_queue_size: 0
queue_timeout: 0
cpu_hard_limit: 1%
scan_thread_num: 16
max_remote_scan_thread_num: -1
min_remote_scan_thread_num: -1
memory_low_watermark: 50%
memory_high_watermark: 80%
tag:
read_bytes_per_second: -1
remote_read_bytes_per_second: -1
running_query_num: 0
waiting_query_num: 0

主なフィールド:

  • running_query_num:現在実行中のクエリ数。
  • waiting_query_num:現在キューで待機中のクエリ数。

キューイングの制限を回避する(管理者操作)​

目的:運用時に管理者アカウントがキューイング処理を回避し、管理用 SQL を直接実行できるようにします。

コマンド:

SET bypass_workload_group = true;

説明:この設定はセッションレベルの変数であり、現在のセッションでのみ有効です。運用時に限って一時的に有効にし、作業が完了したら無効にするか、接続し直してください。

よくある質問​

Q:新しいクエリがキューに入らず、すぐに失敗する​

queue_timeout = 0 または max_queue_size = 0 に設定されていると、クエリはキューに入りません。max_queue_size > 0 かつ queue_timeout > 0 に設定してください。

Q:キューが満杯になるとクエリが拒否される​

max_queue_size の設定値が小さすぎます。max_queue_size を増やすか、max_concurrency を引き上げてください。

Q:複数 FE のクラスタで同時実行数の上限が想定と異なる​

キューイングのパラメータは FE ごとに適用されます。max_concurrency には、目標値を FE の台数で割った値を設定してください。

Q:管理者の操作もキューによってブロックされる​

回避用の変数が有効になっていません。SET bypass_workload_group = true を実行してください。