一、测试说明
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报告:
热点情况,一条亮线,写入集中:
cpu负载,波动较大,不太均衡:
2、主键随机热点测试
sysbench报告:
热点情况,一条亮线,写入集中:
cpu负载,波动较大,不太均衡:
3、主键随机,表切割为10个region
sysbench报告:
热点情况,均匀写入:
cpu负载,tikv均衡:
四、测试结论
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现象。