在之前的博客我们了解了TDSQL 集群中常用的TPCC性能测试的几个工具,如下:
TDSQL 集群 POC TPCC 性能测试 常用工具 说明
https://www.cndba.cn/dave/article/4626TDSQL 集群 使用 sysbench 进行性能压测 使用案例
https://www.cndba.cn/dave/article/4628
本篇我们来看TPCC-MYSQL 的具体使用。
1 安装 tpcc-mysql
tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品,专用于MySQL基准测试(事务处理能力、ACID验证)。
官网地址:
TDSQL使用的benchmark是基于mysql分支的,与标准benchmark在表结构和测试结果指标上有部分差异,目前官方的tpcc-mysql版本存在问题(优化TPCC的装载数据效率以及修复warehouse表的w_ytd初始化值错误的问题),所以TDSQL团队针对问题进行了优化,分别编译groupshard和noshard两个版本。
将这2个版本的tpcc 上传到服务器后解压缩:
[dave@www.cndba.cn data]# tar -xvf tpcc_groupshard.tar
[dave@www.cndba.cn data]# tar -xvf tpcc_noshard.tgz
[dave@www.cndba.cn data]# cd tpcc_groupshard/
[dave@www.cndba.cn tpcc_groupshard]# ls
1.sh create_table.sql load_data load.sh split.sh tpcc_load
add_fkey_idx.sql Dockerfile load_data.sh log src tpcc_start
all.sh drop_cons.sql load_data.sh.bak README.md tmp tpcc_start_p
count.sql load_100.sh load_data.sh_bkp schema2 tpcc_groupshard.tgz
create_table_noshard.sql load_100.sh.bak load_multi_schema.sh scripts tpcc_groupshard.zip
[dave@www.cndba.cn tpcc_groupshard]#
这里面主要几个脚本如下:
- 表结构sql脚本: create_table.sql
- 装载数据脚本: load_data.sh load.sh load_100.sh
- 压测脚本: tpcc_start
2 压测前配置参数修改
这些参数的优化是为了tpcc mysql 能测试更好的性能值。 具体优化工作有如下5个方面。
2.1 网关(proxy)配置修改
如果压测的实例还没有创建,可以直接修改proxy配置模板:
配置模板目录:/data/home/tdsql/tdsqlinstall/gateway/conf/template.cnf
[dave@www.cndba.cn conf]# pwd
/data/home/tdsql/tdsqlinstall/gateway/conf
[dave@www.cndba.cn conf]# ls
ca-cert.pem client-cert.pem logformat.xml pngclient.xml public_key.pem server-key.pem wagent_template.xml
ca-key.pem client-key.pem logmonitor.xml private_key.pem server-cert.pem template.cnf
[dave@www.cndba.cn conf]#
如果压测实例已经创建过了,那么就需要修改对应实例的配置文件,然后重启网关;
网关配置目录:/data/tdsql_run/15004/gateway/conf/instance_15004.cnf
[dave@www.cndba.cn conf]# pwd
/data/tdsql_run/15004/gateway/conf
[dave@www.cndba.cn conf]# ls
ca-cert.pem client-key.pem logmonitor.xml public_key.pem template.cnf
ca-key.pem instance_15004.cnf pngclient.xml server-cert.pem wagent_15004.xml
client-cert.pem logformat.xml private_key.pem server-key.pem wagent_template.xml
[dave@www.cndba.cn conf]#
这里的数字ID:15004 就是proxy的端口,可以直接在赤兔平台上查看。
TDSQL 集群 各模块启停命令 汇总
https://www.cndba.cn/dave/article/4602
修改/data/tdsql_run/15004/gateway/conf/instance_15004.cnf 文件中的如下配置:
<run event_threads="64" />
<!--日志选项 -->
<log>
<dbfw name="../log/dbfw_" log_size="1000000000" log_level="1"/>
<system name="../log/sys_" log_size="1000000000" log_level="4"/>
<interface name="../log/interf_" log_size="1000000000" openflag="0" timeflag="0"/>
<sql name="../log/sql_" log_size="1000000000" openflag="0" />
<slow_sql name="../log/slow_sql_" log_size="1000000000" openflag="0" long_query_time="100" />
</log>
<mode>
<cache size="64" />
</mode>
未涉及参数使用默认值即可。
检查修改结果:
[dave@www.cndba.cn conf]# grep -E 'log_level|openflag|cache|event_threads|pk' /data/tdsql_run/15004/gateway/conf/instance_15004.cnf
<log_info name="../log/route_" log_size="1000000000" log_level="2"/>
<run event_threads="64" />
<dbfw name="../log/dbfw_" log_size="1000000000" log_level="1"/>
<system name="../log/sys_" log_size="1000000000" log_level="4"/>
<interface name="../log/interf_" log_size="1000000000" openflag="0" timeflag="0"/>
<sql name="../log/sql_" log_size="1000000000" openflag="0" />
<slow_sql name="../log/slow_sql_" log_size="1000000000" openflag="1" long_query_time="100" />
<cache size="64" />
<reject nosk="0" nopk="1"/>
[dave@www.cndba.cn conf]#
重启proxy 让修改生效:
[dave@www.cndba.cn bin]# pwd
/data/tdsql_run/15004/gateway/bin
[dave@www.cndba.cn bin]# ./restart_cgroup.sh instance_15004
我们这里只修改我们压测点节点,其他节点不再修改。
2.2 DB模块配置修改
同样,如果压测的实例还没有创建,可以直接修改DB配置模板:
配置模板:/data/home/tdsql/tdsqlinstall/percona-5.7.17/install/template.cnf
如果压测实例已经创建过了,那么就需要修改对应实例的DB配置文件,然后重启DB;DB 端口在赤兔平台进行查看。 我这里的环境是groupshard,有2个分片,所有有2个端口:4006 和 4007。
文件:/data/tdsql_run/4006/percona-5.7.17/etc/my_4006.cnf
[dave@www.cndba.cn etc]# pwd
/data/tdsql_run/4006/percona-5.7.17/etc
[dave@www.cndba.cn etc]# ls
add_my_4006.ini data_dir.txt frominstall_my_4006.ini my_4006.cnf
[dave@www.cndba.cn etc]#
设置my_4006.cnf里的三个参数值为如下:
reject_table_no_pk=0
innodb_doublewrite=0
binlog_row_image=MINIMAL
检查修改结果:
[dave@www.cndba.cn etc]# grep -E 'no_pk|doublewrite|row_image' /data/tdsql_run/4006/percona-5.7.17/etc/my_4006.cnf
binlog_row_image=MINIMAL
reject_table_no_pk=0
innodb_doublewrite=0
[dave@www.cndba.cn etc]#
重启DB:
[dave@www.cndba.cn install]# pwd
/data/tdsql_run/4006/percona-5.7.17/install
[dave@www.cndba.cn install]# ./restartmysql_cgroup.sh 4006
4007 也同样操作,这里不再演示。
2.3 Agent模块配置修改
同样,如果压测的实例还没有创建,可以直接修改agent配置模板:
配置模板:/data/home/tdsql/tdsqlinstall/mysqlagent/conf/template.cnf
[dave@www.cndba.cn conf]# pwd
/data/home/tdsql/tdsqlinstall/mysqlagent/conf
[dave@www.cndba.cn conf]# ls
dcnconf.xml modify_zk.xml mysqlagent_template.xml
[dave@www.cndba.cn conf]#
如果压测实例已经创建过了,那么就需要修改对应实例的agent配置文件,修改后需要无需重启agent。
这里要注意,agent 的端口和DB端口是一样的, 所以我们这里agent的端口还是4006和4007。
[dave@www.cndba.cn conf]# pwd
/data/tdsql_run/4007/mysqlagent/conf
[dave@www.cndba.cn conf]# ls
mysqlagent_4007.xml mysqlagent_template.xml
[dave@www.cndba.cn conf]#
修改配置文件:
/data/tdsql_run/4007/mysqlagent/conf/mysqlagent_4007.xml
配置值修改如下:
<xtrabackup setlimit="0" dcnlimit="0" slave_flag="1" sql_dump="0" />
2.4 开启主备免切
通过赤兔平台-实例管理-选择要修改的实例进入实例详情-容灾配置-点击【设置】后修改成【设置一直免切】。
注意,这个要在每个set中进行设置。
2.5 设置为异步
通过赤兔平台-实例管理-选择要修改的实例进入实例详情-数据复制方式-点击设置后修改成异步
3 装载数据
3.1 创建测试库和表
切换到TPCC工具包目录,然后执行如下命令:
mysql -h192.168.31.61 -udave -pdave -P15004 -e 'drop database if exists tpcc;create database tpcc;show databases;'
mysql -h192.168.31.61 -udave -pdave -P15004 -Dtpcc < create_table.sql
mysql -h192.168.31.61 -udave -pdave -P15004 -Dtpcc -e 'show tables;'
[dave@www.cndba.cn tpcc_groupshard]# pwd
/data/tpcc_groupshard
You have new mail in /var/spool/mail/root
[dave@www.cndba.cn tpcc_groupshard]# ls
1.sh create_table.sql load_data load.sh split.sh tpcc_load
add_fkey_idx.sql Dockerfile load_data.sh log src tpcc_start
all.sh drop_cons.sql load_data.sh.bak README.md tmp tpcc_start_p
count.sql load_100.sh load_data.sh_bkp schema2 tpcc_groupshard.tgz
create_table_noshard.sql load_100.sh.bak load_multi_schema.sh scripts tpcc_groupshard.zip
[dave@www.cndba.cn tpcc_groupshard]# mysql -h192.168.31.61 -udave -pdave -P15004 -e 'drop database if exists tpcc;create database tpcc;show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| cndba |
| dave |
| mysql |
| performance_schema |
| sys |
| sysdb |
| test |
| tpcc |
| xa |
+--------------------+
[dave@www.cndba.cn tpcc_groupshard]# mysql -h192.168.31.61 -udave -pdave -P15004 -Dtpcc < create_table.sql
[dave@www.cndba.cn tpcc_groupshard]# mysql -h192.168.31.61 -udave -pdave -P15004 -Dtpcc -e 'show tables;'
+----------------+
| Tables_in_tpcc |
+----------------+
| customer |
| district |
| history |
| item |
| new_orders |
| order_line |
| orders |
| stock |
| warehouse |
+----------------+
[dave@www.cndba.cn tpcc_groupshard]#
3.2 使用tpcc_load加载数据
这里使用tpcc_load工具导入,该工具帮助如下:
[dave@www.cndba.cn tpcc_groupshard]# ./tpcc_load --h
*************************************
*** TPCC-mysql Data Loader ***
*************************************
./tpcc_load: invalid option -- '-'
Usage: tpcc_load -h server_host -P port -d database_name -u mysql_user -p mysql_password -w warehouses -l part -m min_wh -n max_wh
* [part]: 1=ITEMS 2=WAREHOUSE 3=CUSTOMER 4=ORDERS
[dave@www.cndba.cn tpcc_groupshard]#
可以一次性导入所有数据,命令如下:
[dave@www.cndba.cn tpcc_groupshard]# ./tpcc_load -h 192.168.31.61 -P 15004 -d tpcc -u dave -p dave -w 10
但是这种方式很慢。 所以我们这里分2步骤导入。
3.2.1 使用tpcc_load导入item表(固定10w条记录)
-w:表示仓库数目
-m:1表示加载item数据
这一步约需要15分钟。 22
[dave@www.cndba.cn tpcc_groupshard]# ./tpcc_load -h 192.168.31.61 -P 15004 -d tpcc -u dave -p dave -w 10 -l 1 -m 1 -n 10
*************************************
*** TPCC-mysql Data Loader ***
*************************************
option h with value '192.168.31.61'
option P with value '15004'
option d with value 'tpcc'
option u with value 'dave'
option p with value 'dave'
option w with value '10'
option l with value '1'
option m with value '1'
option n with value '10'
<Parameters>
[server]: 192.168.31.61
[port]: 15004
[DBname]: tpcc
[user]: dave
[pass]: dave
[warehouse]: 10
[part(1-4)]: 1
[MIN WH]: 1
[MAX WH]: 10
TPCC Data Load Started...
Loading Item
.................................................. 5000
.................................................. 10000
……
.................................................. 95000
.................................................. 100000
Item Done.
...DATA LOADING COMPLETED SUCCESSFULLY.
You have new mail in /var/spool/mail/root
[dave@www.cndba.cn tpcc_groupshard]#
3.2.2 使用load_data.sh加载其他8张表
脚本格式如下:
[dave@www.cndba.cn tpcc_groupshard]# ./load_data.sh --h
DBNAME HOST PORT USER PASS BEG END
[dave@www.cndba.cn tpcc_groupshard]#
虽然这里没有指定STEP 参数, 该参数在脚本里默认是100,如果我们的warehouse小于100,那么不加STEP 参数会报如下错误:
[dave@www.cndba.cn tpcc_groupshard]# ./load_data.sh tpcc 192.168.31.61 15004 dave dave 1 10
./load_data.sh: line 30: [: 0: unary operator expected
./load_data.sh: line 30: [: 0: unary operator expected
另外,load_data.sh脚本也是在后台调用load_100.sh 脚本来导入数据的。 所以我们这里可以采用nohup的方式放后台台,否则前台也是看不到导入进度的。
[dave@www.cndba.cn tpcc_groupshard]# nohup ./load_data.sh tpcc 192.168.31.61 15004 dave dave 1 10 10 > ./log/dave.log &
过1分钟后出现后台导入进程,具体过程可以查看load_100.sh:
[dave@www.cndba.cn tpcc_groupshard]# ps -ef|grep load_data
root 19573 52491 39 19:47 pts/0 00:00:01 ./load_data mode0 192.168.31.61 15004 dave dave tpcc.stock auto data_1/stock__1_100_set_1627396836_1
root 19974 2176 0 19:47 pts/0 00:00:00 grep --color=auto load_data
[dave@www.cndba.cn tpcc_groupshard]#
[dave@www.cndba.cn tpcc_groupshard]# ps -ef|grep load_data
root 68948 50198 28 21:51 pts/0 00:00:08 ./load_data mode0 192.168.31.61 15004 dave dave tpcc.order_line auto data_1/order_line__1_100
root 72690 2176 0 21:52 pts/0 00:00:00 grep --color=auto load_data
[dave@www.cndba.cn tpcc_groupshard]#
load_100.sh 脚本会在当前目录下生成3个.out 的文件,分别对应其他几张表(2=WAREHOUSE 3=CUSTOMER 4=ORDERS):
[dave@www.cndba.cn tpcc_groupshard]# pwd
/data/tpcc_groupshard
[dave@www.cndba.cn tpcc_groupshard]# ll *.out
-rw-r--r-- 1 root root 239452 Jul 29 19:44 2_1.out
-rw-r--r-- 1 root root 197270 Jul 29 19:45 3_1.out
-rw-r--r-- 1 root root 183270 Jul 29 19:45 4_1.out
[dave@www.cndba.cn tpcc_groupshard]# tail -10f 4_1.out
.......... 2000
.......... 3000
Orders Done.
Loading Orders for D=10, W= 100
.......... 1000
.......... 2000
.......... 3000
Orders Done.
...DATA LOADING COMPLETED SUCCESSFULLY.
[dave@www.cndba.cn log]# mysql -h192.168.31.61 -udave -pdave -P15004 -Dtpcc -e 'select count(1) from item;'
+----------+
| count(1) |
+----------+
| 100000 |
+----------+
[dave@www.cndba.cn log]#
[dave@www.cndba.cn log]# mysql -h192.168.31.61 -udave -pdave -P15004 -Dtpcc -e 'select count(1) from customer ;'
+----------+
| count(1) |
+----------+
| 0 |
+----------+
You have new mail in /var/spool/mail/root
[dave@www.cndba.cn log]#
如果中途需要终止数据加载执行以下命令:
ps -ef|grep -E ‘load_data|tpcc_load’|awk ‘{print $2}’|xargs kill -9
4 开始压力测试
压测使用tpcc_start命令,帮助如下:
[dave@www.cndba.cn tpcc_groupshard]# ./tpcc_start -h
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
./tpcc_start: option requires an argument -- 'h'
Usage: tpcc_start -h server_host1,server_host2,serverhost3.... -P port -d database_name -u mysql_user -p mysql_password -w warehouses -c connections -r warmup_time -l running_time -i report_interval -f report_file -t trx_file
[dave@www.cndba.cn tpcc_groupshard]#
这里主要几个参数含义如下:
-d: 数据库名
-u: 用户名
-p: 密码
-w:仓库数量
-c: 并发线程数
-r: 预热时间,以秒为单位,默认10秒,主要目的是为了将数据加载到内存。
-l: 运行时间,以秒为单位,默认20秒
-i: 输出时间间隔
注意: -h host1,host2,host3 可以传多个proxy的ip,通过优化tpcc支持请求负载到多个proxy,不需要lvs或者负载工具
另外还需要注意压测过程中会产生大量的binlog,占用磁盘空间,需要清理binlog。
脚本执行大约10分钟左右:
[dave@www.cndba.cn tpcc_groupshard]# nohup ./tpcc_start -h tdsql1,tdsql3 -P 15004 -d tpcc -u dave -p dave -w 10 -c 10 -r 60 -l 120 -f ./log/tpcc_report.log > ./log/tpcc_start.log &
[dave@www.cndba.cn log]# ps -ef|grep tpcc_start
root 34749 2176 1 21:57 pts/0 00:00:02 ./tpcc_start -h tdsql1,tdsql2,tdsql3 -P 15004 -d tpcc -u dave -p dave -w 10 -c 10 -r 10 -l 20 -i 1 -f ./log/tpcc_report.log
root 67626 2249 0 22:00 pts/1 00:00:00 grep --color=auto tpcc_start
[dave@www.cndba.cn log]#
然后监控./log/tpcc_start.log 的日志输出就可以了。
5 压测结果说明
压测结束以后,在./log/tpcc_start.log 日志的最后会有与汇总的报告。
New-Order :新订单 Payment:支付 Order-Status:订单查询 Delivery:发货 Stock-Level :库存
<Raw Results> //第一次统计结果
[0] sc:1328 lt:3 rt:0 fl:0 avg_rt: 318.4 (5000) //New-Order,新订单业务成功(success,简写sc)次数,延迟(late,简写lt)次数,重试(retry,简写rt)次数,失败(failure,简写fl)次数
[1] sc:1337 lt:0 rt:0 fl:0 avg_rt: 177.8 (5000) //Payment,支付业务统计,其他同上
[2] sc:133 lt:0 rt:0 fl:0 avg_rt: 35.3 (5000) //Order-Status,订单状态业务统计,其他同上
[3] sc:134 lt:0 rt:0 fl:0 avg_rt: 627.7 (80000) //Delivery,发货业务统计,其他同上
[4] sc:134 lt:0 rt:0 fl:0 avg_rt: 1135.2 (20000) //Stock-Level,库存业务统计,其他同上
in 60 sec.
<Raw Results2(sum ver.)> //第二次统计结果,其他同上
[0] sc:1328 lt:3 rt:0 fl:0
[1] sc:1337 lt:0 rt:0 fl:0
[2] sc:133 lt:0 rt:0 fl:0
[3] sc:134 lt:0 rt:0 fl:0
[4] sc:134 lt:0 rt:0 fl:0
<Constraint Check> (all must be [OK])
//下面所有业务逻辑结果都必须为 OK 才行
[transaction percentage]
Payment: 43.56% (>=43.0%) [OK] //支付成功次数(上述统计结果中 sc + lt)必须大于43.0%,否则结果为NG,而不是OK
Order-Status: 4.33% (>= 4.0%) [OK]
Delivery: 4.37% (>= 4.0%) [OK]
Stock-Level: 4.37% (>= 4.0%) [OK]
[response time (at least 90% passed)] //响应耗时指标必须超过90%通过才行
New-Order: 99.77% [OK]
Payment: 100.00% [OK]
Order-Status: 100.00% [OK]
Delivery: 100.00% [OK]
Stock-Level: 100.00% [OK]<TpmC>
1331.000 TpmC //每分钟处理完成的事务数,该值=第一次统计结果 new-order成功事务数/总运行时间(分钟)
版权声明:本文为博主原创文章,未经博主允许不得转载。