行业知识
【TPC-C】TPC-C标准化基准测试设计RDBMS的相关表结构
目录
1. TPC-C的初步认识
1.1 TPC的概念
1.2 TPC-C 的概念
1.3 TPC-C 的事务处理
2. TPC-C的逻辑数据库设计
2.1 业务及应用环境
2.2 数据库实体、关系和特征
2.3 表布局
3. TPC-C表结构的sqlite语句实现
3.1 创建数据库表,共9个表
3.2 创建索引和外键
3.3 删除的约束
4. TPCC-MySQL
4.1 TPCC-MySQL简介
4.2 操作步骤
a. 构建二进制文件
b. 加载数据
c. 开始基准测试
4.3 结果分析
a. 官网示例说明
b. 本文示例说明
参考链接
1. TPC-C的初步认识
1.1 TPC的概念
TPC 是事务处理性能委员会组织,该委员会致力于制定和维护一系列标准化的基准测试,以评估商业计算系统的性能。其中最著名的是一系列用于评估计算机系统性能的基准测试。
以下是TPC组织使用的一些标准:
-
TPC-C: 用于评估在线事务处理(OLTP)系统的性能,模拟了一个批发商环境中的典型业务场景,包括订单处理、库存管理等操作。
-
TPC-H: 用于评估数据仓库系统的性能,模拟了一个典型的决策支持系统环境,包括复杂的查询和报表操作。
-
TPC-DI: 用于评估数据仓库系统的性能,模拟了一个典型的决策支持系统环境,包括数据加载、查询等操作。
-
TPC-DS: 用于评估数据仓库系统的性能,模拟了一个典型的决策支持系统环境,包括复杂的查询操作、数据加载等。
-
TPCx-BB: 用于评估大数据系统的性能,包括数据加载、复杂查询等操作。
除了这些基准测试之外,TPC组织还制定了一些其他标准,用于规范化基准测试的执行和报告,以确保测试的公正性、可重复性和可比性。
1.2 TPC-C 的概念
官网传送门:TPC-C 官网
说明书获取传送门:TPC Current Specs
- 描述:TPC-C【即TPC Benchm ark™ C】 是一个用于衡量OLTP(在线事务处理)工作负载性能的基准测试,是行业中公认的权威和最为复杂的在线事务处理基准测试
- 目标:是模拟一个具有高并发、复杂事务的在线事务处理系统,评估计算机系统处理并发事务的能力。
- 特点:TPC-C 通过模拟仓库和订单管理系统,模拟大量并发的短期交易【主要模拟了一个批发供应商的订单处理环境,包括同时执行支付、订单状态查询、交付、库存查询时每分钟生成的新增订单事务数量。测试基于具有多个终端用户并发访问数据库的场景】,测试广泛的数据库功能,包括查询、更新和 mini-batch事务(队列式小批量事务)。
- 指标:TPC-C 测试的主要指标是每分钟订单交易数量(NOPM),以及每分钟的交易量(TPM)
- 测试业务模型:测试用到的模型是一个大型的批发销售公司,在地理分布的多个区域有业务,并且使用仓库管理。当业务扩展的时候,公司将添加新的仓库。每个仓库负责十个区域的供货,每个区域为3000个客户服务。每个仓库维护公司销售的100,000种商品的库存纪录。下图描述了公司,仓库,地区和客户之间的层次关系【详见 章节2.1】
1.3 TPC-C 的事务处理
TPC-C标准测试模拟了五种不同类型的事务处理【原文70页】。这些事务处理分别是:
-
New Order Transaction(新订单事务): 模拟了一个客户下订单的过程,包括检查库存、生成订单、更新库存等操作。
事务内容:订单中每个订单行的平均数量必须在9.5到10.5的范围内,并且每个订单的订单行数量必须在5到15之间均匀分布,用于在测量间隔期间提交到系统的新订单交易【原文75页】
主要特点:中量级、读写频繁、要求响应快.
-
Payment Transaction(支付事务): 模拟了客户支付订单的过程,包括处理支付、更新客户的账户余额等操作。
事务内容:对于任意一个客户端,从固定的仓库随机选取一个辖区及其内用
户,采用随机的金额支付一笔订单,并作相应历史纪录.
主要特点:轻量级,读写频繁,要求响应快
-
Order Status Transaction(订单状态事务): 允许客户查询其最近一笔订单的状态,包括订单的发货状态、付款状态等信息。
事务内容:对于任意一个客户端,从固定的仓库随机选取一个辖区及其内用
户,读取其最后一条订单,显示订单内每件商品的状态.
主要特点:中量级,只读频率低,要求响应快
-
Delivery Transaction(交付事务): 模拟了处理订单交付的过程,包括更新订单状态、更新交付日期等操作。
事务内容:对于任意一个客户端,随机选取一个发货包,更新被处理订单的用
户余额,并把该订单从新订单中删除.
主要特点:1-10 个批量,读写频率低,较宽松的响应时间
-
Stock Level Transaction(库存水平事务): 允许客户查询某个仓库的库存水平,包括检查某个商品的库存数量等信息。
事物内容:对于任意一个客户端,从固定的仓库和辖区随机选取最后 20 条订单,查看订单中所有的货物的库存,计算并显示所有库存低于随机生成域值的商品数量.
主要特点:重量级,只读频率低,较宽松的响应时间.
TPC-C标准中规定的各类事务响应时间【原文72页】:
响应时间是指终端响应的时间(确认事务已排队),而不是事务本身的执行时间。至少90%的事务必须在排队后的80秒内完成(参见第2.7.2.2条款)。
目前常用的开源TPC-C基准测试工具有mysql-tpcc 、 HammerDB 、Benchmarksql 等。
-
mysql-tpcc: mysql-tpcc是一个针对MySQL数据库的TPC-C基准测试工具,主要用于评估MySQL数据库在OLTP工作负载下的性能表现。
-
HammerDB: HammerDB是一个通用的数据库基准测试工具,支持多种数据库系统,包括MySQL、PostgreSQL、Oracle等。它提供了丰富的功能和灵活的配置选项,可以模拟复杂的OLTP和OLAP工作负载。HammerDB还提供了直观的图形界面和详细的性能指标报告,方便用户进行性能分析和优化。
-
Benchmarksql: Benchmarksql是一个针对多种关系型数据库系统的基准测试工具,包括MySQL、PostgreSQL、Oracle等。它基于Java开发,使用简单,具有良好的跨平台性。
但这些开源TPC-C基准测试工具中,目前没有专门支持SQLite数据库的...
2. TPC-C的逻辑数据库设计
2.1 业务及应用环境
以下图示展示了TPC-C业务环境中的仓库 warehouse、销售区域 district 和客户的层次结构。
官网原文:
The company portrayed by the benchmark is a wholesale supplier with a number of geographically distributed sales districts and associated warehouses. As the company's business expands, new warehouses and associated sales districts are created. Each regional warehouse covers 10 districts. Each district serves 3,000 customers. All warehouses maintain stocks for the 100,000 items sold by the company. The following diagram illustrates the warehouse, district, and customer hierarchy of TPC-C's business environment.
解释:
基准测试中描述的公司 company 是一家批发供应商,具有多个地理分布的销售区域 district 和关联仓库 warehouse。随着公司业务的扩展,将创建新的仓库和相应的销售区域。每个区域性仓库 warehouses 覆盖 10 个销售区域 district,每个销售区域 district 为 3k 名客户提供服务。所有仓库 warehouses 都储备公司销售的10万种商品。
2.2 数据库实体、关系和特征
官网原文:
The components of the TPC-C database are defined to consist of nine separate and inpidual tables. The relationships among these tables are defined in the entity-relationship diagram shown below and are subject to the rules specified in Clause 1.4.
解释:
TPC-C数据库的组件被定义为由九个单独且独立的表组成。这些表之间的关系在下面显示的实体-关系图中定义,并受到第1.4条规定的规则的约束。
说明:
图中9个实体对应了TPC-C测试中9个数据表,也对应批发模型中参与的对象。Warehouse是仓库,District是区域,每个Warehouse为10个区域提供商品批发,Customer是客户,每个区域有3千个客户,每个客户会产生至少1个订单,每个订单又分为New-Order和Order-line两部分,New-Order是用来标示订单是否为新订单,在完成订单的发货操作后,New-Order中的记录将被删除,Order-line是订单中进行批发的商品订购流水,每个订单有5到10个交易商品。Stock是用来记录Warehouse的库存情况,Item是记录Warehouse中所存储的商品。
其中:
- W代表仓库数
- 框中的数字表示该表将存放的记录条数,K代表1000
- 仓库数的调整在测试中能够体现数据库所能支持的数据规模的能力。
- 表间的数字表示表数据的父子关系之间儿子的个数
- +号表示个数可能更多。
- 每个 Warehouse 的数据量,其大小约为 76823.04KB,可以有小量的变化,因为测试过程中将会插入或删除现有记录。可以根据每个Warehouse的数据量,计算测试过程中的数据总量。计算公式为:数据总量(KB)≈ Warehouse个数*76823.04KB。
以10个Warehouse的数据量为例计算其数据总量大小约为:768230.4KB
官方说明:
- 所有数字均用于说明数据库的填充要求(参见第4.3条款Clause 4.3)。
- 实体块中的数字表示表的基数(行数)。这些数字会乘以W,即仓库的数量,以说明数据库的扩展情况(参见第4条款)。
- 在关系箭头旁边的数字表示关系的基数(每个父项的平均子项数)。
- 加号(+)符号用于表示关系或表的基数之后,以说明该数字在初始数据库填充期间可能会略有变化,因为行被添加或删除(参见第5.5条款)。
2.3 表布局
五种事务涉及所对应的表:
New-Order:新订单,主要对应 new_orders 表
Payment:支付,主要对应 orders、history 表
Order-Status:订单状态,主要对应 orders、order_line 表
Delivery:发货,主要对应 order_line 表
Stock-Level:库存,主要对应 stock 表
下面的官网指令无论怎么改都会报错,建议直接看“补充”内容往下走。
./tpcc_load -h 127.0.0.1 -d tpcc1000 -u root -p "your_root_password" -w 10# |hostname:port| |dbname| |user| |password| |仓库|
补充:
如果加载数据遇到下面内容:
解决方法:新建一个用户tpcc,密码设置成tpcc去执行这个指令
# 1.登录MySQL服务器:使用具有足够权限的用户(例如root用户)登录MySQL服务器mysql -u root -p# 2.创建新用户tpcc,密码为tpccCREATE USER 'tpcc'@'%' IDENTIFIED BY 'tpcc';# 说明:这个命令创建了一个名为tpcc的用户,可以从任何主机(%)连接,密码为tpcc。如果希望只允许从特定主机连接,可以将'%'替换为特定的主机名或IP地址# 3.授予权限:为tpcc用户授予适当的权限,这里授予其在tpcc1000数据库上的全部权限GRANT ALL PRIVILEGES ON tpcc1000.* TO 'tpcc'@'%';# 4.刷新权限,以使新授权生效。FLUSH PRIVILEGES;# 5.退出MySQL命令行界面exit;
现在再次执行:
./tpcc_load -h 127.0.0.1 -d tpcc1000 -u tpcc -p "tpcc" -w 10
下面就开始加载数据了:
指令会创建10个 warsehouse,加载完成后显示如下:
造数据成功后,会提示:…DATA LOADING COMPLETED SUCCESSFULLY.
另外可以使用下面指令查看帮助:
./tpcc_load --help
4.2 并发加载数据【选择了4.1 就跳过这一步 】
选择a:官网原始的并发加载文件【使用 load.sh 并发加载数据,亲测无效,该项目太久没维护了(2016年之前的老项目了)】,这里选择并发加载10个warsehouse
./load.sh tpcc1000 10
造数据成功后,会提示:…DATA LOADING COMPLETED SUCCESSFULLY.
选择b:GitHub上另一个并行加载脚本: https://gist.github.com/sh2/3458844
根据实际情况情况修改用户名、密码、数据库名,初始仓库为10个。
在tpcc_mysql 路径下创建sh文件:
vim tpcc_load_parallel.sh
由于最新版本tpcc_load使用方法需要显示使用参数,修改脚本内容参考如下:
#!/bin/bash# ConfigrationMYSQL=/usr/bin/mysqlTPCCLOAD=./tpcc_loadTABLESQL=./create_table.sqlCONSTRAINTSQL=./add_fkey_idx.sqlDEGREE=`getconf _NPROCESSORS_ONLN`SERVER=localhostDATABASE=tpccUSER=tpccPASS=tpccWAREHOUSE=10# Loadset -e$MYSQL -u $USER -p$PASS -e "DROP DATABASE IF EXISTS $DATABASE"$MYSQL -u $USER -p$PASS -e "CREATE DATABASE $DATABASE"$MYSQL -u $USER -p$PASS $DATABASE /dev/nullset +eSTATUS=0trap 'STATUS=1; kill 0' INT TERMfor ((WID = 1; WID /dev/null # customer, history $TPCCLOAD -h $SERVER -d $DATABASE -u $USER -p $PASS -w $WAREHOUSE 3 -m $WID -n $WID > /dev/null # orders, new_orders, order_line $TPCCLOAD -h $SERVER -d $DATABASE -u $USER -p $PASS -w $WAREHOUSE 4 -m $WID -n $WID > /dev/null ) & PIDLIST=(${PIDLIST[@]} $!) if [ $((WID % DEGREE)) -eq 0 ]; then for PID in ${PIDLIST[@]}; do wait $PID if [ $? -ne 0 ]; then STATUS=1 fi done if [ $STATUS -ne 0 ]; then exit $STATUS fi PIDLIST=() fidonefor PID in ${PIDLIST[@]}; do wait $PID if [ $? -ne 0 ]; then STATUS=1 fidoneif [ $STATUS -eq 0 ]; then echo 'Completed.'fiexit $STATUS后续执行即可。
c. 开始基准测试
tpcc_start工具用于tpcc压测,基础测试指令也要根据自己建立的内容进行修改,比如仓库-w建了10个,那么这里-w后面就接10
# 开始基准测试./tpcc_start -h 127.0.0.1 -P 3306 -d tpcc1000 -u tpcc -p "tpcc" -w 10 -c 32 -r 10 -l 20# |主机名| |端口| |dbname| |用户| |仓库| |连接| |预热时间| |基准时间|
示例参数说明:
# 指令模板./tpcc_start -h 127.0.0.1 -P3306 -dtpcc1000 -uroot -p "your_password" -w100 -c10 -r100 -l300 -i20****************************************** ###easy### TPC-C Load Generator ******************************************option h with value '127.0.0.1'option p with value '3306'option d with value 'tpcc1000' //创建的数据库名option u with value 'root' //创建的用户option p with value 'your_password' //自己的密码option w with value '100' //仓库数,必须和tpcc_load一致option c with value '10' //连接数,可认为是线程数option r with value '10' //预热时间,以秒为单位,默认10秒,主要是为了将数据加载到内存;option l with value '300' //测试执行时间,以秒为单位,默认是20秒;option i with value '20' //产生报告的时间间隔,默认是10秒 [server]: 127.0.0.1 [port]: 3306 [DBname]: tpcc1000 [user]: root [pass]: 123123 [warehouse]: 10 [connection]: 10 [rampup]: 100 (sec.) [measure]: 300 (sec.)
4.3 结果分析
a. 官网示例说明
使用定义的间隔(-i 选项),该工具将生成以下输出:
10, trx: 12920, 95%: 9.483, 99%: 18.738, max_rt: 213.169, 12919|98.778, 1292|101.096, 1293|443.955, 1293|670.842 20, trx: 12666, 95%: 7.074, 99%: 15.578, max_rt: 53.733, 12668|50.420, 1267|35.846, 1266|58.292, 1267|37.421 30, trx: 13269, 95%: 6.806, 99%: 13.126, max_rt: 41.425, 13267|27.968, 1327|32.242, 1327|40.529, 1327|29.580 40, trx: 12721, 95%: 7.265, 99%: 15.223, max_rt: 60.368, 12721|42.837, 1271|34.567, 1272|64.284, 1272|22.947 50, trx: 12573, 95%: 7.185, 99%: 14.624, max_rt: 48.607, 12573|45.345, 1258|41.104, 1258|54.022, 1257|26.626
解释如下:- 10 - 从基准测试开始的秒数
- trx: 12920 - 在给定的时间间隔内(在本例中为前 10 秒)执行的新订单交易。基本上,这是每个间隔的吞吐量。越多越好
- 95%: 9.483: - 每个给定时间间隔内新订单交易的 95% 响应时间。在本例中为 9.483 秒
- 99%: 18.738: - 每个给定时间间隔内新订单交易的 99% 响应时间。在本例中为 18.738 秒
- max_rt: 213.169: - 每个给定时间间隔内新订单交易的最大响应时间。在本例中为 213.169 秒
- 其余部分:是其他类型事务的吞吐量和最大响应时间,可以忽略不计12919|98.778, 1292|101.096, 1293|443.955, 1293|670.842
b. 本文示例说明
按照 4.2 的tpcc压测会弹出下面内容:
图中的第一部分就是 章节4.2.c 的参数说明。
图中的第二部分就是 章节4.3.a 的官网说明。
图中的第三部分说明:汇总了各种业务各状态的数据量
[0] sc:0 lt:1052 rt:0 fl:0 avg_rt: 440.4 (5) [1] sc:0 lt:1053 rt:0 fl:0 avg_rt: 193.7 (5) [2] sc:8 lt:97 rt:0 fl:0 avg_rt: 71.0 (5) [3] sc:0 lt:104 rt:0 fl:0 avg_rt: 1270.6 (80) [4] sc:0 lt:104 rt:0 fl:0 avg_rt: 1477.3 (20) in 20 sec. [0] sc:0 lt:1052 rt:0 fl:0 [1] sc:0 lt:1053 rt:0 fl:0 [2] sc:8 lt:97 rt:0 fl:0 [3] sc:0 lt:104 rt:0 fl:0 [4] sc:0 lt:104 rt:0 fl:0
这段内容提供了对TPC-C基准测试的原始结果进行了分析。分析如下:
Raw Results:
- [0]: 这个事务类型的提交计数(sc)为0,事务数量(lt)为1052,响应时间(rt)为0,失败数量(fl)为0,平均响应时间(avg_rt)为440.4毫秒,括号中的数字5表示有5个并发线程执行此类事务。
- [1]: 类似地,第二种类型的事务提交计数为0,事务数量为1053,响应时间为0,失败数量为0,平均响应时间为193.7毫秒,同样有5个并发线程执行此类事务。
- [2]: 这个事务类型的提交计数为8,事务数量为97,响应时间为0,失败数量为0,平均响应时间为71.0毫秒,同样有5个并发线程执行此类事务。
- [3]: 第四种事务类型的提交计数为0,事务数量为104,响应时间为0,失败数量为0,平均响应时间为1270.6毫秒,有80个并发线程执行此类事务。
- [4]: 最后一种事务类型的提交计数为0,事务数量为104,响应时间为0,失败数量为0,平均响应时间为1477.3毫秒,有20个并发线程执行此类事务。
- in 20 sec.: 这些结果是在20秒内收集的。
Raw Results2 (sum ver.):
这部分提供了原始结果的汇总版本,将所有并发线程的统计信息总结在一起。每个条目表示所有并发线程的总和。这些总和与Raw Results中的详细统计信息对应。
这些结果显示了每种事务类型的性能指标,包括提交计数、事务数量、失败数量和平均响应时间。
第四部分:
(all must be [OK]) [transaction percentage] Payment: 43.55% (>=43.0%) [OK] Order-Status: 4.34% (>= 4.0%) [OK] Delivery: 4.30% (>= 4.0%) [OK] Stock-Level: 4.30% (>= 4.0%) [OK] [response time (at least 90% passed)] New-Order: 0.00% [NG] * Payment: 0.00% [NG] * Order-Status: 7.62% [NG] * Delivery: 0.00% [NG] * Stock-Level: 0.00% [NG] * 3156.000 TpmC
这段内容提供了对TPC-C基准测试的约束检查和TPM-C(Transactions Per Minute - C)指标的分析,分析如下:
约束检查 (Constraint Check):
- [transaction percentage]: 这部分检查了每种事务类型在总事务中所占的百分比是否达到了预期的阈值。例如,Payment事务类型的百分比达到了43.55%,超过了预期的43.0%,因此通过了约束检查。
Payment: 43.55% (>=43.0%) [OK]
- [response time (at least 90% passed)]: 这部分检查了每种事务类型的响应时间是否至少有90%的事务通过了某个阈值。例如,New-Order事务类型的响应时间没有达到90%通过的要求,因此未通过约束检查。
New-Order: 0.00% [NG] *
- 在每种事务类型下,还列出了其它事务类型的类似检查结果,以及通过或未通过的状态。
TPM-C (Transactions Per Minute - C):
- TPM-C指标显示了在测试期间每分钟处理的事务数量。在这个例子中,TPM-C为3156.000 TpmC,表示在测试期间平均每分钟处理了3156笔TPC-C事务。
综上,约束检查部分提供了对每种事务类型的性能和负载情况的分析,而TPM-C指标则提供了整体性能的度量。
参考链接
- TPCC-MySQL 的安装与使用 - 奇妙的 Linux 世界 (hi-linux.com)
- tpcc-mysql安装、使用、结果解读 – iMySQL | 老叶茶馆
- tpcc-mysql运行结果解读 - Rogn - 博客园 (cnblogs.com)
- TPM-C指标显示了在测试期间每分钟处理的事务数量。在这个例子中,TPM-C为3156.000 TpmC,表示在测试期间平均每分钟处理了3156笔TPC-C事务。
- [transaction percentage]: 这部分检查了每种事务类型在总事务中所占的百分比是否达到了预期的阈值。例如,Payment事务类型的百分比达到了43.55%,超过了预期的43.0%,因此通过了约束检查。
-