1 前言
AnalyticDB for PostgreSQL 6.0 (简称ADBPG6.0)在事务处理性能上相比上个版本ADBPG4.3有了质的飞跃,本文将以TPC-B业界标准事务性能测试benchmark来展示ADBPG6.0在事务上的处理能力。
2 TPC-B简介
TPC-B是由TPC(Transaction Processing Performance Council,事务处理性能委员会)提供的benchmark,主要用于衡量一个系统每秒能够处理的并发事务数。TPC-B不像TPC-C那样模拟了现实生活中一个具体的交易场景,其中的事务都是由简单SQL构成的没有语义的事务(事务中混杂了大表与小表的插入、更新与查询操作),而且每个client的请求间也不会像TPC-C那样会有一个human think time的间隔时间,而是一旦前一个事务执行完成,立马会有下一个事务请求发出。因此,TPC-B经常用于对数据库系统的事务性能压测。
TPC-B性能的衡量指标是每秒处理的事务数量,即TPS(Transactions per Second)。
3 测试环境
3.1 测试数据
使用PostgreSQL提供的开源工具pgbench来生成TPC-B的测试数据,填充因子为100,比例因子为11424。因此,最后TPC-B各个表的数据量如下:
表名 | 数据量(行数) |
---|---|
pgbench_accounts | 1142400000 |
pgbench_branches | 11424 |
pgbench_history | 0 |
pgbench_tellers | 114240 |
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中),在上面运行pgbench工具来生成TPC-B负载,向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的性能结果,结果如下图所示,其中横坐标代表不同的并发数,纵坐标代表测试性能(单位为TPS,transactions per second)。除了对ADBPG的TPC-B的性能测试之外,还使用pgbench对只读、只更新和只插入进行了测试。从下面的测试性能结果图中可以看出,ADBPG的TPC-B峰值性能可以达到 5923.833804 TPS,只读峰值性能为 150084.180541 TPS, 只更新峰值性能为31023.373105 TPS,只插入的峰值性能为60367.182157TPS。
- TPC-B性能
- 只读性能
- 只更新性能
- 只插入性能
5 如何使用pgbench进行ADBPG的TPC-B测试
5.1 工具下载安装
有两种方式对pgbench工具进行安装:
- 源码安装:下载开源数据库PostgreSQL源码,然后到pgbench对应的目录中单独对pgbench进行编译生成可执行的二进制文件。
- 二进制安装:可以先直接yum install postgresql-server来安装PostgreSQL程序,此过程会自动安装pgbench工具。
5.2 数据生成加载
执行如下命令,会自动将数据生成加载到ADBPG实例中
# 其中-F参数就是上文说的装填因子,-s值得是比例因子
./pgbench -i -F 100 -s 11424 -p port -h con_addr -U user_name db_name
5.3 执行测试
- 执行TPC-B负载
# -c指定了连接数据库client数量,-j指定了建立连接使用的线程数量,推荐将两者设置成一样
# -T指定了测试执行时间,单位为秒
./pgbench -h con_addr -p port -r -n -c 96 -j 96 -T 120 -f all.sql -U user_name db_name
其中all.sql为TPC-B负载,其内容如下:
\set scale 11424
\set nbranches 1 * :scale
\set ntellers 10 * :scale
\set naccounts 100000 * :scale
\setrandom aid 1 :naccounts
\setrandom bid 1 :nbranches
\setrandom tid 1 :ntellers
\setrandom delta -5000 5000
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;
UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);
END;
- 执行只读负载
# -c指定了连接数据库client数量,-j指定了建立连接使用的线程数量,推荐将两者设置成一样
# -T指定了测试执行时间,单位为秒
./pgbench -h con_addr -p port -r -n -c 96 -j 96 -T 120 -f select.sql -U user_name db_name
其中select.sql为只读负载,其内容如下:
\set scale 11424
--\set scale 1
\set naccounts 100000 * :scale
\setrandom aid 1 :naccounts
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
- 执行只更新负载
# -c指定了连接数据库client数量,-j指定了建立连接使用的线程数量,推荐将两者设置成一样
# -T指定了测试执行时间,单位为秒
./pgbench -h con_addr -p port -r -n -c 96 -j 96 -T 120 -f update.sql -U user_name db_name
其中update.sql为只更新负载,其内容如下:
\set scale 11424
\set naccounts 100000 * :scale
\setrandom aid 1 :naccounts
\setrandom delta -5000 5000
UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;
- 执行只插入负载
# -c指定了连接数据库client数量,-j指定了建立连接使用的线程数量,推荐将两者设置成一样
# -T指定了测试执行时间,单位为秒
./pgbench -h con_addr -p port -r -n -c 96 -j 96 -T 120 -f insert.sql -U user_name db_name
其中insert.sql为只插入负载,其内容如下:
\set scale 11424
\set nbranches 1 * :scale
\set ntellers 10 * :scale
\set naccounts 100000 * :scale
\setrandom aid 1 :naccounts
\setrandom bid 1 :nbranches
\setrandom tid 1 :ntellers
\setrandom delta -5000 5000
INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);