Skip to content

Commit 402d93f

Browse files
bb7133lilin90
authored andcommitted
dev,v3.0/benchmark: add 'add-index-with-load.md' (pingcap#1781)
1 parent a500007 commit 402d93f

18 files changed

+690
-0
lines changed

dev/TOC.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
- [如何对 TiDB 进行 TPC-C 测试](benchmark/how-to-run-tpcc.md)
1313
- [Sysbench 性能对比 - v3.0 对比 v2.1](benchmark/sysbench-v4.md)
1414
- [TPC-C 性能对比 - v3.0 对比 v2.1](benchmark/tpcc.md)
15+
- [线上负载与 Add Index 相互影响测试](benchmark/add-index-with-load.md)
1516
+ 主要概念
1617
- [整体架构](architecture.md)
1718
+ 核心特性

dev/benchmark/add-index-with-load.md

Lines changed: 344 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,344 @@
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+
![add-index-load-1-b32](/media/add-index-load-1-b32.png)
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+
![add-index-load-1-b64](/media/add-index-load-1-b64.png)
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+
![add-index-load-1-b128](/media/add-index-load-1-b128.png)
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+
![add-index-load-1-b256](/media/add-index-load-1-b256.png)
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+
![add-index-load-1-b512](/media/add-index-load-1-b512.png)
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+
![add-index-load-1-b1024](/media/add-index-load-1-b1024.png)
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+
![add-index-load-1-b2048](/media/add-index-load-1-b2048.png)
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+
![add-index-load-1-b4096](/media/add-index-load-1-b4096.png)
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+
![add-index-load-2-b32](/media/add-index-load-2-b32.png)
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+
![add-index-load-2-b1024](/media/add-index-load-2-b1024.png)
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+
![add-index-load-2-b4096](/media/add-index-load-2-b4096.png)
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+
![add-index-load-3-b32](/media/add-index-load-3-b32.png)
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+
![add-index-load-3-b1024](/media/add-index-load-3-b1024.png)
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+
![add-index-load-3-b4096](/media/add-index-load-3-b4096.png)
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` 的目标列仅涉及查询负载时,或者与线上负载不直接相关时,可以直接使用默认值。

media/add-index-load-1-b1024.png

57.3 KB
Loading

media/add-index-load-1-b128.png

56.5 KB
Loading

media/add-index-load-1-b2048.png

64.2 KB
Loading

media/add-index-load-1-b256.png

57.8 KB
Loading

media/add-index-load-1-b32.png

55.6 KB
Loading

media/add-index-load-1-b4096.png

66.1 KB
Loading

media/add-index-load-1-b512.png

55.4 KB
Loading

media/add-index-load-1-b64.png

54 KB
Loading

0 commit comments

Comments
 (0)