TPCC - MySQL 数据库测试

date
Dec 15, 2021
slug
TPCC
status
Published
tags
Test
Database
summary
TPCC - MySQL 数据库测试
type
Post
Language

TPCC 介绍

TPC-C 模拟了一个比较有代表意义的 OLTP 应用环境:在线订单处理系统。假设有一个大型商品批发商,拥有 N 个位于不同区域的仓库,每个仓库负责为 10 个销售点供货,每个销售点有 3000 个客户,每个客户平均一个订单有 10 项产品。由于一个仓库中不可能 存储公司所有的货物,有一些请求必须发往其它仓库,因此,数据库在逻辑上是 分布的。N 是一个可变参数,测试者可以随意改变 N,以获得最佳测试效果。
TPCC 有 5 种事务,测试完成后会输出这 5 种事务的吞吐量和延迟。
  • New-Order: 客户输入一笔新的订货交易
  • Payment:更新客户账户余额以反应其支付状况
  • Delivery:发货(批处理交易)
  • Order-Status:查询客户最近交易的状态
  • Stock-Level:查询仓库库存状况,以便能够及时补货。

安装 TPCC - MySQL

git clone <https://github.com/Percona-Lab/tpcc-mysql>
cd tpcc-mysql/src
make
如果报错 mysql_config: not found 安装以下依赖
# Cent OS
sudo yum install mysql-devel

# Debain or Ubuntu
sudo apt install libmysqlclient-dev
编译安装成功后,会在 tpcc-mysql 目录下生成 tpcc_loadtpcc_start 可执行文件

初始化数据库

创建 TPCC 数据库
mysql -uroot -p -e "CREATE DATABASE TPCC DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
初始化表结构
mysql -uroot -p TPCC <./create_table.sql
创建相关索引和主外键
mysql -uroot -p TPCC <./add_fkey_idx.sql

装载数据

  • h 数据库地址
  • P 数据库端口
  • d 数据库名称
  • u 数据库用户
  • p 数据库密码
  • w 仓库数
./tpcc_load -h 127.0.0.1 -P 3306 -d TPCC -u root -p 000000 -w 10

测试

  • c 线程数
  • r 预热时间(秒)
  • l 测试持续时间
./tpcc_start -h 127.0.0.1 -P 3306 -d TPCC -u root -p 000000 -w 10 -c 128 -r 120 -l 200

测试结果分析

过程

  10, trx: 525, 95%: 693.088, 99%: 4338.168, max_rt: 10359.842, 510|15856.770, 51|1440.460, 48|10947.689, 51|10114.716
  20, trx: 688, 95%: 2158.457, 99%: 4750.035, max_rt: 5101.409, 690|13675.766, 69|1255.582, 70|6061.973, 69|5322.404
  30, trx: 848, 95%: 630.345, 99%: 890.963, max_rt: 1146.531, 856|10319.565, 86|101.299, 84|3822.822, 84|1366.602
  40, trx: 357, 95%: 9212.758, 99%: 10117.659, max_rt: 10323.202, 354|14805.343, 34|332.008, 41|11413.883, 35|10782.403
  50, trx: 683, 95%: 1154.279, 99%: 4650.147, max_rt: 4784.734, 689|14141.830, 70|529.657, 63|5845.514, 71|4475.639
  60, trx: 973, 95%: 626.207, 99%: 2044.010, max_rt: 5434.062, 949|8996.483, 96|278.258, 100|6328.977, 93|5320.758
  70, trx: 316, 95%: 5367.070, 99%: 5593.421, max_rt: 5744.056, 337|14920.423, 33|3960.090, 29|11122.768, 34|6203.226
  80, trx: 919, 95%: 663.053, 99%: 1059.254, max_rt: 2032.116, 897|14885.748, 91|1357.449, 93|2456.914, 91|2865.899
  90, trx: 995, 95%: 732.772, 99%: 3841.721, max_rt: 5016.498, 1001|9583.489, 100|289.054, 103|5651.122, 100|5430.500
 100, trx: 151, 95%: 6388.488, 99%: 8505.098, max_rt: 9614.788, 148|13961.462, 14|693.510, 13|10215.984, 15|9836.256
 110, trx: 916, 95%: 648.333, 99%: 839.439, max_rt: 1853.894, 924|14653.528, 92|311.375, 86|5385.129, 92|2132.058
 120, trx: 813, 95%: 1812.811, 99%: 4692.094, max_rt: 5101.852, 804|10732.737, 82|401.510, 85|6312.344, 80|5579.595
这类信息,每 10 秒产生一条输出,返回结果以逗号分隔后,共可以分为 6 列,
  • 每 10 秒为一个区间进行输出。
  • 该时间区间内成功执行的事务
  • 95% 事务的响应时间
  • 99% 事务的响应时间
  • 事务的最大响应时间
  • 订单支付、查询订单、发货、查询库存

结果

<Raw Results>
  [0] sc:0 lt:8184  rt:0  fl:0 avg_rt: 986.1 (5)
  [1] sc:0 lt:8159  rt:0  fl:0 avg_rt: 5308.2 (5)
  [2] sc:119 lt:699  rt:0  fl:0 avg_rt: 88.4 (5)
  [3] sc:0 lt:815  rt:0  fl:0 avg_rt: 4473.7 (80)
  [4] sc:0 lt:815  rt:0  fl:0 avg_rt: 2794.0 (20)
 in 120 sec.

<Raw Results2(sum ver.)>
  [0] sc:0  lt:8184  rt:0  fl:0
  [1] sc:0  lt:8184  rt:0  fl:0
  [2] sc:119  lt:699  rt:0  fl:0
  [3] sc:0  lt:815  rt:0  fl:0
  [4] sc:0  lt:815  rt:0  fl:0
会有两次测试结果 Raw ResultRaw Result2
从第一行到最后一行,依次对应 新订单支付订单查询发货库存
  • sc: 成功操作
  • lt: 延时操作
  • rt: 重试操作
  • fl: 失败操作
  • avg_rt: 平均重试操作

统计

<Constraint Check> (all must be [OK])
 [transaction percentage]
        Payment: 43.42% (>=43.0%) [OK]
   Order-Status: 4.35% (>= 4.0%) [OK]
       Delivery: 4.34% (>= 4.0%) [OK]
    Stock-Level: 4.34% (>= 4.0%) [OK]
 [response time (at least 90% passed)]
      New-Order: 0.00%  [NG] *
        Payment: 0.00%  [NG] *
   Order-Status: 14.55%  [NG] *
       Delivery: 0.00%  [NG] *
    Stock-Level: 0.00%  [NG] *
  • 事务百分比,大于基准值会显示 OK
  • 响应时间,大于 90% 会显示 OK

Tpm

<TpmC>
                 4092.000 TpmC
Tpm 是 Transactions per minute 的缩写,C 指的是执行 TPC-C 基准测试。 TpmC 这项指标为整体性能指标,表示每分钟事务数,代表了本系统每分钟能够处理的订单数量。
TPCC - MySQL 公式
f = (float)(success[0] + late[0]) * 60.0 / (float)((measure_time / PRINT_INTERVAL) * PRINT_INTERVAL);
 

© chobit blog 2025