スプリットフロー制御は、タスクまたはノードで実行される同時スプリットスキャンの数を制限します。この制限がない場合、高いスキャン同時実行数によって以下の問題が発生する可能性があります。
-
内部テーブルの場合、同時スプリットスキャンがストレージノードの I/O リソースを競合するため、CPU 使用率とメモリ使用量が増加し、ストレージノードが不安定になる原因となります。
-
外部テーブルの場合、スキャン効率はデータソースによって異なります。同時スプリットスキャンの数がクォータを超えると、新しいスプリットスキャンは全体のスキャンを高速化するのではなく、コンピュートノードのリソースを消費し、他のクエリに影響を与えます。
スプリットフロー制御はデフォルトで有効になっています。
このトピックでは、スプリットフロー制御を有効または無効にする方法、およびタスクレベルとノードレベルの両方で同時スプリットスキャンのクォータを設定する方法について説明します。
前提条件
開始する前に、以下を確認してください。
-
V3.1.10.0 以降を実行している AnalyticDB for MySQL クラスター
クラスターのマイナーバージョンを確認するには、AnalyticDB for MySQL クラスターのバージョンを確認する方法をご参照ください。マイナーバージョンをアップグレードするには、テクニカルサポートにお問い合わせください。
仕組み
AnalyticDB for MySQL がクエリを実行すると、クエリは複数のステージに分割されます。各ステージは、ノード間で複数のタスクとして実行されます。テーブルをスキャンするために、テーブルは複数のスプリットに分割されます。各スプリットはタスクに割り当てられ、1 つのタスクで複数のスプリットを同時に処理できます。
スプリットフロー制御は、次の 2 つのレベルで動作します。
-
タスクレベル:各タスクには、同時スプリットスキャンのクォータがあります。タスク内で実行中のスプリットスキャンの数がクォータに達すると、新しいスプリットスキャンは実行中のスキャンが完了するまで待機します。
-
ノードレベル:各ノードには全体的なクォータがあります。タスクごとのクォータは、ノードのクォータに基づいて動的に調整されます。ノードに予備のキャパシティがある場合は増加し、ノードに負荷がかかっている場合は減少します。
クォータ管理アプローチの選択
クォータを設定する前に、システムがタスクごとのクォータを自動的に調整するようにするか、固定値に設定するかを決定します。
| アプローチ | 仕組み | 使用するケース |
|---|---|---|
| 動的調整 (推奨) | システムは、ノードの現在の負荷に基づいて各タスクのクォータを増減させます | リソースの可用性が変動する混合ワークロード |
| 固定クォータ | タスクごとのクォータは TARGET_RUNNING_SPLITS_LIMIT_PER_TASK の値に固定されます |
正確な同時実行制御が必要な予測可能なワークロード |
動的調整には、スプリットフロー制御が有効になっている必要があります。
スプリットフロー制御の有効化または無効化
スプリットフロー制御はデフォルトで有効になっています。無効化または再有効化するには、次のいずれかのステートメントを実行します。
クラスターの場合:
SET ADB_CONFIG SPLIT_FLOW_CONTROL_ENABLED=true|false;
単一クエリの場合 (ヒントを使用):
/*+ SPLIT_FLOW_CONTROL_ENABLED=true|false*/ SELECT * FROM table;
スプリットフロー制御が現在有効になっているかを確認するには:
SHOW ADB_CONFIG KEY=SPLIT_FLOW_CONTROL_ENABLED;
タスクごとのクォータの設定
動的調整の有効化または無効化
動的調整が有効な場合、各タスクのクォータは、ノードに予備のキャパシティがある場合は増加し、ノードのクォータに負荷がかかっている場合は減少します。タスクごとのクォータは、MIN_RUNNING_SPLITS_LIMIT_PER_TASK と MAX_RUNNING_SPLITS_LIMIT_PER_TASK によって設定された範囲内に収まります。
動的調整が無効な場合、タスクごとのクォータは TARGET_RUNNING_SPLITS_LIMIT_PER_TASK の値 (デフォルト:32) に固定されます。
動的調整を有効にする前に、スプリットフロー制御を有効にしてください。SHOW ADB_CONFIG KEY=SPLIT_FLOW_CONTROL_ENABLED; を実行して確認します。
動的調整を有効または無効にするには:
SET ADB_CONFIG NODE_LEVEL_SPLIT_FLOW_CONTROL_ENABLED=true|false;
クォータパラメーター
以下のパラメーターは、タスクごとの同時スプリットスキャンのクォータを制御します。
| パラメーター | デフォルト | 有効範囲 | 説明 |
|---|---|---|---|
MIN_RUNNING_SPLITS_LIMIT_PER_TASK |
1 | 1 から TARGET の値まで |
タスクごとの最小クォータ。ノードの負荷が高い場合、動的クォータはこの値を下回らないように減少します。 |
TARGET_RUNNING_SPLITS_LIMIT_PER_TASK |
32 | MIN の値から MAX の値まで |
タスクごとのベースラインクォータ。ノード上のすべてのタスクのターゲットクォータの合計がノードクォータ内に収まる場合、各タスクのクォータは動的に増加します。そうでない場合は減少します。この値は、動的調整が無効になっている場合の固定クォータも設定します。 |
MAX_RUNNING_SPLITS_LIMIT_PER_TASK |
64 | TARGET の値より大きい |
タスクごとの最大クォータ。ノードに予備のキャパシティがある場合、動的クォータはこの値を超えないように増加します。 |
クラスターまたはクエリへのクォータ設定の適用
クォータ設定は、SET ADB_CONFIG を使用してクラスターレベルで適用するか、ヒントを使用してクエリレベルで適用します。
クラスターレベル:
SET ADB_CONFIG <parameter>=<value>;
クエリレベル:
/*+ <parameter>=<value>*/ SELECT * FROM orders;
例
クラスター内のすべてのタスクの最小同時スプリットスキャンクォータを 24 に設定します。
SET ADB_CONFIG MIN_RUNNING_SPLITS_LIMIT_PER_TASK=24;
特定のクエリの最小クォータを 10 に設定します。
/*+ MIN_RUNNING_SPLITS_LIMIT_PER_TASK=10*/ SELECT * FROM orders;
クラスター内のすべてのタスクの最大クォータを 128 に設定します。
SET ADB_CONFIG MAX_RUNNING_SPLITS_LIMIT_PER_TASK=128;
特定のクエリの最大クォータを 100 に設定します。
/*+ MAX_RUNNING_SPLITS_LIMIT_PER_TASK=100*/ SELECT * FROM adb_test;
チューニングガイダンス
タスクのクォータを減らすと、より多くのスプリットがキューで待機することになり、そのクエリのスキャンレイテンシは増加しますが、他のクエリのためにリソースが解放されます。クォータを増やすと逆の効果があります。
| シナリオ | クエリの特性 | 推奨アプローチ |
|---|---|---|
| 点クエリまたは短レイテンシクエリ | スプリット数が少なく、データ量が小さく、高速な完了が期待される | MIN、TARGET、および MAX をより大きな値に設定するか、クエリのスプリットフロー制御を無効にします |
| 優先度の低い大規模なフルテーブルスキャン | スプリット数が多く、長時間実行され、レイテンシの影響を受けにくい | TARGET をより小さな値に設定して、優先度の高いクエリを保護します。リソースがアイドル状態になると、クォータは自動的に増加します |
| 外部テーブルクエリ | スキャン効率はデータソースのスループットに依存します | データソースの転送制限に基づいてクォータを設定し、ソースの過負荷を回避します |
ノードレベルのクォータの設定
各ノードには、同時スプリットスキャンの全体的なクォータがあります。デフォルトは、ストレージノードとコンピュートノードの両方で 256 です。
デフォルト値を変更しないでください。クォータが高すぎたり低すぎたりすると、クラスターのパフォーマンスが低下します。
ストレージノード (内部テーブルスキャン):
SET ADB_CONFIG WORKER_MAX_RUNNING_SOURCE_SPLITS_PER_NODE=256;
コンピュートノード (外部テーブルスキャン):
SET ADB_CONFIG EXECUTOR_MAX_RUNNING_SOURCE_SPLITS_PER_NODE=256;
現在のノードレベルのクォータを照会するには:
SHOW ADB_CONFIG;
詳細については、「SHOW ADB_CONFIG」をご参照ください。
注意事項
-
ノードクォータの変更は、保留中のスプリットにのみ適用されます。ノードクォータを減少させても、現在実行中のスプリットスキャンが完了した後にのみ有効になります。
-
タスクごとの最小クォータにより、ノードクォータが超過する可能性があります。ノード上のすべてのタスクにわたる
MIN_RUNNING_SPLITS_LIMIT_PER_TASKの合計がノードクォータを超えた場合、ノード上の実際の同時スプリットスキャン数が設定されたノードクォータを超えることがあります。