RTX Parallel Scan (ja) #137
akirakw
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
RTX並列スキャンについて
Tsurugi 1.4.0 より、 RTX並列スキャン機能が試験的機能から正式機能に昇格し、 RTX (Read Only Transaction) の処理時により高度な並列化が行われるようになりました。
これにより、OLAP などのワークロードや、
tgdump
を利用したテーブルダンプ処理等で、大幅な性能の改善が見込まれます。[FROM Tsurugi 1.5.0] Tsurugi 1.5.0 からは、従来サーバ側の設定
scan_default_parallel
で指定していたスキャン操作のタスク分割数を、クライアント側からトランザクション単位で指定できるようになりました。RTX並列スキャンの特徴
これまでの Tsurugi は、主に多数の処理(トランザクション)を素早く行うことに注力していましたが、RTX並列スキャンでは少数の巨大なトランザクション処理を取り扱う際に、より効率的に CPU やメモリを利用して高速に処理を行えるように設計されています。
RTX並列スキャンの特徴は大きく以下の2点です:
これらの特徴により、以下のような処理に対して性能上の改善が見込めます:
JOIN
) 等を行う際に、それぞれの処理を同時並行で行えるようになるテーブルに対するスキャン範囲の分割方法
RTX並列スキャンによるスキャン範囲の分割は、以下のように行われます:
上記のような手順のため、スキャン対象のキー (プライマリキーやインデックスキー) の分布に偏りがあると、分割した各タスクが処理する行数にも偏りが生まれてしまう場合があります。
以下は偏りが生まれにくい例です:
=
) が行われていない先頭のカラムについて、最大値と最小値の間で等間隔に分布している逆に、最大値や最小値が大きく外れた値である場合、特定のタスクに処理が偏ってしまう場合があります (特に、
NULL
は最小値として大きく外れているため、その傾向が大きく現れます)。なお、サンプリング等の手法を用いてスキャン分割を均衡させる仕組みについても開発を検討しています。
RTX の利用方法
RTX並列スキャンを利用するには、トランザクションを開始する際に、明示的にそのトランザクションが RTX (read only transaction) であることを指定する必要があります。
以下は、それぞれの操作方法における RTX の利用方法を紹介します。
SQL コンソール (
tsql
)tgsql
コマンドでは、トランザクション開始時にREAD ONLY
を指定することで RTX を利用できます。または、
tgsql
コマンドラインオプションで-t RTX
(--transaction RTX
) を指定することで、明示的にトランザクションを開始しなかった (オートコミット) 際に自動的に RTX を利用します。[FROM Tsurugi 1.5.0] スキャン操作のタスク分割数の指定 (
tgsql
)Tsurugi 1.5.0 からは、トランザクション開始時に
BEGIN
(BEGIN TRANSACTION
) に対してオプションWITH PARALLEL
を指定することで該当トランザクション上でのスキャン操作のタスク分割数を指定できます。または、
tgsql
コマンドラインオプションで-t RTX
と併せて--with PARALLEL=<n>
を指定することで、オートコミットモード時の該当トランザクション上でのスキャン操作のタスク分割数を指定できます。Note
トランザクション単位のタスク分割の挙動については、「関連する設定」も参照してください。
Iceaxe
高水準の API で Tsurugi を操作する Iceaxe ライブラリでは、以下のように RTX を利用できます。
[FROM Tsurugi 1.5.0] スキャン操作のタスク分割数の指定 (Iceaxe)
Tsurugi 1.5.0 からは、トランザクションオプションクラス
TgTxOptionRtx
に対してscanParallel(n)
メソッドで並列数を指定することで該当トランザクション上でのスキャン操作のタスク分割数を指定できます。Note
トランザクション単位のタスク分割の挙動については、「関連する設定」も参照してください。
Tsubakuro
低水準の API で Tsurugi を利用する Tsubakuro ライブラリでは、以下のように RTX を利用できます。
[FROM Tsurugi 1.5.0] スキャン操作のタスク分割数の指定 (Tsubakuro)
Tsurugi 1.5.0 からは、トランザクションオプションクラス
TransactionOption
に対してsetScanParallel(n)
メソッドで並列数を指定することで該当トランザクション上でのスキャン操作のタスク分割数を指定できます。Note
トランザクション単位のタスク分割の挙動については、「関連する設定」も参照してください。
RTXの注意点
RTXの利用にあたってはいくつかの注意点があります。
INSERT
,UPDATE
,DELETE
などの書き込み操作を行えない前者は RTX (read only transaction) という名前からもわかる通り、RTX では書き込み操作を行うことはできません。
大量のデータを分析し、その結果を書き戻すようなケースでは、RTX と OCC を組み合わせるか、全体を OCC, LTX で行う必要があります。
また、
CREATE TABLE
等の DDL 操作も同様に RTX では行えません。後者は特に注意が必要で、RTX はその時点での最新のデータを読み出せることを 保証しません。
これはつまり、OCC でデータを書き込み、コミットが完了した直後に RTX を開始しても、そのデータを読めるとは限らない、という点に注意が必要です。
必ず最新でなければならないようなケースでは RTX を利用せず、 OCC や LTX を利用してください。
なお、「RTX で最新のデータが読み出せるようになるまで待ち合わせる」という機能の開発を検討しています。
Note
RTX はデータの整合性 (serializable) を保ち、かつアボートしないという特徴がありますが、これらの実現のために読み出すデータの新しさが犠牲になっています。
特に LTX が稼働中である場合、関連する LTX の開始前の時点のデータしか読みだせなくなります。
LTX が稼働していない場合には、標準的には反映の遅れは数10ミリ秒程度に収まります。
関連する設定
RTX並列スキャンに関連する構成定義ファイル (
tsurugi.ini
) の設定項目は主に以下の通りです:sql
scan_default_parallel
4
0
を指定すると RTX 並列化機能を停止sql
max_result_set_writers
64
sql
thread_pool_size
scan_default_parallel
はマシンのCPU数が多い場合などではより大きな値を設定することで性能向上が期待できます。環境に応じて適切な値に変更してください。ただし現状の制約として、
scan_default_parallel
の値を大きくしすぎるといくつかのワークロードで並列化が無効化される場合があります。特に、UNION ALL
を多用するワークロードでこの問題が発生しやすい傾向にあります。この制約は将来緩和される予定です。現状では、
scan_default_parallel
の値は、max_result_set_writers
の 1/4 ~ 1/2 程度の値を上限に設定することをお勧めします。この推奨値を勘案して、
scan_default_parallel
とmax_result_set_writers
の値を調整してください。また、
thread_pool_size
はTsurugiサーバ全体のタスクの最大同時実行数を制御します。scan_default_parallel
に大きな値 (32以上) を設定する場合や、同時に複数のRTX並列スキャンを伴うトランザクションを扱う場合などでは、 環境に応じてthread_pool_size
の値を調整すべきです。設定項目についてはドキュメント configuration file parameters も参照してください。
[FROM Tsurugi 1.5.0] クライアントからトランザクションに対してスキャン操作のタスク分割数を指定した場合には、
scan_default_parallel
の値は無視され、クライアント側で指定した値が優先されます。クライアント側から指定したタスク分割数によるサーバ側の動作やその注意点については、上述のscan_default_parallel
の内容と同様です。ベンチマーク例: テーブル全体に対するSELECT COUNT(*)
scan_default_parallel
の値を設定する上での参考値として、Tsurugi 1.4.0 時点でのRTX並列スキャンによるベンチマーク例を示します。以下は120コアを持つメニーコアマシン上で2億件のテーブルに対するSELECT COUNT(*) を実行した際のベンチマーク結果です。
並列数は
scan_default_parallel
の設定値です。Beta Was this translation helpful? Give feedback.
All reactions