AnalyticDB for PostgreSQL TPC-C性能测试

1 前言

AnalyticDB for PostgreSQL 6.0 (简称ADBPG6.0)在事务处理性能上相比上个版本ADBPG4.3有了质的飞跃,本文将以TPC-C业界标准事务性能测试benchmark来展示ADBPG6.0在事务上的处理能力。

2 TPC-C简介

TPC-C是由TPC(Transaction Processing Performance Council,事务处理性能委员会)提供的专门针对联机交易处理系统的规范,TPC-C模拟的是一个大型的商品批发销售公司交易负载。这个事务负载主要由9张表组成,主要涉及5类交易类型:新订单生成(New-Order)、订单支付(Payment)、发货(Delivery)、订单状态查询(Order-Status)、和库存状态查询(Stock-Level)。

TPC-C测试使用吞吐量指标(Transaction per minute,简称tpmC)来衡量系统的性能,其中所统计的事务指的是新订单生成的事务,即以每分钟新订单生成的事务数来衡量系统的性能指标(在标准的TPC-C测试中,新订单的事务数量占总事务数的45%左右)。

3 测试环境

3.1 测试数据

使用开源的benchmarksql工具生成1000个warehouse的数据集,各个表的数据量如下表所示:

表名 数据量(行数)
bmsql_warehouse 1000
bmsql_district 10000
bmsql_customer 30000000
bmsql_history 30000000
bmsql_new_order 9000000
bmsql_oorder 30000000
bmsql_order_line 299976737
bmsql_item 100000
bmsql_stock 100000000

3.2 测试集群

测试的ADBPG6.0集群由16个计算节点,每个计算节点有4个CPU核,32GB内存,存储类型为高性能SSD,具体规格选用参考:https://help.aliyun.com/document_detail/35406.html?spm=a2c4g.11174283.6.548.146c7605Xo9w3A

另外在同一个域里面建了一个ECS(放在与测试ADBPG实例相同的VPC中),然后在这个ECS上运行benchmarksql工具来生成TPC-C负载,向ADBPG实例发送请求。

3.3 集群配置参数

要获取极致的TP性能,需要对以下集群参数进行修改。其中有些参数用户无法自行设置,请联系ADBPG值班人员进行修改。

参数 说明
set optimizer = off 关闭ADBPG针对AP场景的orca优化器,对TP性能更友好。
set shared_buffers = 8GB 将ADBPG的数据共享缓存调大。
修改该参数需要重启实例。
set wal_buffers = 256MB 将ADBPG的WAL日志缓存调大。
修改该参数需要重启实例。
set log_statement = none 将日志输出关闭。
set random_page_cost = 10 将随机访问代价开销调小,有利于查询走索引
set gp_resqueue_priority = off
set resource_scheduler = off 
将ADBPG的resource queue关闭。
需要重启实例

4 测试结果

测试在不同并发度情况下,ADBPG6.0的性能结果,结果如下图所示,其中横坐标代表不同的并发数,纵坐标代表TPC-C性能(单位为tpmC),从图中可以看到,ADBPG6.0的峰值性能可以达到 101231.3 tpmC。

AnalyticDB for PostgreSQL TPC-C性能测试

5 如何使用benchmarksql进行ADBPG的TPC-C测试

5.1 工具下载

使用ADBPG提供的benchmarksql,相比于开源版本,差异在于:1、由于ADBPG是分布式数据库,在建表语句时指定了分布键,一方面可以使得数据分布更加均匀,另一方面使得两阶段事务涉及计算节点数更少一遍减少通信开销。2、修复了在生成csv数据集的时候,数据字段与建表字段不匹配的问题。

5.2 数据生成加载

5.2.1 生成数据

使用如下命令可以生成TPC-C中各个表的csv数据,然后可以使用COPY方式将数据加载到数据库中。

// 执行benchmarksql的如下脚本, 其中gpdb.properties为配置文件
./runLoader.sh adbpg.properties
// 在执行前,需要修改gpdb.properties中的如下内容
warehouses=1000 // 指定生成数据集warehouse的数量
loadWorkers=16  // 指定生成数据的线程数量,如果CPU core和内存够用可以将其大小调大,这样速度更快
fileLocation=/data/tpcc_1000w/ // 指定生成数据的存储目录

5.2.2 数据加载

  • 建表

执行benchmarksql工具提供的tableCreates.sql脚本

  • 数据加载

使用copy命令将上节中生成的csv数据导入到ADBPG对应的表中

执行benchmarksql工具提供的indexCreates.sql脚本

  • 执行analyze

数据加载完并创建好索引后,需要对所有表执行analyze,以便ADBPG的优化器能做出好的执行计划

5.3 执行测试

// 执行benchmarksql的如下脚本, 其中gpdb.properties为配置文件
./runBenchmark.sh adbpg.properties
// 在执行前,需要修改gpdb.properties中的如下内容
db=postgres // 使用默认的postgres
driver=org.postgresql.Driver // 使用默认的org.postgresql.Drive
conn=jdbc:postgresql://xxxxx.xxxx.xxxx.rds.aliyuncs.com:3432/benchmarksql #adbpg实例连接地址
user=tpcc_test // 连接adbpg实例测试的用户
password=your_password // 对应用户的密码
terminals=128 // TPC-C测试的并发数
//To run specified transactions per terminal- runMins must equal zero
runTxnsPerTerminal=0 // 使用默认的0
//To run for specified minutes- runTxnsPerTerminal must equal zero
runMins=10 // TPC-C执行时间,单位分钟
//Number of total transactions per minute
limitTxnsPerMin=30000000 // 使用默认的30000000
// 下面配置各个事务的比重,也使用如下给定的默认值
//The following five values must add up to 100
//The default percentages of 45, 43, 4, 4 & 4 match the TPC-C spec
newOrderWeight=45
paymentWeight=43
orderStatusWeight=4
deliveryWeight=4
stockLevelWeight=4

运行上面的脚本后,就会在屏幕上实时输出数据库当前处理的事务总数,等运行完runMins指定的时间后,屏幕就会输出如下所示的数据库TPC-C性能的tpmC数值:
Term-00, Running Average tpmTOTAL: 225114.24    Current tpmTOTAL: 7445652    Memory Usage: 116MB / 168MB
18:28:56,388 [Thread-127] INFO   jTPCC : Term-00,
18:28:56,388 [Thread-127] INFO   jTPCC : Term-00,
18:28:56,388 [Thread-127] INFO   jTPCC : Term-00, Measured tpmC (NewOrders) = 101231.33
18:28:56,388 [Thread-127] INFO   jTPCC : Term-00, Measured tpmTOTAL = 224908.14
18:28:56,388 [Thread-127] INFO   jTPCC : Term-00, Session Start     = 2020-02-24 18:23:56
18:28:56,388 [Thread-127] INFO   jTPCC : Term-00, Session End       = 2020-02-24 18:28:56
18:28:56,388 [Thread-127] INFO   jTPCC : Term-00, Transaction Count = 1125698