如果第三方的sysbench(http://blog.csdn.net/sweeper_freedoman/article/details/73611154)是MySQL基准测试的专业版,那tpcc-mysql(https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql)就是旗舰版了。它由全球知名数据库服务商Percona公司的程序员开发,通过一套用3NF(第三范式)实现的仓储公司数据模型来模拟真实的业务压力,这套数据模型包含仓储公司库存管理、销售、产品分发、付款以及订单查询等现实场景下的一系列操作,一共包含9张表。结果采用学术界和工业界普遍使用的TPC-C评价OLTP应用的性能。
安装tpcc-mysql到github(https://github.com/Percona-Lab/tpcc-mysql)上clone一份源码下来编译就行了。
root@ubuntu:~# git clone https://github.com/Percona-Lab/tpcc-mysql.git root@ubuntu:~# cd tpcc-mysql/ ; ls
root@ubuntu:~/tpcc-mysql# cd src ; make cc -w -O3 -g -I. `mysql_config --include` -c load.c /bin/sh: 1: mysql_config: not found load.c:19:19: fatal error: mysql.h: 没有那个文件或目录 compilation terminated. Makefile:22: recipe for target 'load.o' failed make: *** [load.o] Error 1 root@ubuntu:~/tpcc-mysql/src# make clean rm -f *.o
啊噢,出现报错,我的本地Ubuntu Linux缺少“mysql_config”。
root@ubuntu:~/tpcc-mysql/src# mysql_config 程序“mysql_config”尚未安装。 您可以使用以下命令安装: apt install libmysqlclient-dev root@ubuntu:~/tpcc-mysql/src# apt install libmysqlclient-dev root@ubuntu:~/tpcc-mysql/src# make root@ubuntu:~/tpcc-mysql/src# cd .. ; ls | grep ^tpcc tpcc_load tpcc_start
mysql_config包含在“ libmysqlclient-dev ”里,apt安装一下(yum系统为“ mysql-devel ”),然后编译成功。可以看到tpcc-mysql主程序目录下面多了两个以tpcc开头的核心文件。
tpcc-mysql基准测试分为三个阶段,创建库表、加载数据和执行测试。
①创建库表。
这一阶段是测试工作的准备阶段。包含创建一个基准测试用schema(如果已经创建好跳过即可),导入仓储公司数据模型表结构(必须)以及导入数据模型索引约束(可以等到第②阶段加载数据完成后再执行这一步)。
root@ubuntu:~/tpcc-mysql# mysqladmin -uroot -p520 create benchmarker root@ubuntu:~/tpcc-mysql# mysql -uroot -p520 benchmarker < create_table.sql root@ubuntu:~/tpcc-mysql# mysql -uroot -p520 benchmarker < add_fkey_idx.sql
②加载数据。
即执行tpcc_load,创建加载一份测试数据。执行“ ./tpcc_load --help ”可以查看用法:|hostname| |port| |dbname| |user| |password| |WAREHOUSES|。本次测试实例创建11个仓库(-w)。
root@ubuntu:~/tpcc-mysql# ./tpcc_load -h127.0.0.1 -P3306 -dbenchmarker -uroot -p520 -w11 ************************************* *** TPCC-mysql Data Loader *** ************************************* option h with value '127.0.0.1' option p with value '3306' option d with value 'benchmarker' option u with value 'root' option p with value '520' option w with value '11'
[server]: 127.0.0.1 [port]: 3306 [DBname]: benchmarker [user]: root [pass]: 520 [warehouse]: 11 TPCC Data Load Started... ***** 这里代表一大段啪啪啪眼花缭乱的打印输出 ***** ...DATA LOADING COMPLETED SUCCESSFULLY.
这一过程视机器性能和创建仓库量,可能要花一点时间往测试库表里写数据,执行过程会打印出来。
③执行测试。
即执行tpcc_start,进行仓储公司业务场景测试。执行“ ./tpcc_start --help ”可以查看用法:|hostname| |port| |dbname| |user| |WAREHOUSES| |CONNECTIONS| |WARMUP TIME| |BENCHMARK TIME|。
root@ubuntu:~/tpcc-mysql# ./tpcc_start -h127.0.0.1 -P3306 -dbenchmarker -uroot -p520 -w11 -c2 -r22 -l180 *************************************** *** ###easy### TPC-C Load Generator *** *************************************** option h with value '127.0.0.1' option p with value '3306' option d with value 'benchmarker' option u with value 'root' option p with value '520' option w with value '11' option c with value '2' option r with value '22' option l with value '180'
[server]: 127.0.0.1 [port]: 3306 [DBname]: benchmarker [user]: root [pass]: 520 [warehouse]: 11 [connection]: 2 [rampup]: 22 (sec.) [measure]: 180 (sec.) RAMP-UP TIME.(22 sec.) MEASURING START. 10, trx: 6, 95%: 2665.596, 99%: 3636.936, max_rt: 3636.496, 5|789.268, 0|140.956, 1|1560.098, 1|10399.828 20, trx: 9, 95%: 3520.185, 99%: 3520.185, max_rt: 3520.139, 9|689.531, 1|156.137, 1|965.955, 1|10290.280 30, trx: 9, 95%: 1919.477, 99%: 1919.477, max_rt: 1919.449, 10|633.419, 1|868.591, 1|2240.299, 0|0.000 ***** 这里代表一大段啪啪啪眼花缭乱的打印输出 ***** STOPPING THREADS.. [0] sc:0 lt:173 rt:0 fl:0 avg_rt: 968.7 (5) [1] sc:1 lt:172 rt:0 fl:0 avg_rt: 268.5 (5) [2] sc:0 lt:17 rt:0 fl:0 avg_rt: 183.5 (5) [3] sc:0 lt:18 rt:0 fl:0 avg_rt: 1739.0 (80) [4] sc:0 lt:17 rt:0 fl:0 avg_rt: 9209.2 (20) in 180 sec. [0] sc:0 lt:173 rt:0 fl:0 [1] sc:1 lt:172 rt:0 fl:0 [2] sc:0 lt:17 rt:0 fl:0 [3] sc:0 lt:18 rt:0 fl:0 [4] sc:0 lt:17 rt:0 fl:0 (all must be [OK]) [transaction percentage] Payment: 43.47% (>=43.0%) [OK] Order-Status: 4.27% (>= 4.0%) [OK] Delivery: 4.52% (>= 4.0%) [OK] Stock-Level: 4.27% (>= 4.0%) [OK] [response time (at least 90% passed)] New-Order: 0.00% [NG] * Payment: 0.58% [NG] * Order-Status: 0.00% [NG] * Delivery: 0.00% [NG] * Stock-Level: 0.00% [NG] * 57.667 TpmC
测试的一部分重要信息是格式化打印出来的,通过“ report_interval ”(-i)选项设置,默认10s,用于说明该时间段内仓储公司的订单处理。如本次测试前10s的输出
10, trx: 6, 95%: 2665.596, 99%: 3636.936, max_rt: 3636.496, 5|789.268, 0|140.956, 1|1560.098, 1|10399.828
测试的最后一行给出TpmC值。Tpm是transaction per minute的缩写,C代表TPC(Transaction Processing Performance Council,事务处理性能协会)的C基准测试。该值的计算来自于上面的“ trx ”结果,默认情况下,首先求出New Order Per 10 Second的均值,然后乘以6,最后得到TpmC值。该值越大越好,表示更优良的事务处理能力。本次测试的TpmC值为57.667,来自于我笔记本电脑的一台小虚拟机。
这几天着重学习了一下MySQL基准测试的知识和工具,这些内容暂时就以对tpcc-mysql工具的学习收尾。最后,返璞归真,总结一下性能测试中常用的指标。理解这些指标的涵义也许比实施基准测试更重要。MySQL数据库主要包括两大瓶颈:吞吐量和磁盘I/O。吞吐量主要体现在QPS、TPS、Request以及Request Time;磁盘I/O主要体现在IOPS。
参考:
《MySQL技术内幕 InnoDB存储引擎》(https://book.douban.com/subject/24708143/)
《高性能MySQL》(https://book.douban.com/subject/23008813/)