オンラインワークロードとADD INDEX操作のインタラクションテスト
テスト目的
このドキュメントでは、OLTP シナリオにおけるオンライン ワークロードとADD INDEX操作間の相互作用効果をテストします。
テストバージョン、時間、場所
TiDB バージョン: v3.0.1
時期: 2019年7月
場所: 北京
テスト環境
このテストは、3 つの TiDB インスタンス、3 つの TiKV インスタンス、3 つの PD インスタンスがデプロイされた Kubernetes クラスターで実行されます。
バージョン情報
| 成分 | ギットハッシュ |
|---|---|
| TiDB | 9e4e8da3c58c65123db5f26409759fe1847529f8 |
| TiKV | 4151dc8878985df191b47851d67ca21365396133 |
| PD | 811ce0b9a1335d1b2a049fd97ef9e186f1c9efc1 |
Sysbench バージョン: 1.0.17
TiDBパラメータ設定
TiDB、TiKV、PD はすべてデフォルトのTiDB Operator構成を使用します。
クラスタトポロジー
| マシンIP | デプロイメントインスタンス |
|---|---|
| 172.31.8.8 | システムベンチ |
| 172.31.7.69, 172.31.5.152, 172.31.11.133 | PD |
| 172.31.4.172, 172.31.1.155, 172.31.9.210 | TiKV |
| 172.31.7.80, 172.31.5.163, 172.31.11.123 | TiDB |
Sysbenchを使用したオンラインワークロードシミュレーション
Sysbench を使用して、 2,000,000 行のデータを含むテーブルをKubernetes クラスターにインポートします。
データをインポートするには、次のコマンドを実行します。
sysbench oltp_common \
--threads=16 \
--rand-type=uniform \
--db-driver=mysql \
--mysql-db=sbtest \
--mysql-host=$tidb_host \
--mysql-port=$tidb_port \
--mysql-user=root \
prepare --tables=1 --table-size=2000000
テストを実行するには、次のコマンドを実行します。
sysbench $testname \
--threads=$threads \
--time=300000 \
--report-interval=15 \
--rand-type=uniform \
--rand-seed=$RANDOM \
--db-driver=mysql \
--mysql-db=sbtest \
--mysql-host=$tidb_host \
--mysql-port=$tidb_port \
--mysql-user=root \
run --tables=1 --table-size=2000000
テストプラン1: ADD INDEX文の対象列への書き込み操作を頻繁に実行する
oltp_read_writeテストを開始します。- 手順
alter table sbtest1 add index c_idx(c)と同時に実行します。1 を使用してインデックスを追加します。 - 手順 2 の最後に実行します。インデックスが正常に追加されたら、テスト
oltp_read_writeを停止します。 alter table ... add indexの期間と、この期間の Sysbench の平均 TPS と QPS を取得します。- 2 つのパラメータ
tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値を徐々に増やし、手順 1 ~ 4 を繰り返します。
テスト結果
ADD INDEX操作なしのoltp_read_writeのテスト結果
| sysbench TPS | sysbench QPS |
|---|---|
| 350.31 | 6806 |
tidb_ddl_reorg_batch_size = 32
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 402 | 338.4 | 6776 |
| 2 | 266 | 330.3 | 6001 |
| 4 | 174 | 288.5 | 5769 |
| 8 | 129 | 280.6 | 5612 |
| 16 | 90 | 263.5 | 5273 |
| 32 | 54 | 229.2 | 4583 |
| 48 | 57 | 230.1 | 4601 |

tidb_ddl_reorg_batch_size = 64
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 264 | 269.4 | 5388 |
| 2 | 163 | 266.2 | 5324 |
| 4 | 105 | 272.5 | 5430 |
| 8 | 78 | 262.5 | 5228 |
| 16 | 57 | 215.5 | 4308 |
| 32 | 42 | 185.2 | 3715 |
| 48 | 45 | 189.2 | 3794 |

tidb_ddl_reorg_batch_size = 128
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 171 | 289.1 | 5779 |
| 2 | 110 | 274.2 | 5485 |
| 4 | 79 | 250.6 | 5011 |
| 8 | 51 | 246.1 | 4922 |
| 16 | 39 | 171.1 | 3431 |
| 32 | 35 | 130.8 | 2629 |
| 48 | 35 | 120.5 | 2425 |

tidb_ddl_reorg_batch_size = 256
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 145 | 283.0 | 5659 |
| 2 | 96 | 282.2 | 5593 |
| 4 | 56 | 236.5 | 4735 |
| 8 | 45 | 194.2 | 3882 |
| 16 | 39 | 149.3 | 2893 |
| 32 | 36 | 113.5 | 2268 |
| 48 | 33 | 86.2 | 1715 |

tidb_ddl_reorg_batch_size = 512
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 135 | 257.8 | 5147 |
| 2 | 78 | 252.8 | 5053 |
| 4 | 49 | 222.7 | 4478 |
| 8 | 36 | 145.4 | 2904 |
| 16 | 33 | 109 | 2190 |
| 32 | 33 | 72.5 | 1503 |
| 48 | 33 | 54.2 | 1318 |

tidb_ddl_reorg_batch_size = 1024
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 111 | 244.3 | 4885 |
| 2 | 78 | 228.4 | 4573 |
| 4 | 54 | 168.8 | 3320 |
| 8 | 39 | 123.8 | 2475 |
| 16 | 36 | 59.6 | 1213 |
| 32 | 42 | 93.2 | 1835 |
| 48 | 51 | 115.7 | 2261 |

tidb_ddl_reorg_batch_size = 2048
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 918 | 243.3 | 4855 |
| 2 | 1160 | 209.9 | 4194 |
| 4 | 342 | 185.4 | 3707 |
| 8 | 1316 | 151.0 | 3027 |
| 16 | 795 | 30.5 | 679 |
| 32 | 1130 | 26.69 | 547 |
| 48 | 893 | 27.5 | 552 |

tidb_ddl_reorg_batch_size = 4096
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 3042 | 200.0 | 4001 |
| 2 | 3022 | 203.8 | 4076 |
| 4 | 858 | 195.5 | 3971 |
| 8 | 3015 | 177.1 | 3522 |
| 16 | 837 | 143.8 | 2875 |
| 32 | 942 | 114 | 2267 |
| 48 | 187 | 54.2 | 1416 |

テストの結論
ADD INDEXの文のターゲット列に対して頻繁に書き込み操作(このテストではUPDATE INSERT DELETE操作が含まれます)を実行すると、デフォルトのADD INDEX構成はシステムのオンラインワークロードに大きな影響を与えます。これは主に、同時実行されるADD INDEX操作と列更新によって発生する書き込み競合が原因です。システムのパフォーマンスは次のようになります。
- パラメータ
tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値が増加すると、TiKV_prewrite_latch_wait_durationの値が大幅に増加し、書き込み速度が低下します。 tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値が非常に大きい場合、admin show ddlコマンドを実行すると、DDL ジョブの再試行回数(例えばWrite conflict, txnStartTS 410327455965380624 is stale [try again later], ErrCount:38, SnapshotVersion: 410327228136030220を確認できます。この場合、ADD INDEX操作の完了に非常に長い時間がかかります。
テストプラン 2: ADD INDEXステートメントのターゲット列への書き込み操作を実行しない (クエリのみ)
oltp_read_onlyテストを開始します。- 手順
alter table sbtest1 add index c_idx(c)と同時に実行します。1 を使用してインデックスを追加します。 - 手順 2 の最後に実行します。インデックスが正常に追加されたら、テスト
oltp_read_onlyを停止します。 alter table ... add indexの期間と、この期間の Sysbench の平均 TPS と QPS を取得します。- 2 つのパラメータ
tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値を徐々に増やし、手順 1 ~ 4 を繰り返します。
テスト結果
ADD INDEX操作なしのoltp_read_onlyのテスト結果
| sysbench TPS | sysbench QPS |
|---|---|
| 550.9 | 8812.8 |
tidb_ddl_reorg_batch_size = 32
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 376 | 548.9 | 8780 |
| 2 | 212 | 541.5 | 8523 |
| 4 | 135 | 538.6 | 8549 |
| 8 | 114 | 536.7 | 8393 |
| 16 | 77 | 533.9 | 8292 |
| 32 | 46 | 533.4 | 8103 |
| 48 | 46 | 532.2 | 8074 |

tidb_ddl_reorg_batch_size = 1024
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 91 | 536.8 | 8316 |
| 2 | 52 | 533.9 | 8165 |
| 4 | 40 | 522.4 | 7947 |
| 8 | 36 | 510 | 7860 |
| 16 | 33 | 485.5 | 7704 |
| 32 | 31 | 467.5 | 7516 |
| 48 | 30 | 562.1 | 7442 |

tidb_ddl_reorg_batch_size = 4096
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 103 | 502.2 | 7823 |
| 2 | 63 | 486.5 | 7672 |
| 4 | 52 | 467.4 | 7516 |
| 8 | 39 | 452.5 | 7302 |
| 16 | 35 | 447.2 | 7206 |
| 32 | 30 | 441.9 | 7057 |
| 48 | 30 | 440.1 | 7004 |

テストの結論
ADD INDEXのステートメントのターゲット列に対してのみクエリ操作を実行する場合、 ADD INDEX操作がオンライン ワークロードに与える影響は明らかではありません。
テストプラン3: ADD INDEX文のターゲット列はオンラインワークロードとは無関係です
oltp_read_writeテストを開始します。- 手順
alter table test add index pad_idx(pad)と同時に実行します。1 を使用してインデックスを追加します。 - 手順 2 の最後に実行します。インデックスが正常に追加されたら、テスト
oltp_read_onlyを停止します。 alter table ... add indexの期間と、この期間の Sysbench の平均 TPS と QPS を取得します。- 2 つのパラメータ
tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_size値を徐々に増やし、手順 1 ~ 4 を繰り返します。
テスト結果
ADD INDEX操作なしのoltp_read_writeのテスト結果
| sysbench TPS | sysbench QPS |
|---|---|
| 350.31 | 6806 |
tidb_ddl_reorg_batch_size = 32
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 372 | 350.4 | 6892 |
| 2 | 207 | 344.2 | 6700 |
| 4 | 140 | 343.1 | 6672 |
| 8 | 121 | 339.1 | 6579 |
| 16 | 76 | 340 | 6607 |
| 32 | 42 | 343.1 | 6695 |
| 48 | 42 | 333.4 | 6454 |

tidb_ddl_reorg_batch_size = 1024
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 94 | 352.4 | 6794 |
| 2 | 50 | 332 | 6493 |
| 4 | 45 | 330 | 6456 |
| 8 | 36 | 325.5 | 6324 |
| 16 | 32 | 312.5 | 6294 |
| 32 | 32 | 300.6 | 6017 |
| 48 | 31 | 279.5 | 5612 |

tidb_ddl_reorg_batch_size = 4096
| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS |
|---|---|---|---|
| 1 | 116 | 325.5 | 6324 |
| 2 | 65 | 312.5 | 6290 |
| 4 | 50 | 300.6 | 6017 |
| 8 | 37 | 279.5 | 5612 |
| 16 | 34 | 250.4 | 5365 |
| 32 | 32 | 220.2 | 4924 |
| 48 | 33 | 214.8 | 4544 |

テストの結論
ADD INDEXのステートメントのターゲット列がオンライン ワークロードに関係ない場合、 ADD INDEXの操作がワークロードに与える影響は明らかではありません。
まとめ
ADD INDEXステートメントの対象列に対して、書き込み操作(INSERTDELETE操作を含む)を頻繁に実行すると、デフォルトのADD INDEXUPDATEでは比較的頻繁に書き込み競合が発生し、オンラインワークロードに大きな影響を与えます。同時に、ADD INDEX操作は継続的な再試行により完了までに長い時間がかかります。このテストでは、tidb_ddl_reorg_worker_cntとtidb_ddl_reorg_batch_sizeの積をデフォルト値の1/32に変更できます。例えば、tidb_ddl_reorg_worker_cntを4に、tidb_ddl_reorg_batch_sizeを256に設定すると、パフォーマンスが向上します。ADD INDEXステートメントのターゲット列に対してのみクエリ操作を実行する場合、またはターゲット列がオンライン ワークロードに直接関連していない場合は、デフォルトのADD INDEX構成を使用できます。