OceanBaseのパラレルクエリ(PX)性能は、以下の2種類のパラメータによって制御されます:
- 並列度パラメータ:クエリ実行時のワーカースレッド数を決定します。
- EXCHANGE(Shuffle)パラメータ:各DFO間でデータ転送を行う際のパラメータ制御、つまりデータの分散(Shuffle)時のメモリ制御を行います。
パラメータ設定の核心ロジック:
並列度パラメータのチューニング:
parallel_servers_targetを使用して、クラスタのPXリソースプールサイズを制御します。PXクエリのキューイングが頻繁に発生する場合は、このパラメータ値を適宜大きく調整できます。Shuffleパラメータのチューニング:
dtl_buffer_sizeはデフォルトでほとんどのシナリオに適応しており、特別なニーズ(例えば、低頻度での大規模行転送)の場合にのみ調整しますが、このパラメータの変更は推奨されません。
パラレル度パラメータ
コアパラメータ:parallel_servers_target
このパラメータは、クラスタで許可される 最大利用可能なパラレルワーカーの合計数 を制御します。クエリリクエストのパラレル度(DOP)と現在割り当てられているワーカーの合計がこの値を超えた場合、クエリはキューに入れられて待機します。
| パラメータ名 | 説明 | 値の範囲 | デフォルト値 | 設定の推奨事項 |
|---|---|---|---|---|
parallel_servers_target |
パラレルクエリがキューイングするかどうかを決定します。クエリに必要なワーカー数 + 現在のワーカー数の合計 ≤ パラメータ値の場合は直接実行し、そうでない場合はキューイングします。 | [0, 9223372036854775807] | 0(現在はCPU数に基づいて計算され、実際のサイズに準じます) | このパラメータは主にPXシナリオで、パラレルクエリを実行しようとしている場合に、十分なワーカーがない場合に処理を続けるかキューで待機するかを決定します。 |
例:パラレル度パラメータ値を確認する
obclient> SHOW VARIABLES LIKE '%paral%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| parallel_servers_target | 4 |
+-------------------------+-------+
1 rows in set
例の説明:
- 例の
parallel_servers_target=4は、クラスタが最大4つのパラレルワーカーを同時に実行できることを意味します。 - クエリリクエストの
DOP=3で、現在使用中のワーカーが2つの場合は直接実行できます。使用中のワーカーが3つの場合はキューイングします。
EXCHANGE(Shuffle)パラメータ
EXCHANGE(Shuffle)パラメータは主に、**データ転送層(DTL)**がDFO(Data Flow Operator、データフロー演算子)間でデータを分散(Shuffle)する際のメモリ設定を制御するために使用されます。例えば、転送時のメモリ設定(バッファなど)のサイズを調整します。OceanBaseはDTLモジュールを通じてノード間のデータ転送機能を実現しています。
主要パラメータ:dtl_buffer_size
このパラメータは、EXCHANGE演算子(TransmitやReceiveなど)間のデータ転送バッファサイズを制御します。データがこのしきい値に達した場合、転送がトリガーされ、各行ごとの送信によるオーバーヘッドを削減します。
| パラメータ名 | 説明 | 値の範囲 | デフォルト値 | 設定の推奨事項 |
|---|---|---|---|---|
dtl_buffer_size |
EXCHANGE演算子間(つまりTransmitとReceiveの間)でデータを送信する際、各送信で使用するバッファのサイズを制御します。データがこの値の上限に達した場合にのみ送信が行われるため、各行の転送コストを削減します。 | [4K, 2M] | 64K | PXシナリオでは、EXCHANGE間のデータ送信はこのパラメータのサイズに依存します。通常は変更不要で、デフォルト値は最適化されています。送信回数を減らすなどの目的であれば変更を試すことも可能ですが、推奨されません。 |
例:Shuffleパラメータ値の確認
obclient> SHOW PARAMETERS LIKE '%dtl%'\G
*************************** 1. row ***************************
zone: zone1
svr_type: observer
svr_ip: 172.xx.xxx.xxx
svr_port: 2882
name: dtl_buffer_size
data_type: CAPACITY
value: 64K
info: to be removed
section: OBSERVER
scope: CLUSTER
source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
1 row in set
例の説明:
dtl_buffer_size=64Kは、各バッファに最大64KBのデータを一時保存した後に転送をトリガーすることを意味します。- このパラメータを調整する際には、以下の点を考慮する必要があります:値を大きくすると転送回数は減少しますが、より多くのメモリを消費します。値を小さくすると転送頻度は増加しますが、メモリ圧力は低下します。
関連する概念
DFO(Data Flow Operator):
- データフロー演算子は、PX演算子間のインタラクションを調整する役割を担います。
EXCHANGE演算子は、DFO間でデータを分散(Shuffle)します。
DTL(Data Transfer Layer):
- データ転送層は、ノード間のデータ転送を担当します。
dtl_buffer_sizeは、DTLの転送効率とメモリ使用に影響を与えます。