线上负载与 ADD INDEX 相互影响测试

    测试版本、时间、地点

    TiDB 版本:v3.0.1

    时间:2019 年 7 月

    地点:北京

    测试在 Kubernetes 集群上进行,部署了 3 个 TiDB 实例,3 个 TiKV 实例和 3 个 PD 实例。

    Sysbench 版本:1.0.17

    TiDB 参数配置

    TiDB、TiKV 和 PD 均使用 默认配置。

    集群拓扑

    机器 IP 部署实例
    172.31.8.8 Sysbench
    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 向集群导入 1 张表,200 万行数据

    执行如下命令导入数据:

    1. sysbench $testname \
    2. --threads=$threads \
    3. --time=300000 \
    4. --report-interval=15 \
    5. --rand-type=uniform \
    6. --rand-seed=$RANDOM \
    7. --mysql-db=sbtest \
    8. --mysql-host=$tidb_host \
    9. --mysql-user=root \
    10. run --tables=1 --table-size=2000000

    测试方案 1:ADD INDEX 目标列被频繁 Update

    1. 开始 oltp_read_write 测试。
    2. 与步骤 1 同时,使用 alter table sbtest1 add index c_idx(c) 添加索引。
    3. 在步骤 2 结束,即索引添加完成时,停止步骤 1 的测试。
    4. 获取 alter table ... add index 的运行时间、sysbench 在该时间段内的平均 TPS 和 QPS 作为指标。
    5. 逐渐增大 tidb_ddl_reorg_worker_cnttidb_ddl_reorg_batch_size 两个参数的值,重复步骤 1-4。

    测试结果

    ADD INDEXoltp_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

    add-index-load-1-b64

    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

    add-index-load-1-b256

    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

    add-index-load-1-b1024

    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-load-1-b4096

    测试结论

    • 随着两个参数的逐渐增大,TiKV_prewrite_latch_wait_duration 有明显的升高,造成写入变慢。
    • tidb_ddl_reorg_worker_cnttidb_ddl_reorg_batch_size 非常大时,admin show ddl 命令可以看到 DDL job 的多次重试(例如 Write conflict, txnStartTS 410327455965380624 is stale [try again later], ErrCount:38, SnapshotVersion:410327228136030220),此时 ADD INDEX 会持续非常久才能完成。
    1. 开始 测试。
    2. 与步骤 1 同时,使用 alter table sbtest1 add index c_idx(c) 添加索引。
    3. 在步骤 2 结束,即索引添加完成时,停止步骤 1。
    4. 获取 alter table ... add index 的运行时间、sysbench 在该时间段内的平均 TPS 和 QPS 作为指标。
    5. 逐渐增大 tidb_ddl_reorg_worker_cnttidb_ddl_reorg_batch_size 两个参数,重复步骤 1-4。

    ADD INDEXoltp_read_only 结果

    sysbench TPS sysbench QPS
    550.9 8812.8

    tidb_ddl_reorg_batch_size = 32

    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

    add-index-load-2-b1024

    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 目标列

    1. 开始 oltp_read_write 测试。
    2. 与步骤 1 同时,使用 alter table test add index pad_idx(pad) 添加索引。
    3. 在步骤 2 结束,即索引添加完成时,停止步骤 1 的测试。
    4. 获取 alter table ... add index 的运行时间、sysbench 在该时间段内的平均 TPS 和 QPS 作为指标。
    5. 逐渐增大 tidb_ddl_reorg_worker_cnttidb_ddl_reorg_batch_size 两个参数,重复步骤 1-4。

    测试结果

    ADD INDEXoltp_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

    add-index-load-3-b32

    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

    add-index-load-3-b4096

    ADD INDEX 的目标列与负载无关时,ADD INDEX 对负载的影响不明显。

    • ADD INDEX 的目标列被频繁更新(包含 UPDATEINSERTDELETE)时,默认配置会造成较为频繁的写冲突,使得在线负载较大;同时 ADD INDEX 也可能由于不断地重试,需要很长的时间才能完成。在本次测试中,将 tidb_ddl_reorg_worker_cnttidb_ddl_reorg_batch_size 的乘积调整为默认值的 1/32(例如 tidb_ddl_reorg_worker_cnt = 4,tidb_ddl_reorg_batch_size = 256)可以取得较好的效果。
    • ADD INDEX 的目标列仅涉及查询负载,或者与线上负载不直接相关时,可以直接使用默认配置。