|
| 1 | +--- |
| 2 | +title: 线上负载与 Add Index 相互影响测试 |
| 3 | +category: benchmark |
| 4 | +--- |
| 5 | + |
| 6 | +# 线上负载与 Add Index 相互影响测试 |
| 7 | + |
| 8 | +## 测试目的 |
| 9 | + |
| 10 | +对比 OLTP 场景下,`Add Index` 对与线上负载相互的影响 |
| 11 | + |
| 12 | +## 测试版本、时间、地点 |
| 13 | + |
| 14 | +TiDB 版本:v3.0.1 |
| 15 | + |
| 16 | +时间:2019 年 7 月 |
| 17 | + |
| 18 | +地点:北京 |
| 19 | + |
| 20 | +## 测试环境 |
| 21 | + |
| 22 | +Kubernetes 集群上 3 个 TiDB 实例,3 个 TiKV 实例,3 个 PD 实例。 |
| 23 | + |
| 24 | +### 版本信息 |
| 25 | + |
| 26 | +TiDB v3.0.1 |
| 27 | + |
| 28 | +| 组件 | GitHash | |
| 29 | +| :--- | :---------------------------------------- | |
| 30 | +| TiDB | `9e4e8da3c58c65123db5f26409759fe1847529f8` | |
| 31 | +| TiKV | `4151dc8878985df191b47851d67ca21365396133` | |
| 32 | +| PD | `811ce0b9a1335d1b2a049fd97ef9e186f1c9efc1` | |
| 33 | + |
| 34 | +Sysbench 版本:1.0.17 |
| 35 | + |
| 36 | +### TiDB 参数配置 |
| 37 | + |
| 38 | +TiKD/TiKV/PD 均使用 [TiDB Operator](https://github.com/pingcap/tidb-operator) 默认配置。 |
| 39 | + |
| 40 | +### 集群拓扑 |
| 41 | + |
| 42 | +| 机器 IP | 部署实例 | |
| 43 | +| :-------------------------------------- | :----------| |
| 44 | +| 172.31.8.8 | Sysbench | |
| 45 | +| 172.31.7.69, 172.31.5.152, 172.31.11.133 | PD | |
| 46 | +| 172.31.4.172, 172.31.1.155, 172.31.9.210 | TiKV | |
| 47 | +| 172.31.7.80, 172.31.5.163, 172.31.11.123 | TiDB | |
| 48 | + |
| 49 | +### 测试数据 |
| 50 | + |
| 51 | +使用 Sysbench 向集群导入 **1 张表,数据 200 万**。准备数据命令: |
| 52 | + |
| 53 | +```sh |
| 54 | +sysbench oltp_common \ |
| 55 | + --threads=16 \ |
| 56 | + --rand-type=uniform \ |
| 57 | + --db-driver=mysql \ |
| 58 | + --mysql-db=sbtest \ |
| 59 | + --mysql-host=$tidb_host \ |
| 60 | + --mysql-port=$tidb_port \ |
| 61 | + --mysql-user=root \ |
| 62 | + prepare --tables=1 --table-size=2000000 |
| 63 | +``` |
| 64 | + |
| 65 | +测试命令: |
| 66 | + |
| 67 | +```sh |
| 68 | +sysbench $testname \ |
| 69 | + --threads=$threads \ |
| 70 | + --time=300000 \ |
| 71 | + --report-interval=15 \ |
| 72 | + --rand-type=uniform \ |
| 73 | + --rand-seed=$RANDOM \ |
| 74 | + --db-driver=mysql \ |
| 75 | + --mysql-db=sbtest \ |
| 76 | + --mysql-host=$tidb_host \ |
| 77 | + --mysql-port=$tidb_port \ |
| 78 | + --mysql-user=root \ |
| 79 | + run --tables=1 --table-size=2000000 |
| 80 | +``` |
| 81 | + |
| 82 | +## 测试方案 1:Add Index 目标列被频繁 Update |
| 83 | + |
| 84 | +1. 开始 `oltp_read_write` 测试。 |
| 85 | +2. 与步骤 1 同时,使用 `alter table sbtest1 add index c_idx(c)` 添加索引。 |
| 86 | +3. 在步骤 2 结束,即索引添加完成时,停止步骤 1 的测试。 |
| 87 | +4. 获取指标 `alter table ... add index` 的运行时间;sysbench 在该时间段内的平均 TPS 和 QPS。 |
| 88 | +5. 逐渐增大 `tidb_ddl_reorg_worker_cnt` 和 `tidb_ddl_reorg_batch_size` 两个参数的值,重复步骤 1-4。 |
| 89 | + |
| 90 | +### 测试结果 |
| 91 | + |
| 92 | +#### 仅进行 sysbench 的结果 |
| 93 | + |
| 94 | +| sysbench TPS | sysbench QPS | |
| 95 | +| :------- | :-------- | |
| 96 | +| 350.31 | 6806 | |
| 97 | + |
| 98 | +#### `tidb_ddl_reorg_batch_size = 32` |
| 99 | + |
| 100 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 101 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 102 | +| 1 | 402 | 338.4 | 6776 | |
| 103 | +| 2 | 266 | 330.3 | 6001 | |
| 104 | +| 4 | 174 | 288.5 | 5769 | |
| 105 | +| 8 | 129 | 280.6 | 5612 | |
| 106 | +| 16 | 90 | 263.5 | 5273 | |
| 107 | +| 32 | 54 | 229.2 | 4583 | |
| 108 | +| 48 | 57 | 230.1 | 4601 | |
| 109 | + |
| 110 | + |
| 111 | + |
| 112 | +#### `tidb_ddl_reorg_batch_size = 64` |
| 113 | + |
| 114 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 115 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 116 | +| 1 | 264 | 269.4 | 5388 | |
| 117 | +| 2 | 163 | 266.2 | 5324 | |
| 118 | +| 4 | 105 | 272.5 | 5430 | |
| 119 | +| 8 | 78 | 262.5 | 5228 | |
| 120 | +| 16 | 57 | 215.5 | 4308 | |
| 121 | +| 32 | 42 | 185.2 | 3715 | |
| 122 | +| 48 | 45 | 189.2 | 3794 | |
| 123 | + |
| 124 | + |
| 125 | + |
| 126 | +#### `tidb_ddl_reorg_batch_size = 128` |
| 127 | + |
| 128 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 129 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 130 | +| 1 | 171 | 289.1 | 5779 | |
| 131 | +| 2 | 110 | 274.2 | 5485 | |
| 132 | +| 4 | 79 | 250.6 | 5011 | |
| 133 | +| 8 | 51 | 246.1 | 4922 | |
| 134 | +| 16 | 39 | 171.1 | 3431 | |
| 135 | +| 32 | 35 | 130.8 | 2629 | |
| 136 | +| 48 | 35 | 120.5 | 2425 | |
| 137 | + |
| 138 | + |
| 139 | + |
| 140 | +#### `tidb_ddl_reorg_batch_size = 256` |
| 141 | + |
| 142 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 143 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 144 | +| 1 | 145 | 283.0 | 5659 | |
| 145 | +| 2 | 96 | 282.2 | 5593 | |
| 146 | +| 4 | 56 | 236.5 | 4735 | |
| 147 | +| 8 | 45 | 194.2 | 3882 | |
| 148 | +| 16 | 39 | 149.3 | 2893 | |
| 149 | +| 32 | 36 | 113.5 | 2268 | |
| 150 | +| 48 | 33 | 86.2 | 1715 | |
| 151 | + |
| 152 | + |
| 153 | + |
| 154 | +#### `tidb_ddl_reorg_batch_size = 512` |
| 155 | + |
| 156 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 157 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 158 | +| 1 | 135 | 257.8 | 5147 | |
| 159 | +| 2 | 78 | 252.8 | 5053 | |
| 160 | +| 4 | 49 | 222.7 | 4478 | |
| 161 | +| 8 | 36 | 145.4 | 2904 | |
| 162 | +| 16 | 33 | 109 | 2190 | |
| 163 | +| 32 | 33 | 72.5 | 1503 | |
| 164 | +| 48 | 33 | 54.2 | 1318 | |
| 165 | + |
| 166 | + |
| 167 | + |
| 168 | +#### `tidb_ddl_reorg_batch_size = 1024` |
| 169 | + |
| 170 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 171 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 172 | +| 1 | 111 | 244.3 | 4885 | |
| 173 | +| 2 | 78 | 228.4 | 4573 | |
| 174 | +| 4 | 54 | 168.8 | 3320 | |
| 175 | +| 8 | 39 | 123.8 | 2475 | |
| 176 | +| 16 | 36 | 59.6 | 1213 | |
| 177 | +| 32 | 42 | 93.2 | 1835 | |
| 178 | +| 48 | 51 | 115.7 | 2261 | |
| 179 | + |
| 180 | + |
| 181 | + |
| 182 | +#### `tidb_ddl_reorg_batch_size = 2048` |
| 183 | + |
| 184 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 185 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 186 | +| 1 | 918 | 243.3 | 4855 | |
| 187 | +| 2 | 1160 | 209.9 | 4194 | |
| 188 | +| 4 | 342 | 185.4 | 3707 | |
| 189 | +| 8 | 1316 | 151.0 | 3027 | |
| 190 | +| 16 | 795 | 30.5 | 679 | |
| 191 | +| 32 | 1130 | 26.69 | 547 | |
| 192 | +| 48 | 893 | 27.5 | 552 | |
| 193 | + |
| 194 | + |
| 195 | + |
| 196 | +#### `tidb_ddl_reorg_batch_size = 4096` |
| 197 | + |
| 198 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 199 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 200 | +| 1 | 3042 | 200.0 | 4001 | |
| 201 | +| 2 | 3022 | 203.8 | 4076 | |
| 202 | +| 4 | 858 | 195.5 | 3971 | |
| 203 | +| 8 | 3015 | 177.1 | 3522 | |
| 204 | +| 16 | 837 | 143.8 | 2875 | |
| 205 | +| 32 | 942 | 114 | 2267 | |
| 206 | +| 48 | 187 | 54.2 | 1416 | |
| 207 | + |
| 208 | + |
| 209 | + |
| 210 | +### 测试结论 |
| 211 | + |
| 212 | +若 `Add Index` 的目标列正在进行较为频繁的写操作(本测试中涉及列的 update/insert/delete),默认 `Add Index` 配置对系统的线上负载有比较明显的影响,该影响主要来源于 `Add Index` 与 Column Update 并发进行造成的写冲突,系统的表现反应在: |
| 213 | + |
| 214 | +- 随着两个参数的逐渐增大,TiKV prewrite latch wait duration 有明显的升高,造成写入变慢。 |
| 215 | +- `tidb_ddl_reorg_worker_cnt` 与 `tidb_ddl_reorg_batch_size` 非常大时,`admin show ddl` 命令可以看到 ddl job 的多次重试(例如 `Write conflict, txnStartTS 410327455965380624 is stale [try again later], ErrCount:38, SnapshotVersion:410327228136030220`),此时 `Add Index` 会持续非常久才能完成。 |
| 216 | + |
| 217 | +## 测试方案 2:Add Index 目标列不涉及写入(仅查询) |
| 218 | + |
| 219 | +1. 开始 `oltp_read_only` 测试。 |
| 220 | +2. 与步骤 1 同时,使用 `alter table sbtest1 add index c_idx(c)` 添加索引。 |
| 221 | +3. 在步骤 2 结束,即索引添加完成时,停止步骤 1。 |
| 222 | +4. 获取指标 `alter table ... add index` 的运行时间;sysbench 在该时间段内的平均 TPS 和 QPS。 |
| 223 | +5. 逐渐增大 `tidb_ddl_reorg_worker_cnt` 和 `tidb_ddl_reorg_batch_size` 两个参数,重复步骤 1-4。 |
| 224 | + |
| 225 | +### 测试结果 |
| 226 | + |
| 227 | +#### 无 add_index 时 oltp_read_only 结果 |
| 228 | + |
| 229 | +| sysbench TPS | sysbench QPS | |
| 230 | +| :------- | :-------- | |
| 231 | +| 550.9 | 8812.8 | |
| 232 | + |
| 233 | +#### `tidb_ddl_reorg_batch_size = 32` |
| 234 | + |
| 235 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 236 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 237 | +| 1 | 376 | 548.9 | 8780 | |
| 238 | +| 2 | 212 | 541.5 | 8523 | |
| 239 | +| 4 | 135 | 538.6 | 8549 | |
| 240 | +| 8 | 114 | 536.7 | 8393 | |
| 241 | +| 16 | 77 | 533.9 | 8292 | |
| 242 | +| 32 | 46 | 533.4 | 8103 | |
| 243 | +| 48 | 46 | 532.2 | 8074 | |
| 244 | + |
| 245 | + |
| 246 | + |
| 247 | +#### `tidb_ddl_reorg_batch_size = 1024` |
| 248 | + |
| 249 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 250 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 251 | +| 1 | 91 | 536.8 | 8316 | |
| 252 | +| 2 | 52 | 533.9 | 8165 | |
| 253 | +| 4 | 40 | 522.4 | 7947 | |
| 254 | +| 8 | 36 | 510 | 7860 | |
| 255 | +| 16 | 33 | 485.5 | 7704 | |
| 256 | +| 32 | 31 | 467.5 | 7516 | |
| 257 | +| 48 | 30 | 562.1 | 7442 | |
| 258 | + |
| 259 | + |
| 260 | + |
| 261 | +#### `tidb_ddl_reorg_batch_size = 4096` |
| 262 | + |
| 263 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 264 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 265 | +| 1 | 103 | 502.2 | 7823 | |
| 266 | +| 2 | 63 | 486.5 | 7672 | |
| 267 | +| 4 | 52 | 467.4 | 7516 | |
| 268 | +| 8 | 39 | 452.5 | 7302 | |
| 269 | +| 16 | 35 | 447.2 | 7206 | |
| 270 | +| 32 | 30 | 441.9 | 7057 | |
| 271 | +| 48 | 30 | 440.1 | 7004 | |
| 272 | + |
| 273 | + |
| 274 | + |
| 275 | +### 测试结论 |
| 276 | + |
| 277 | +`Add Index` 的目标列仅有查询负载时,`Add Index` 对负载的影响不明显。 |
| 278 | + |
| 279 | +## 测试方案 3:集群负载不涉及 Add Index 目标列 |
| 280 | + |
| 281 | +1. 开始 `oltp_read_write` 测试。 |
| 282 | +2. 与步骤 1 同时,使用 `alter table test add index pad_idx(pad)` 添加索引。 |
| 283 | +3. 在步骤 2 结束,即索引添加完成时,停止步骤 1 的测试。 |
| 284 | +4. 获取指标 `alter table ... add index` 的运行时间,sysbench 在该时间段内的平均 TPS 和 QPS。 |
| 285 | +5. 逐渐增大 `tidb_ddl_reorg_worker_cnt` 和 `tidb_ddl_reorg_batch_size` 两个参数,重复步骤 1-4。 |
| 286 | + |
| 287 | +### 测试结果 |
| 288 | + |
| 289 | +#### 无 add index 时 sysbench 结果 |
| 290 | + |
| 291 | +| sysbench TPS | sysbench QPS | |
| 292 | +| :------- | :-------- | |
| 293 | +| 350.31 | 6806 | |
| 294 | + |
| 295 | +#### `tidb_ddl_reorg_batch_size = 32` |
| 296 | + |
| 297 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 298 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 299 | +| 1 | 372 | 350.4 | 6892 | |
| 300 | +| 2 | 207 | 344.2 | 6700 | |
| 301 | +| 4 | 140 | 343.1 | 6672 | |
| 302 | +| 8 | 121 | 339.1 | 6579 | |
| 303 | +| 16 | 76 | 340 | 6607 | |
| 304 | +| 32 | 42 | 343.1 | 6695 | |
| 305 | +| 48 | 42 | 333.4 | 6454 | |
| 306 | + |
| 307 | + |
| 308 | + |
| 309 | +#### `tidb_ddl_reorg_batch_size = 1024` |
| 310 | + |
| 311 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 312 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 313 | +| 1 | 94 | 352.4 | 6794 | |
| 314 | +| 2 | 50 | 332 | 6493 | |
| 315 | +| 4 | 45 | 330 | 6456 | |
| 316 | +| 8 | 36 | 325.5 | 6324 | |
| 317 | +| 16 | 32 | 312.5 | 6294 | |
| 318 | +| 32 | 32 | 300.6 | 6017 | |
| 319 | +| 48 | 31 | 279.5 | 5612 | |
| 320 | + |
| 321 | + |
| 322 | + |
| 323 | +#### `tidb_ddl_reorg_batch_size = 4096` |
| 324 | + |
| 325 | +| tidb_ddl_reorg_worker_cnt | add_index_durations(s) | sysbench TPS | sysbench QPS | |
| 326 | +| :------------------------ | :---------------------- | :------------- | :----------- | |
| 327 | +| 1 | 116 | 325.5 | 6324 | |
| 328 | +| 2 | 65 | 312.5 | 6290 | |
| 329 | +| 4 | 50 | 300.6 | 6017 | |
| 330 | +| 8 | 37 | 279.5 | 5612 | |
| 331 | +| 16 | 34 | 250.4 | 5365 | |
| 332 | +| 32 | 32 | 220.2 | 4924 | |
| 333 | +| 48 | 33 | 214.8 | 4544 | |
| 334 | + |
| 335 | + |
| 336 | + |
| 337 | +### 测试结论 |
| 338 | + |
| 339 | +`Add Index` 的目标列与负载无关时,`Add Index` 对负载的影响不明显。 |
| 340 | + |
| 341 | +## 总结 |
| 342 | + |
| 343 | +- 对于 `Add Index` 的目标列被频繁更新(包含 insert/delete/update)时,默认的配置下会造成较为频繁的写冲突,使得在线负载较大的影响;同时 `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)可以得到较好的效果。 |
| 344 | +- 对于 `Add Index` 的目标列仅涉及查询负载时,或者与线上负载不直接相关时,可以直接使用默认值。 |
0 commit comments