PolarDB兼容Oracle语法引擎性能白皮书
本文档介绍如何使用pgbench测试PolarDB兼容Oracle语法引擎数据库集群主节点的最大性能。
PostgreSQL自带一款轻量级的压力测试工具pgbench。pgbench是一种在PostgreSQL(兼容Oracle)上运行基准测试的简单程序,它可以在并发的数据库会话中重复运行相同的SQL命令。
测试环境
- 所有测试均在本地测试完成(使用IP+端口)。
- ECS的实例规格:ecs.g5.16xlarge(64核 256GiB)
- 网络类型:专有网络
- 操作系统:CentOS 7.6 x64
说明 CentOS 6不支持PostgreSQL 11。
测试指标
- 只读QPS
数据库只读时每秒执行的SQL数(仅包含SELECT)。
- 读写QPS
数据库读写时每秒执行的SQL数(包含INSERT、SELECT、UPDATE)。
准备工作
- 安装测试工具
执行如下命令在ECS实例中安装PostgreSQL 11。
yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm yum install -y https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm yum install -y postgresql11* su - postgres vi .bash_profile export PS1="$USER@`/bin/hostname -s`-> " export LANG=en_US.utf8 export PGHOME=/usr/pgsql-11 export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH export DATE=`date +"%Y%m%d%H%M"` export PATH=$PGHOME/bin:$PATH:. export MANPATH=$PGHOME/share/man:$MANPATH alias rm='rm -i' alias ll='ls -lh' unalias vi
- 修改集群参数
由于部分参数无法在控制台直接修改,您需要提交工单申请,修改PolarDB兼容Oracle语法引擎数据库集群的yaml配置文件如下:
default_statistics_target: "100" max_wal_size: "64GB" #half mem size effective_cache_size: "96GB" #3/4 mem size max_parallel_workers_per_gather: "16" #half cpu core number maintenance_work_mem: "2GB" #1/32 mem, don't exceed 8GB checkpoint_completion_target: "0.9" max_parallel_workers: "32" #cpu core number,don't exceed 64 max_prepared_transactions: "2100" archive_mode: "off" work_mem: "64MB" #mem 1/2000,don't exceed 128MB wal_buffers: "16MB" min_wal_size: "64GB" #1/4 mem size, min size 3GB (3 wal files, 2 as preallocated) shared_buffers: "192GB" #75% mem size 8GB max_connections: "12900" polar_bulk_extend_size: "4MB" polar_xlog_record_buffers: "25GB" #10~15% mem size,min size 1GB hot_standby_feedback: "on" full_page_writes: "off" synchronous_commit: "on" polar_enable_async_pwrite: "off" polar_parallel_bgwriter_delay: "10ms" polar_max_non_super_conns: '12800' polar_parallel_new_bgwriter_threshold_lag: "6GB" polar_use_statistical_relpages: "on" polar_vfs.enable_file_size_cache: "on"
说明 以规格为polar.o.x8.4xlarge(32核 256GB)的集群为例修改配置文件,同时为了和RDS对比,修改内存和RDS for PostgreSQL相同。修改配置后,重启集群让配置生效。
测试方法
- 根据目标库大小初始化测试数据,具体命令如下:
- 初始化数据50亿:
pgbench -i -s 50000
- 初始化数据10亿:
pgbench -i -s 10000
- 初始化数据5亿:
pgbench -i -s 5000
- 初始化数据1亿:
pgbench -i -s 1000
- 初始化数据50亿:
- 通过以下命令配置环境变量:
export PGHOST=<Oracle集群主节点私网地址> export PGPORT=<Oracle集群主节点私网端口> export PGDATABASE=postgres export PGUSER=<Oracle数据库用户名> export PGPASSWORD=<Oracle对应用户的密码>
- 创建只读和读写的测试脚本。
- 创建只读脚本ro.sql内容如下:
\set aid random_gaussian(1, :range, 10.0) SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
- 创建读写脚本rw.sql内容如下:
\set aid random_gaussian(1, :range, 10.0) \set bid random(1, 1 * :scale) \set tid random(1, 10 * :scale) \set delta random(-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;
- 创建只读脚本ro.sql内容如下:
- 使用如下命令测试。
- 只读测试:
polar.o.x8.4xlarge,总数据量10亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 polar.o.x8.4xlarge,总数据量10亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 polar.o.x8.4xlarge,总数据量10亿,热数据10亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 polar.o.x8.2xlarge,总数据量10亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 polar.o.x8.2xlarge,总数据量10亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 polar.o.x8.2xlarge,总数据量10亿,热数据10亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 polar.o.x8.xlarge,总数据量10亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 64 -T 120 -D scale=10000 -D range=100000000 polar.o.x8.xlarge,总数据量10亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 64 -T 120 -D scale=10000 -D range=500000000 polar.o.x8.xlarge,总数据量10亿,热数据10亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 64 -T 120 -D scale=10000 -D range=1000000000 polar.o.x4.xlarge,总数据量10亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000 polar.o.x4.xlarge,总数据量10亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000 polar.o.x4.xlarge,总数据量10亿,热数据10亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000 polar.o.x4.large,总数据量5亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000 polar.o.x4.large,总数据量5亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=500000000 polar.o.x4.medium,总数据量1亿,热数据5000万 pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000 polar.o.x4.medium,总数据量1亿,热数据1亿 pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=100000000
- 读写测试:
polar.o.x8.4xlarge,总数据量10亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000 polar.o.x8.4xlarge,总数据量10亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000 polar.o.x8.4xlarge,总数据量10亿,热数据10亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000 polar.o.x8.2xlarge,总数据量10亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000 polar.o.x8.2xlarge,总数据量10亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000 polar.o.x8.2xlarge,总数据量10亿,热数据10亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000 polar.o.x8.xlarge,总数据量10亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 64 -T 120 -D scale=10000 -D range=100000000 polar.o.x8.xlarge,总数据量10亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 64 -T 120 -D scale=10000 -D range=500000000 polar.o.x8.xlarge,总数据量10亿,热数据10亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 64 -T 120 -D scale=10000 -D range=1000000000 polar.o.x4.xlarge,总数据量10亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000 polar.o.x4.xlarge,总数据量10亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000 polar.o.x4.xlarge,总数据量10亿,热数据10亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000 polar.o.x4.large,总数据量5亿,热数据1亿 pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000 polar.o.x4.large,总数据量5亿,热数据5亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=500000000 polar.o.x4.medium,总数据量1亿,热数据5000万 pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000 polar.o.x4.medium,总数据量1亿,热数据1亿 pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=100000000
说明- scale乘以10万:表示测试数据量。
- range:表示活跃数据量。
- -c:表示测试连接数,测试连接数不代表该规格的最大连接数,最大连接数请参考规格与定价。
- 只读测试:
测试结果
规格 | 测试数据量 | 热(活跃)数据量 | 只读QPS | 读写QPS |
---|---|---|---|---|
polar.o.x8.4xlarge 32核 256G |
10亿 | 1亿 | 522160 | 274270 |
polar.o.x8.4xlarge 32核 128G |
10亿 | 5亿 | 514143 | 262859 |
polar.o.x8.4xlarge 32核 128G |
10亿 | 10亿 | 493321 | 249679 |
polar.o.x8.2xlarge 16核 128G |
10亿 | 1亿 | 256998 | 145386 |
polar.o.x8.2xlarge 16核 128G |
10亿 | 5亿 | 253937 | 123806 |
polar.o.x8.2xlarge 16核 128G |
10亿 | 10亿 | 243326 | 107800 |
polar.o.x8.xlarge 8核 64G |
10亿 | 1亿 | 159323 | 66792 |
polar.o.x8.xlarge 8核 64G |
10亿 | 5亿 | 155498 | 54070 |
polar.o.x8.xlarge 8核 64G |
10亿 | 10亿 | 152735 | 54456 |
polar.o.x4.xlarge 8核 32G |
10亿 | 1亿 | 129323 | 59738 |
polar.o.x4.xlarge 8核 32G |
10亿 | 5亿 | 115498 | 49924 |
polar.o.x4.xlarge 8核 32G |
10亿 | 10亿 | 102735 | 47946 |
polar.o.x4.large 4核 16G |
5亿 | 1亿 | 75729 | 45242 |
polar.o.x4.large 4核 16G |
5亿 | 5亿 | 63818 | 40308 |
polar.o.x4.medium 2核 8G |
1亿 | 5000万 | 34386 | 19886 |
polar.o.x4.medium 2核 8G |
1亿 | 1亿 | 33752 | 18242 |
说明
- 规格:PolarDB兼容Oracle语法引擎的规格代码(提工单调整内存和RDS for PostgreSQL相同)。
- 测试数据量:本轮测试数据的记录条数。
- 热(活跃)数据量:本轮测试的查询、更新SQL的记录条数。
- 只读QPS:只读测试的结果,表示每秒请求数。
- 读写QPS:读写测试的结果,表示每秒请求数。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论