一、TPC、tpc-c与tpc-mysql
TPC:全称Transaction Processing Performance Council,是一家非盈利组织,该组织制定各种商业应用的基准测试规范,任意厂商或个人,都可以按照其规范来开发自己的应用程序。
tpc-c:由TPC推出的一套基准测试程序,主要用于联机事务类应用的测试,最后的c仅是序号,a\b\d\R\W都废弃了。Tpc-c没有废弃,是套基准,不管是有了新硬件,还是软件出了新版本,为显示新产品的优势,需要拿出些数值做对比,tpcc就是数值之一,各大厂商都着力在吹。tpc-c针对连接事务类应利用和决策支持类应用(数据仓库),另有一套标准,叫tpc-h。
tpcc-msyql:有Percona基于TPCC规范开发的一套MySQL基准测试程序。
tpcc-mysql的下载地址为:
https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql
二、tpcc-mysql软件的编译安装
该软件的下载和安装过程如下:
# yum install bzr -y --安装bzr工具包
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: mirror.bit.edu.cn
* extras: mirror.bit.edu.cn
* updates: mirror.bit.edu.cn
base | 3.7 kB 00:00
extras | 3.4 kB 00:00
updates | 3.4 kB 00:00
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package bzr.x86_64 0:2.1.1-2.el6 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
bzr x86_64 2.1.1-2.el6 base 5.3 M
Transaction Summary
================================================================================
Install 1 Package(s)
Total download size: 5.3 M
Installed size: 23 M
Downloading Packages:
bzr-2.1.1-2.el6.x86_64.rpm | 5.3 MB 00:01
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : bzr-2.1.1-2.el6.x86_64 1/1
Verifying : bzr-2.1.1-2.el6.x86_64 1/1
Installed:
bzr.x86_64 0:2.1.1-2.el6
Complete!
#
cd /data/setup
#
bzr branch lp:~percona-dev/perconatools/tpcc-mysql
You have not informed bzr of your Launchpad ID, and you must do this to
write to Launchpad or access private data. See "bzr help launchpad-login".
Branched 48 revision(s).
编译安装tpcc-mysql,步骤如下:
#
export PATH=/usr/local/mysql/bin:$PATH
#
cd tpcc-mysql/src
# make
cc -w -O2 -g -I. `mysql_config --include` -c load.c
cc -w -O2 -g -I. `mysql_config --include` -c support.c
cc load.o support.o `mysql_config --libs_r` -lrt -o ../tpcc_load
cc -w -O2 -g -I. `mysql_config --include` -c main.c
cc -w -O2 -g -I. `mysql_config --include` -c spt_proc.c
cc -w -O2 -g -I. `mysql_config --include` -c driver.c
cc -w -O2 -g -I. `mysql_config --include` -c sequence.c
cc -w -O2 -g -I. `mysql_config --include` -c rthist.c
cc -w -O2 -g -I. `mysql_config --include` -c neword.c
cc -w -O2 -g -I. `mysql_config --include` -c payment.c
cc -w -O2 -g -I. `mysql_config --include` -c ordstat.c
cc -w -O2 -g -I. `mysql_config --include` -c delivery.c
cc -w -O2 -g -I. `mysql_config --include` -c slev.c
cc main.o spt_proc.o driver.o support.o sequence.o rthist.o neword.o payment.o ordstat.o delivery.o slev.o `mysql_config --libs_r` -lrt -o ../tpcc_start
如果编译过程没有出现错误的话,就算安装好了,tpcc-mysql目录下会生成两个可执行文件;
tpcc_load:用于初始化数据
tpcc_start:用于执行基准测试
在测试时,需要先执行(且只执行一次)tpcc_load命令,然后在执行tpcc_start,但在执行前要创建需要的表和索引。
三、创建数据库预订数据
创建测试数据库并导入预订脚本:
#
mysqladmin -u root -p create tpcc100 //创建所需的数据库
mysql$
mysql -u root -p tpcc < create_table.sql //导入表结构
mysql$
mysql -u root -p tpcc < add_fkey_idx.sql //创建表索引及FK等
[root@racdb2 tpcc-mysql]#
./tpcc_load help
usage: tpcc_load [server] [DB] [user] [pass] [warehouse]
OR
tpcc_load [server] [DB] [user] [pass] [warehouse] [part] [min_wh] [max_wh]
* [part]: 1=ITEMS 2=WAREHOUSE 3=CUSTOMER 4=ORDERS
例如:创建100个数据仓库并填充数据
[root@racdb2 tpcc-mysql]# ./tpcc_load localhost tpcc100 root 'rootpassword' 100
四、增加参数,执行tpcc_load初始化数据
注意为了保证下面两个脚本能够执行成功,建议在.bash_profile文件中增加如下参数:
# parameters for tpcc-mysql
export MYSQL_HOME=/usr/local/mysql
export C_INCLUDE_PATH=$MYSQL_HOME/include
--避免找不到MySQL的头文件的错误
export PATH=$MYSQL_HOME/bin:$PATH
--避免找不到mysql_config程序的错误
export LD_LIBRARY_PATH=$MYSQL_HOME/lib:$LD_LIBRARY_PATH
--避免找不到mysql库的错误
上述参数生效后,根据语法,执行tpcc_load初始化数据的命令:
$
cd /data/setup/tpcc-mysql/
$
./tpcc_load 172.32.1.203 tpcc root "123456" 10
输出结果如下:
*************************************
*** ###easy### TPC-C Data Loader ***
*************************************
<Parameters>
[server]: 172.32.1.203
[port]: 3306
[DBname]: tpcc
[user]: root
[pass]: 123456
[warehouse]: 10
TPCC Data Load Started...
Loading Item
.................................................. 5000
..................................................
Loading Orders for D=10, W= 10
.......... 1000
.......... 2000
.......... 3000
Orders Done.
...DATA LOADING COMPLETED SUCCESSFULLY.
返回结果需要运行一段时间,一次有仓库、商品、订单等,具体信息可以不用关注,最后操作完成后,会提示数据加载完成。
详细信息参见:http://blog.csdn.net/yumushui/article/details/37762517
五、执行tpcc_start执行基准测试
初始化数据完成后,就可以使用tpcc_start进行基准测试,该命令行工具支持的参数如下:
Usage:tpcc_start -h server_host -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
前面是与mysql连接的参数,后面参数的意义如下:
-r warmup_time:指定预热时间,以秒为单位,默认是10秒,主要目的是为了将数据加载到内存;
-l running_time:指定测试执行时间,以秒为单位,默认是20秒;
-i report_interval:指定生产报告的时间间隔;
-f report_file:将测试中各项操作的记录输出到指定文件内保存;
-t trx_file:输出更详细的操作信息到指定文件内保存;
$
/data/setup/tpcc-mysql/tpcc_start -h 172.32.1.203 -d tpcc -u root -p "123456" -w 10 -c 10 -r 100 -l 300 -f /home/mysql/tpcc_mysql.log -t /home/mysql/tpcc_mysql.rtx
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
option h with value '172.32.1.203'
option d with value 'tpcc'
option u with value 'root'
option p with value '123456'
option w with value '10'
option c with value '10'
option r with value '100'
option l with value '300'
option f with value '/home/mysql/tpcc_mysql.log'
option t with value '/home/mysql/tpcc_mysql.rtx'
<Parameters>
[server]: 172.32.1.203
[port]: 3306
[DBname]: tpcc
[user]: root
[pass]: 123456
[warehouse]: 10
[connection]: 10
[rampup]: 100 (sec.)
[measure]: 300 (sec.)
RAMP-UP TIME.(100 sec.)
返回信息中的内容比较有意义,首先是执行命令时指定的参数信息,格式清晰。接下来需要等一会,指定的预热及测试的时间,只是得7分钟。测试返回的结果是:
10, 2948(20):2.161|302.746, 2950(4):0.666|186.816, 294(0):0.365|21.915, 296(0):8.277|291.135, 295(1):10.260|41.107
20, 2663(18):2.423|40.398, 2664(5):0.649|24.596, 266(0):0.276|0.529, 265(0):10.543|43.207, 266(6):19.999|56.884
30, 2190(13):2.282|89.741, 2187(4):0.627|61.344, 219(0):0.316|0.473, 219(0):10.018|44.254, 219(0):8.537|13.819
这类信息,每10秒产生一条输出,每个翻译结果以逗号分隔后,共分为6项,一次为操作时间(秒)、创建订单、订单交付、查询订单、发货、查询库存。
第一项是定义任务执行的时间,按照每10秒为一个区间进行输出。后5项格式一样分属5个不同的业务操作,每一项都是4个属性值,即该区间内成功执行的事务数、出现延迟的事务数、90%事务的响应时间、事务的最大响应时间。
以一条具体的例子做详细说明:
10, 2948(20):2.161|302.746, 2950(4):0.666|186.816, 294(0):0.365|21.915, 296(0):8.277|291.135, 295(1):10.260|41.107
这条记录表示,在第一个10秒区间内:
创建订单。共操作2984次,失败20次,90%的事务平均操作时间2.161秒,最大操作时间为302.746秒。
订单支付。共操作2950次,失败4次,90%的事务平均操作时间0.666秒,最大操作时间为186.816秒。
查询订单。共操作294次,失败0次,90%的事务平均操作时间0.365秒,最大操作时间为21.915秒。
发货。共操作296次,失败0次,90%的事务平均操作时间8.277秒,最大操作时间为291.135秒。
查询库存。共操作295次,失败1次,90%的事务平均操作时间10.260秒,最大操作时间为41.107秒。
输出记录中,一条条分析不够形象,可以讲数字输入到Excel中,转换成图形,就可以比较直观了。
接下来的信息,是汇总各线程操作的各项事务的数据量,内容如下:
<Raw Results>
[0] sc:83441 lt:382 rt:0 fl:0
[1] sc:83638 lt:174 rt:0 fl:0
[2] sc:8372 lt:10 rt:0 fl:0
[3] sc:8370 lt:12 rt:0 fl:0
[4] sc:8325 lt:57 rt:0 fl:0
in 300 sec.
在反映数据量时,使用了若干简写指标,实际代表的意义如下:
sc:即seccess,操作成功的数量。
lt:即late,指操作出现延迟的数量。
rt:即retry,指操作重试的数量。
fl:即failure,指操作失败的数量。
再接下来输出的是不同类型的业务执行的事务数占比情况:
[transaction percentage]
Payment: 43.48% (>=43.0%) [OK]
Order-Status: 4.35% (>= 4.0%) [OK]
Delivery: 4.35% (>= 4.0%) [OK]
Stock-Level: 4.35% (>= 4.0%) [OK]
依次对应的是订单支付、查询订单、发货、查询库存4项业务的占比,加上没有体现的创建订单的占比,为100%。
在命令行的最后,输出了一项名为TpmC的指标:
<TpmC>
16764.600 TpmC
这项指标可以理解为整体性能指标,达标了本系统每分钟能够处理的订单数量。注意这里是分钟,因为tpm是Transactions per minute的简写,而C指的就是执行TPC-C基准测试。
tpcc_start命令执行的完整返回结果参见:
http://blog.csdn.net/yumushui/article/details/37762723
Tpcc没有收集系统性能指标,我们科通过其他途径对此期间的系统性能进行收集,重点关注CPU和系统平均负载。