尽管sysbench的测试很简单,并且结果也具有可比性,但毕竟无法模拟真实的业务压力。相比而言,TPC-C测试则能模拟真实压力。2.5.4节谈到的dbt2是TPC-C的一个很好的实现,但也还有一些不足之处。为了满足很多大型基准测试的需求,本书的作者重新开发了一款新的类TPC-C测试工具,代码放在Launchpad上,可以通过如下地址获取:https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql,其中包含了一个README文件说明了如何编译。该工具使用很简单,但测试数据中的仓库数量很多,可能需要用到其中的并行数据加载工具来加快准备测试数据集的速度,否则这一步会花费很长时间。
使用这个测试工具,需要创建数据库和表结构、加载数据、执行测试三个步骤。数据库和表结构通过包含在源码中的SQL脚本创建。加载数据通过用C写的tpcc_load工具完成,该工具需要自行编译。加载数据需要执行一段时间,并且会产生大量的输出信息(一般都应该将程序输出重定向到文件中,这里尤其应该如此,否则可能丢失滚动的历史信息)。下面的例子显示了配置过程,创建了一个小型(五个仓库)的测试数据集,数据库名为tpcc5。
$./tpcc_loadlocalhosttpcc5usernamep4ssword5
*************************************
***###easy###TPC-CDataLoader***
*************************************
[server]:localhost
[port]:3306
[DBname]:tpcc5
[user]:username
[pass]:p4ssword
[warehouse]:5
TPCCDataLoadStarted...
LoadingItem
..................................................5000
..................................................10000
..................................................15000
[outputsnippedforbrevity]
LoadingOrdersforD=10,W=5
..........1000
..........2000
..........3000
OrdersDone.
...DATALOADINGCOMPLETEDSUCCESSFULLY.
然后,使用tpcc_start工具开始执行基准测试。其同样会产生很多输出信息,还是建议重定向到文件中。下面是一个简单的示例,使用五个线程操作五个仓库,30秒预热时间,30秒测试时间:
$./tpcc_startlocalhosttpcc5usernamep4ssword553030
***************************************
***###easy###TPC-CLoadGenerator***
***************************************
[server]:localhost
[port]:3306
[DBname]:tpcc5
[user]:username
[pass]:p4ssword
[warehouse]:5
[connection]:5
[rampup]:30(sec.)
[measure]:30(sec.)
RAMP-UPTIME.(30sec.)
MEASURINGSTART.
10,63(0):0.40,63(0):0.42,7(0):0.76,6(0):2.60,6(0):0.17
20,75(0):0.40,74(0):0.62,7(0):0.04,9(0):2.38,7(0):0.75
30,83(0):0.22,84(0):0.37,9(0):0.04,7(0):1.97,9(0):0.80
STOPPINGTHREADS.....
1.New-Order
2.Payment
3.Order-Status
4.Delivery
5.Stock-Level
<90thPercentileRT(MaxRT)>
New-Order:0.37(1.10)
Payment:0.47(1.24)
Order-Status:0.06(0.96)
Delivery:2.43(2.72)
Stock-Level:0.75(0.79)
[0]sc:221lt:0rt:0fl:0
[1]sc:221lt:0rt:0fl:0
[2]sc:23lt:0rt:0fl:0
[3]sc:22lt:0rt:0fl:0
[4]sc:22lt:0rt:0fl:0
in30sec.
[0]sc:221lt:0rt:0fl:0
[1]sc:221lt:0rt:0fl:0
[2]sc:23lt:0rt:0fl:0
[3]sc:22lt:0rt:0fl:0
[4]sc:22lt:0rt:0fl:0
(allmustbe[OK])
[transactionpercentage]
Payment:43.42%(>=43.0%)[OK]
Order-Status:4.52%(>=4.0%)[OK]
Delivery:4.32%(>=4.0%)[OK]
Stock-Level:4.32%(>=4.0%)[OK]
[responsetime(atleast90%passed)]
New-Order:100.00%[OK]
Payment:100.00%[OK]
Order-Status:100.00%[OK]
Delivery:100.00%[OK]
Stock-Level:100.00%[OK]
442.000TpmC
最后一行就是测试的结果:每分钟执行完的事务数。如果紧挨着最后一行前发现有异常结果输出,比如有关于约束检查的信息,那么可以检查一下响应时间的直方图,或者通过其他详细输出信息寻找线索。当然,最好是能使用本章前面提到的一些脚本,这样就可以很容易获得测试执行期间的详细的诊断数据和性能数据。