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 | テナント/セッション変数 | 自動DOPのオン/オフスイッチです。AUTOに設定すると自動DOPが有効になり、オプティマイザーが統計情報に基づいてQueryの並列度を自動的に計算します。MANUALに設定すると、HINT、TABLE PARALLEL属性、セッションレベルの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値を設定する必要があります。詳細については、パラレル実行の分類 のトランザクション処理を参照してください。