全部产品
云市场

DRDS TPC-C 测试说明

更新时间:2019-09-24 10:54:11

TPC-C 说明

TPC-C 是业界常用的的一套 benchmark,由 TPC 委员会制定发布,用于评测数据库的联机交易处理(偏向OLTP能力)。主要涉及10张表,包含五类业务事务模型(NewOrder – 新订单的生成、Payment – 订单付款、OrderStatus – 最近订单查询、Delivery – 配送、StockLevel – 库存缺货状态分析)。

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

测试设计

  1. 普通实例测试结果主要基于1000 warehouse,其中主要的表数据量如下:bmsql_order_line 3亿行,bmsql_stock 1亿行、bmsql_customer / bmsql_history / bmsql_oorder 各自有3000万行。
  2. 为了验证 DRDS 的水平扩展能力,引入了超大规格实例的 TPC-C 测试,相比于普通实例扩展了近10倍的资源。在超大规格压测设计上,构建了1万 warehouse,同时 TPC-C 施压机需要增加到3台 32 Core 的 ECS 机器,避免压测本身成为了瓶颈点

测试结果

  • 企业版测试环境:DRDS 企业版 32 Core 128 GB(单节点 16 Core 64 GB) + 4 台 RDS MySQL 5.7 实例(8 Core 32 GB 独享型)
  • 标准版测试环境:DRDS 标准版 16 Core 64 GB(单节点 8 Core 32 GB)+ 4 台 RDS MySQL 5.7 实例(4 Core 32 GB 独享型)
  • 超大规格测试环境:DRDS 企业版 256 Core 1024 GB (单节点 16 Core 64 GB) + 12台 RDS MySQL 5.7 实例 (32 Core 128 GB 独享型)
并发度 标准版实例 tpmC 企业版实例 tpmC 超大规格实例 tpmC
1个客户端 * 1000并发 65,735.14 101,620.8 /
6个客户端 * 1000并发 / / 821,547.97

4

如何运行 TPC-C 测试?

Step 1. 准备压力机 ECS

首先准备一个 ECS,这是以下所有操作的基础,准备数据、运行压测等都用的是这台机器。

  • 建议选择 VPC 网络,经典网络有可能遇到 RDS 某些规格没有库存。记住这个 VPC 的 ID 和名称,之后我们所有的东西都部署在这个 VPC 里面

Step 2. 准备压测用的 DRDS

创建 DRDS 实例以及相应的 RDS 实例,注意要和 ECS 放在同一个 VPC 中,并在DRDS中创建一个待压测的库,比如 tpcc 库

Step3. 压测数据准备

step3.1 准备压测工具

本文使用开源的 BenchmarkSQL 5.0 作为 TPC-C 测试。

PS:benchmarksql默认不支持mysql协议,需要进行工具改造适配一下,具体可以参考:https://www.jianshu.com/p/622545cb1341

可以通过附件下载改造好的压测包【tpcc.tar.gz】,并解压到tpcc目录

  1. mkdir tpcc
  2. tar zxvf tpcc.tar.gz -C tpcc

修改附录:

  1. src/client/jTPCC.java (增加一下mysqltype)
  2. src/client/jTPCCConnection.java (支持一下mysql的语法,加一个别名)
  3. src/LoadData/LoadData.java (关闭loader数据时的大事务机制)
  4. src/LoadData/LoadDataWorker.java (关闭loader数据时的大事务机制)
  5. run/funcs.sh (脚本增加一个mysqltype)
  6. run/runDatabaseBuild.sh (去掉不必要的阶段)
  7. run/runBenchmark.sh (调整默认jvm参数)
  8. run/runLoader.sh (调整默认jvm参数)
  9. run/sql.common/foreignKeys.sql (注释全部外键创建,DRDS不支持外键)
  10. run/sql.common/indexCreates.sql (注释掉全部主键创建,只留2个索引创建,MySQL默认在建表时直接创建索引)
  11. run/sql.common/indexDrops.sql (注释全部主键删除)
  12. run/sql.common/tableCreates.sql (添加主键和拆分键,DRDS需要指定拆分键)

step3.2 准备压测配置

在tpcc/run目录下创建props.mysql文件

  1. // --------- env config --------- //
  2. db=mysql
  3. driver=com.mysql.jdbc.Driver
  4. conn=jdbc:mysql://drdsxxxx:3306/tpcc
  5. user=tpcc
  6. password=tpcc
  7. // warehouse 数量
  8. warehouses=1000
  9. // 导入数据的并发数,每100并发预计产生2万TPS,可以结合目标TPS能力调整并发
  10. // runLoader.sh的jvm内存,100并发默认为4GB,500并发建议设置为16G
  11. loadWorkers=100
  12. // TPC-C 压测并发数
  13. terminals=1000
  14. // 压测时间,单位分钟
  15. runMins=10
  16. // ---------- default config ------- //
  17. //To run specified transactions per terminal- runMins must equal zero
  18. runTxnsPerTerminal=0
  19. //Number of total transactions per minute
  20. limitTxnsPerMin=0
  21. //Set to true to run in 4.x compatible mode. Set to false to use the
  22. //entire configured database evenly.
  23. terminalWarehouseFixed=true
  24. //The following five values must add up to 100
  25. //The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
  26. newOrderWeight=45
  27. paymentWeight=43
  28. orderStatusWeight=4
  29. deliveryWeight=4
  30. stockLevelWeight=4
  31. // Directory name to create for collecting detailed result data.
  32. // Comment this out to suppress.
  33. resultDirectory=my_result_%tY-%tm-%td_%tH%tM%tS
  34. // osCollectorScript=./misc/os_collector_linux.py
  35. // osCollectorInterval=1
  36. // osCollectorSSHAddr=user@dbhost
  37. // osCollectorDevices=net_eth0 blk_sda

配置说明:

  • 导入压测数据,需要关注 warehouses (仓库数) 和 loadWorkers (并发数)
  • TPC-C压测时,需要关注 terminals (并发数) 和 runMins (运行时间)

step3.3 压测执行

  • 准备压测数据 (1000 warehouse)
  1. cd tpcc/run
  2. nohup ./runDatabaseBuild.sh props.mysql &

默认100并发导入,总共5亿多记录,整体导入时间在小时级别,建议通过nohup推到后台运行,避免ssh命令行断开导致导入中断。

  • 运行TPC-C测试
  1. cd tpcc/run
  2. ./runBenchmark.sh props.mysql

运行之后可以看到测试结果,对应的tpmC就是最终的压测指标

  1. 08:56:16,844 [Thread-883] INFO jTPCC : Term-00, Measured tpmC (NewOrders) = 104230.88
  2. 08:56:16,844 [Thread-883] INFO jTPCC : Term-00, Measured tpmTOTAL = 231664.49
  3. 08:56:16,844 [Thread-883] INFO jTPCC : Term-00, Session Start = 2019-09-19 08:54:16
  4. 08:56:16,845 [Thread-883] INFO jTPCC : Term-00, Session End = 2019-09-19 08:56:16
  5. 08:56:16,845 [Thread-883] INFO jTPCC : Term-00, Transaction Count = 465440
  • 清理压测数据
  1. cd tpcc/run
  2. ./runDatabaseDestroy.sh props.mysql