签到成功

知道了

CNDBA社区CNDBA社区

TDSQL 集群 使用 TPCC 进行性能压测 使用案例

2021-07-29 23:24 86 0 原创 TDSQL
作者: Dave

在之前的博客我们了解了TDSQL 集群中常用的TPCC性能测试的几个工具,如下:

TDSQL 集群 POC TPCC 性能测试 常用工具 说明
https://www.cndba.cn/dave/article/4626

TDSQL 集群 使用 sysbench 进行性能压测 使用案例
https://www.cndba.cn/dave/article/4628https://www.cndba.cn/dave/article/4630

本篇我们来看TPCC-MYSQL 的具体使用。

1 安装 tpcc-mysql

tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品,专用于MySQL基准测试(事务处理能力、ACID验证)。

官网地址:https://www.cndba.cn/dave/article/4630

https://www.cndba.cn/dave/article/4630

https://github.com/Percona-Lab/tpcc-mysql

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]#

这里面主要几个脚本如下:

  1. 表结构sql脚本: create_table.sql
  2. 装载数据脚本: load_data.sh load.sh load_100.sh
  3. 压测脚本: 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的端口,可以直接在赤兔平台上查看。 https://www.cndba.cn/dave/article/4630

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。

https://www.cndba.cn/dave/article/4630

文件:/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 开启主备免切

通过赤兔平台-实例管理-选择要修改的实例进入实例详情-容灾配置-点击【设置】后修改成【设置一直免切】。 https://www.cndba.cn/dave/article/4630

注意,这个要在每个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 10https://www.cndba.cn/dave/article/4630

但是这种方式很慢。 所以我们这里分2步骤导入。

https://www.cndba.cn/dave/article/4630
https://www.cndba.cn/dave/article/4630

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 参数会报如下错误:https://www.cndba.cn/dave/article/4630

[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成功事务数/总运行时间(分钟)

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Dave

Dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 1902
    原创
  • 2
    翻译
  • 456
    转载
  • 131
    评论
  • 访问:3642136次
  • 积分:3137
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by ZhiXinTech · 皖ICP备19020168号·

        QQ交流群