OceanBaseは、パラレル実行の初期化とチューニングを制御するための一連のパラメータを提供しています。
OceanBaseが起動される際に、テナントのCPU数とテナント構成パラメータpx_workers_per_cpu_quotaに基づいて、デフォルトのパラレル実行制御パラメータが計算されます。ユーザーはデフォルト値を使用しないこともでき、起動時に手動でパラメータ値を指定し、後で実際のシナリオに応じて手動でパラメータ値を調整することもできます。
パラレル実行機能はデフォルトで有効になっています。本記事では、以下のいくつかの側面からパラレル実行パラメータの制御技術について説明します:
- パラレル実行のデフォルトパラメータ
- パラレル実行関連パラメータのチューニング
パラレル実行のデフォルトパラメータ
パラレル実行のパラメータは、パラレルスレッド数やパラレル実行キューなどの動作を制御できます。具体的には以下の表のとおりです:
| パラメータ名 | デフォルト値 | レベル | 説明 |
|---|---|---|---|
| px_workers_per_cpu_quota | 10 | テナントレベルの構成パラメータ | 各CPUに割り当て可能なパラレル実行スレッド数。値の範囲は [1,20]。 |
| parallel_servers_target | MIN CPU * px_workers_per_cpu_quota | テナントレベルの変数 | テナントが各ノードで申請可能なパラレル実行スレッド数を表します。 |
| parallel_degree_policy | MANUAL | テナントレベル/SESSIONレベルの変数 | 自動DOPの有効化スイッチです。AUTOに設定すると自動DOPが有効になり、オプティマイザーが統計情報に基づいてQueryの並列度を自動的に計算します。MANUALに設定すると、HINT、TABLE PARALLEL属性、SESSIONレベルのDOPなどによって並列度を制御します。 |
ユーザーがパラレル実行を利用するハードルを低くするため、OceanBaseはパラレル実行パラメータの数を最小限に抑え、デフォルトパラメータだけで即時利用が可能になっています。特殊なシナリオでは、ユーザーはデフォルトパラメータを変更することでアプリケーションのチューニングを実現できます。
px_workers_per_cpu_quota
このパラメータは、各CPUに割り当てることができるパラレル実行スレッド数を表します。テナントに割り当てられたMIN CPUがNの場合、並列負荷が均等であれば、各ノードに割り当てることができるスレッド数はN * px_workers_per_cpu_quotaとなります。並列負荷がアクセスするデータの分布が不均等な場合、一部のノードでは実際に割り当てられるスレッド数が短時間でN * px_workers_per_cpu_quotaを超える可能性があります。負荷終了時に、これらの過剰に割り当てられたスレッドは自動的に回収されます。
px_workers_per_cpu_quotaがparallel_servers_targetのデフォルト値に与える影響は、テナント作成時にのみ発生します。テナント作成後にpx_workers_per_cpu_quotaの値を変更しても、parallel_servers_targetの値は変更されません。
一般的に、px_workers_per_cpu_quotaのデフォルト値を変更する必要はありません。リソース分離機能が有効になっていない場合、パラレル実行がすべてのCPUリソースを占有する状況が発生した場合、px_workers_per_cpu_quotaの値を下げることでこの問題を緩和できます。
parallel_servers_target
このパラメータは、テナントが各ノードで申請できるパラレル実行スレッドリソースの数を表します。リソースが枯渇した場合、パラレル実行リクエストはキューイングされます。キューイングの概念については、同時実行制御とキューイングを参照してください。
パラレル実行のCPU利用率が非常に低い場合、それはparallel_servers_targetの値が小さすぎるため、SQLのDOPがダウングレードされ、実際に割り当てられるスレッド数が期待される数より少ないことが原因です。
OceanBaseデータベースV3.2.3以前では、parallel_servers_targetのデフォルト値は非常に小さく、parallel_servers_targetの値を大きくすることで解決できます。MIN CPU * 10に設定することを推奨します。
OceanBaseデータベースV3.2.3以降では、parallel_servers_targetのデフォルト値はMIN CPU * 10であり、一般的にこの問題は発生しません。
説明
MIN CPUとは、テナントのmin_cpu値を指し、通常はテナント作成時に指定されます。
parallel_servers_targetの値を設定した後、再接続して以下のコマンドを実行して最新値を確認します:
SHOW VARIABLES LIKE 'parallel_servers_target';
運用保守の観点から、頻繁な調整を避けるために、parallel_servers_targetに最大値を設定できます。理論的には、parallel_servers_targetを無限大に設定することも可能ですが、その場合直面する問題は非効率です。すべてのクエリがキューイングされずに実行が開始され、CPUタイムスロットやディスクI/O、ネットワークI/Oを争うことになります。
スループットの観点から見ると、この問題はそれほど深刻ではありません。しかし、個々のSQL遅延の観点から見ると、この競合は遅延に深刻な影響を与えます。CPUとI/Oの利用率を総合的に考慮すると、テナントUnitのMIN CPUを基準に、一般的にparallel_servers_targetをMIN CPU * 10に設定するのが適切です。I/O集約型のシナリオでは、CPUがフル稼働しない可能性があるため、parallel_servers_targetをMIN CPU * 20に設定することができます。
parallel_degree_policy
このパラメータは、自動DOPの有効化スイッチです。AUTOに設定すると、自動DOPが有効になり、オプティマイザーが統計情報に基づいてQueryの並列度を自動的に計算します。MANUALに設定すると、HINT、TABLE PARALLEL属性、SESSIONレベルのDOPなどに基づいて並列度を制御します。
OceanBaseデータベースV4.2以降では、ユーザーが並列度の設定ルールに慣れていない場合、parallel_degree_policyをAUTOに設定することで、オプティマイザーに並列度の選択を自動化させることができます。自動並列度の計算ルールについては、並列度および優先順位の設定を参照してください。
OceanBaseデータベースV4.2以前のバージョンでは、parallel_degree_policyスイッチはサポートされておらず、自動DOP機能もサポートされていないため、手動で設定する必要があります。
パラレル実行関連パラメータのチューニング
ob_sql_work_area_percentage
テナントレベルの変数で、SQLモジュールが使用できる最大メモリを制限します。これはパーセンテージ値であり、テナント全体のメモリに占める割合を示します。デフォルトは5で、テナントメモリの5%を意味します。SQLが使用するメモリが制限を超えると、メモリのディスクへの書き出しがトリガーされます。
SQLワークエリアの実際の使用量は、observer.logログ内でWORK_AREAと検索することができます。例:
[MEMORY] tenant_id=1001 ctx_id=WORK_AREA hold=2,097,152 used=0 limit=157,286,400
読み取りが多く、書き込みが少ないシナリオでは、SQLモジュールのメモリ制限によりデータがディスクに書き出される場合、ob_sql_work_area_percentageの値を適宜増やすことができます。
workarea_size_policy
OceanBaseはグローバルな自己適応型メモリ管理を実装しています。workarea_size_policyがAUTOに設定されている場合、実行フレームワークはHashJoin、GroupBy、Sortなどの各演算子に対して最適な戦略でメモリを割り当て、自己適応型のデータ書き出し戦略を有効にします。
パラレルDMLパラメータのチューニング
OceanBaseデータベースV4.1以降では、トランザクション要件がない場合、テーブルにデータをインポートする際にINSERT INTO SELECTとダイレクトロード機能を組み合わせて、一度に新しいテーブルにデータを挿入することを推奨します。この方法は、インポート時間を短縮すると同時に、書き込み速度が速すぎることによるメモリ不足の問題を回避できます。
OceanBaseデータベースV4.1以前のバージョンでは、単一のパラレルDML実行時間が30分を超える場合、undo_retention値を設定する必要があります。詳細については、パラレル実行の分類のトランザクション処理を参照してください。