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