5
2
0
0
专栏/.../

TiDB热点测试

 magongyong  发表于  2022-03-09

一、测试说明

1、环境信息

硬件信息:3台物理机,1个tidb server(16c,64g),3个tikv(16c,64g,固态硬盘)

软件信息:centos7.5 + tidb v4.0.13

 

2、测试方法

sysbench:insert.lua(单条数据insert),50并发

 

3、测试案例

测试案例

测试场景

测试说明

主键自增热点测试 模拟mysql迁到tidb后的热点场景 sysbench插入主键为自增的表
主键随机热点测试 模拟官方建议的热点解决场景 sysbench插入主键为随机的表
主键随机,表切割热点测试 模拟官方建议的热点解决场景 sysbench插入主键为随机,并且表切割为10个region

 

二、测试准备

1、主键自增热点测试

初始化:sysbench --db-driver=mysql /usr/share/sysbench/tests/include/oltp_legacy/insert.lua --mysql-host=10.100.xxx.xxx --mysql-port=4000 --mysql-user=u_sysbench --mysql-db=sbtest_incr --mysql-password=****** --oltp-test-mode=complex --oltp-tables-count=8 --oltp-table-size=10000 --threads=50 --time=600 --report-interval=5 prepare

测试:sysbench --db-driver=mysql /usr/share/sysbench/tests/include/oltp_legacy/insert.lua --mysql-host=10.100.xxx.xxx --mysql-port=4000 --mysql-user=u_sysbench --mysql-db=sbtest_incr --mysql-password=****** --oltp-test-mode=complex --oltp-tables-count=8 --oltp-table-size=10000 --threads=50 --time=600 --report-interval=5 run

2、主键随机热点测试

初始化:复制主键自增库(sbtest_incr)的建表语句,auto_increment关键字改为auto_random,共8个表

执行测试:sysbench --db-driver=mysql /usr/share/sysbench/tests/include/oltp_legacy/bulk_insert.lua --mysql-host=10.100.xxx.xxx --mysql-port=4000 --mysql-user=u_sysbench --mysql-db=sbtest_rand --mysql-password=****** --oltp-test-mode=complex --oltp-tables-count=8 --oltp-table-size=10000 --threads=50 --time=600 --report-interval=5 run

 

3、主键随机,并根据主键范围切割表热点测试

初始化:复制主键自增库(sbtest_incr)的建表语句,auto_increment关键字改为auto_random,共8个表

表切割:split table sbtest1 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest2 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest3 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest4 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest5 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest6 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest7 between (1000000000000000000) and (9223372036854775807) regions 10; split table sbtest8 between (1000000000000000000) and (9223372036854775807) regions 10;

执行测试:sysbench --db-driver=mysql /usr/share/sysbench/tests/include/oltp_legacy/insert.lua --mysql-host=10.100.xxx.xxx --mysql-port=4000 --mysql-user=u_sysbench --mysql-db=sbtest_split --mysql-password=****** --oltp-test-mode=complex --oltp-tables-count=8 --oltp-table-size=10000 --threads=50 --time=600 --report-interval=5 run

4、主键随机和主键随机并切割表的库初始化表结构语句

sbtest_rand和sbtest_split_rand库初始化表结构:

CREATE TABLE sbtest1 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',pad char(60) NOT NULL DEFAULT '',PRIMARY KEY (id),KEY k_1 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest2 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',pad char(60) NOT NULL DEFAULT '',PRIMARY KEY (id),KEY k_2 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest3 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',pad char(60) NOT NULL DEFAULT '',PRIMARY KEY (id),KEY k_3 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest4 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',pad char(60) NOT NULL DEFAULT '',PRIMARY KEY (id),KEY k_4 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest5 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',pad char(60) NOT NULL DEFAULT '',PRIMARY KEY (id),KEY k_5 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest6 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',pad char(60) NOT NULL DEFAULT '',PRIMARY KEY (id),KEY k_6 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest7 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',pad char(60) NOT NULL DEFAULT '',PRIMARY KEY (id),KEY k_7 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

CREATE TABLE sbtest8 (id bigint NOT NULL auto_random,k int(10) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',pad char(60) NOT NULL DEFAULT '',PRIMARY KEY (id),KEY k_8 (k)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

5、指标查看

查看region的sql:SELECT b.TABLE_NAME,b.REGION_ID,IS_INDEX,INDEX_ID,b.start_key,b.end_keyFROM information_schema.TABLES as aINNER JOIN information_schema.TIKV_REGION_STATUS as bWHERE a.TIDB_TABLE_ID = b.TABLE_IDAND a.TABLE_SCHEMA='sbtest' AND a.TABLE_NAME='sbtest1'order by region_id desc;

dashboard-流量可视化查看热点情况

dashboard-慢查询查看sql运行情况

grafana查看系统负载情况

 

三、测试过程

1、主键自增热点测试

sysbench报告:

 image.png

热点情况,一条亮线,写入集中:

image.png

 

cpu负载,波动较大,不太均衡:

image.png

 

2、主键随机热点测试

sysbench报告:

image.png

 

热点情况,一条亮线,写入集中:

image.png

 

cpu负载,波动较大,不太均衡:

image.png

 

3、主键随机,表切割为10个region

sysbench报告:

image.png

 

热点情况,均匀写入:

image.png

 

cpu负载,tikv均衡:

image.png

 

四、测试结论

1、测试结果对比

测试顺序 主键自增 主键随机 主键随机+表切割为10个region
第1次测试 TPS : 7183.80 Latency : 6.96 ms TPS : 8084.06 Latency : 6.18 ms TPS : 6964.05 Latency : 7.18 ms
第2次测试 TPS : 7651.24 Latency : 6.53 ms TPS : 6186.63 Latency : 8.08 ms TPS : 6668.02 Latency : 7.50 ms
第3次测试 TPS : 6900.01 Latency : 7.24 ms TPS : 6397.88 Latency : 7.81 ms TPS : 6343.44 Latency : 7.88 ms
第4次测试 TPS : 6884.09 Latency : 7.26 ms TPS : 6324.73 Latency : 7.90 ms TPS : 6246.54 Latency : 8.00 ms
第5次测试 TPS : 7200.79 Latency : 6.94 ms TPS : 6656.51 Latency : 7.51 ms TPS : 6186.46 Latency : 8.08 ms
TPS平均值 7163.99 6729.96 6481.7
Latency平均值 6.99 ms 7.50 ms 7.73 ms

2、测试结果说明

  • 主键改为随机并不能提升性能,反而有所降低
  • 主键改为随机,并且表切割为10个region并不能提升性能,反而有所降低
  • 主键改为随机,表不做切割,热点问题依旧存在
  • 主键改为随机,表切割为10个region,热点问题有较大改善

 

3、测试结果分析

在pctp的视频中,老师测试的结果是随机写入要比顺序写入快,我以相同的场景测试很多次,而且业务侧也试过很多次,发现在4.0.13这个版本下,确实顺序写入要比随机写入要快。但是随机写入确实有助于降低热点,不会导致出现tikv write stall现象。

5
2
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论