TPC-C测试简介

TPC-C Benchmark是一个对OLTP(联机交易处理)系统进行测试的规范,使用一个商品销售模型对OLTP系统进行测试,其中包含五类事务:

  • NewOrder –新订单的生成

  • Payment –订单付款

  • OrderStatus –最近订单查询

  • Delivery –配送

  • StockLevel –库存缺货状态分析

mor

模型中包含若干个仓库(WAREHOUSE),每个仓库包含10个地区(DISTRICT),每个地区为3000个客户(CUSTOMER)提供服务,100000种商品(ITEM)被供应,每个仓库都有对应于每种商品的库存数据(STOCK)。客户下单后,包含若干个订单明细(ORDER-LINE)的订单(ORDER)被生成,并被加入新订单(NEW-ORDER)列表。客户对订单支付还会产生交易历史(HISTORY)。这些就是TPC-C模型中的9个数据表。其中,仓库的数量W可以根据系统的实际情况进行调整,以使系统性能测试结果达到最佳。

TPC-C使用tpmC值(Transactions per Minute)来衡量系统最大有效吞吐量(MQTh,Max Qualified Throughput),其中Transactions以NewOrder Transaction为准,即最终衡量单位为每分钟处理的新订单数。

在测试开始前,TPC-C Benchmark规定了数据库的初始状态,也就是数据库中数据生成的规则,其中ITEM表中固定包含10万种商品,仓库的数量可进行调整,假设WAREHOUSE表中有W条记录,那么:

  • STOCK表中应有W×10万条记录(每个仓库对应10万种商品的库存数据)

  • DISTRICT表中应有W×10条记录(每个仓库为10个地区提供服务)

  • CUSTOMER表中应有W×10×3000条记录(每个地区有3000个客户)

  • HISTORY表中应有W×10×3000条记录(每个客户一条交易历史)

  • ORDER表中应有W×10×3000条记录(每个地区3000个订单),并且最后生成的900个订单被添加到NEW-ORDER表中,每个订单随机生成5~15条ORDER-LINE记录。

在测试过程中,每一个地区(DISTRICT)都有一个对应的终端(Terminal),模拟为用户提供服务。在每个终端的生命周期内,要循环往复地执行各类事务,每个事务的流程如图所示,当终端执行完一个事务的周期后,就进入下一个事务的周期,如下图所示。

image

在事务执行周期开始,首先要随机选择一个事务类别,每类事务都有一个权值,以保证最终该类事务数量占有比例不低于:

  • NewOrder 43%

  • Payment 43%

  • OrderStatus 4%

  • Delivery 4%

  • StockLevel 4%.

然后,终端模拟用户输入事务所需的参数,并等待一个输入时间(Keying Time);等待结束后,事务执行正式开始,执行结束后记录事务的实际执行时间(txnRT),TPC-C对每类事务的执行时间都有一个最低要求,分别是:

  • 至少90%的NewOrder事务执行时间要低于5秒

  • 至少90%的Payment事务执行时间要低于5秒

  • 至少90%的OrderStatus事务执行时间要低于5秒

  • 至少90%的Payment事务执行时间要低于5秒

  • 至少90%的StockLevel事务执行时间要低于20秒;

最后,终端模拟用户对结果的查看以及思考,等待一个思考时间(Thinking Time);在思考时间结束后,进入下一个事务周期。 在整个测试过程结束后,用处理过的新订单事务总数量除以整个测试运行的分钟数并取整,就得到了tpmC的值。

TPCC-C测试

测试环境

测试工具

本次测试使用Percona tpcc-mysql派生分支, 增加自增列主键,取消外键,降低压测过程输出频率。github项目地址

测试机器

  • 阿里云RDS-1 (最大连接数:60,最大IOPS:150

  • 阿里云RDS-2 (RDS-1) + (Altas中间件) + (RDS-1只读实例

  • 阿里云RDS-3 (最大连接数:150,最大IOPS:300)

TPCC测试执行

  1. 数据加载

    ./tpcc_load rds1.mysql.rds.aliyuncs.com tpcc chip mypassword 10
  2. 执行测

    `/*环境1*/ ./tpcc_start -h rds2.mysql.rds.aliyuncs.com -d tpcc -u chip -p "mypassword"

    -w 100 -c 32 -r 600 -l 7200

    -f ~/tpcc_mysql_20150306.log >> ~/tpcc_caseX_1.log 2>&

    /*环境3*/ ./tpcc_start -h rds2.mysql.rds.aliyuncs.com -d tpcc -u chip -p "mypassword"

    -w 100 -c 32 -r 600 -l 7200

    -f ~/tpcc_mysql_20150306.log >> ~/tpcc_caseX_3.log 2>&

  3. 测试altas中间件(部署请参考Altas项目地址

    `./tpcc_start -h localhost -d tpcc -u chip -p "myfreebsdat10"

    -w 100 -c 32 -r 600 -l 7200

    -f ~/tpcc_mysql_20150306_altas.log >> ~/tpcc_caseX_2.log 2>&

  4. 数据整

    `/*数据计算*

    sh tpcc-output-analyze-2.sh test_2_Middleware/tpcc_caseX_1.log 3 > tpcc-with-midware.tx

    sh tpcc-output-analyze-2.sh test_1_non-Middleware/tpcc_caseX_2.log 3 > tpcc-non-midware.tx

    sh tpcc-output-analyze-2.sh test_3_double_IOPS/tpcc_caseX_3.log 3 > tpcc-with-double-IOPS.tx

    /*数据合并*

    paste tpcc-non-midware.txt tpcc-with-midware.txt tpcc-with-double-IOPS.txt > tpcc-graph-data.tx

  5. 绘制图

    调用gnuplot绘制图表,因此需要安装gnuplot软件

    `sudo yum install gnuplot.x86_6

    sh tpcc-graph-build.sh tpcc-graph-data.txt tpcc-graph5.ep

    `

    测试结果

    性能图表

    从折线图可以看出,引入Altas中间件之后,数据库事务性能提升极其有限,甚至在某些时段,由于中间件带来的性能损耗,事务性能有所下降。而在IOPS加倍后,数据库事务性能整体提升,涨幅为100%。由此可见,在提升事务性能层面上,提升IOPS是卓有成效的方式之一

    image

    整体性能

    TPCC的输出结果,提供了其他关于业务性能提升的证据。在加倍IOPS后,业务处理能力整体达到之前的3倍左右。在查询分析方面,IOPS的提升有一定助益。引入Altas中间件后,库存查询事务成功率达到96.79%,能满足小规模实时查询的需求。

    image

    优化分析

    根据TPC-C提供的场景,企业数据库性能扩容,以提升IOPS事务为第一选择,此时不建议引入数据库中间件,增加架构复杂程度和单点故障发生率。

    随着业务系统复杂度增加和用户数量大涨,查询分析事务比重不断升高时,可以加入中间件,重定向查询业务,降低主库磁盘和CPU压力,保证在线事务处理的流畅。

    参考资料

  6. [tpcc-mysql使用说明](https://sites.google.com/site/sysknife8/database/tpcc-mysqlshiyongshuoming

  7. [tpcc-mysql 与 gnuplot](http://www.zhaokunyao.com/archives/5793

  8. 数据处理的几个脚本

  • tpcc-output-analyze.sh

    `#!/bin/bas

    TIMESLOT=

    if [ -n "$2"

    the

    TIMESLOT=$

    f

    cat $1 | grep -v HY000 | grep -v payment | grep -v neword | awk -v timeslot=$TIMESLOT ' BEGIN { FS="[,():]"; s=0; cntr=0; aggr=0 } /MEASURING START/ { s=1} /STOPPING THREADS/ {s=0} /0/ { if (s==1) { cntr++; ag

    r+=$2; } if ( cntr==timeslot ) { printf ("%d %3dn",$1,(aggr/timeslot)) ; cntr=0; aggr=0 } } '

    `

  • tpcc-graph-build.sh

    `#! /bin/bas

    goto user homedir and remove previous fil

    rm -f '$2

    gnuplot << EO

    set data source fil

    datafile = '$1

    set graph type and siz

    set terminal jpeg size 1280,1024 linewidth 2 "Helvetica" 2

    set title "MySQL Performance Benchmark

    set terminal postscript eps color solid linewidth 3 "Helvetica" 1

    set title

    set grid x

    set xlabel "Time (sec)

    set ylabel "Transactions

    set output filenam

    set output '$2

    build grap

    plot datafile with line

    plot datafile title "One Instance (150*1 IOPS)" with lines,

    datafile using 3:4 title "Two Instances, RW+ReadOnly (150*2 IOPS)" with lines axis x1y1,

    datafile using 5:6 title "One Instance, Double IOPS (300*1 IOPS)" with line axis x1y

    EO