PostgreSQL自带一款轻量级的压力测试工具pgbench。pgbench是一种在PostgreSQL上运行基准测试的简单程序,它可以在并发的数据库会话中重复运行相同的SQL命令。本文介绍如何使用pgbench测试PolarDB PostgreSQL版集群的最大性能。

测试环境

  • 所有测试均在华北1(青岛)地域完成,PolarDB集群和ECS实例在同一可用区。
  • ECS的实例规格:ecs.g5.16xlarge(64核 256 GiB)。
  • ECS存储规格:SSD本地盘200 GiB。
  • 网络类型:专有网络(VPC),PolarDB集群和ECS实例在同一VPC。
  • 操作系统:CentOS 7.6 x64。
  • PolarDB集群节点数:1个主节点和1个只读节点。
说明 CentOS 6不支持PostgreSQL 11。

测试指标

  • 只读QPS

    数据库只读时每秒执行的SQL数(仅包含SELECT)。

  • 读写QPS

    数据库读写时每秒执行的SQL数(包含INSERT、SELECT、UPDATE)。

准备工作

  • 安装测试工具
    执行如下命令在ECS实例中安装PostgreSQL 11。
    yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    yum install -y postgresql11
  • 修改集群参数
    PolarDB集群需要修改的配置参数如下:
    log_statement = 'none'
    enable_hashjoin=off
    enable_mergejoin=off
    enable_bitmapscan=off
    说明 目前仅log_statement参数支持在控制台修改。设置集群参数的方式,请参见设置集群参数

    修改配置参数后,重启集群让配置生效。

测试方法

  1. 通过以下命令配置环境变量:
    export PGHOST=<PolarDB集群地址的私网地址>
    export PGPORT=<PolarDB集群地址的私网端口>
    export PGDATABASE=postgres
    export PGUSER=<PolarDB数据库用户名>
    export PGPASSWORD=<PolarDB对应用户的密码>
    说明 如何查看PolarDB PostgreSQL版集群的连接地址,请参见查看集群地址
  2. 根据目标库大小初始化测试数据,具体命令如下:
    • 初始化数据10亿:
      /usr/pgsql-11/bin/pgbench -i -s 10000
    • 初始化数据5亿:
      /usr/pgsql-11/bin/pgbench -i -s 5000
    • 初始化数据1亿:
      /usr/pgsql-11/bin/pgbench -i -s 1000
  3. 创建只读和读写的测试脚本。
    • 创建只读脚本ro.sql
      1. 在命令行执行vim ro.sql命令。
      2. 按I键进入编辑页面。
      3. 在编辑页面输入如下内容:
        \set aid random_gaussian(1, :range, 10.0)
        SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
      4. 按Esc键退出编辑,输入:wq进行保存并退出。
    • 创建读写脚本rw.sql
      1. 在命令行执行vim rw.sql命令。
      2. 按I键进入编辑页面。
      3. 在编辑页面输入如下内容:
        \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;
      4. 按Esc键退出编辑,输入:wq进行保存并退出。
  4. 在命令行执行如下命令测试:
    • 只读测试:
      88C 710 GB(polar.pg.x8.12xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=1000000000
      
      64C 512 GB(polar.pg.x8.8xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 256 -j 256 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 256 -j 128 -T 120 -D scale=10000 -D range=1000000000
      
      32C 256 GB(polar.pg.x8.4xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000
      
      16C 128 GB(polar.pg.x8.2xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000
      
      8C 64 GB(polar.pg.x8.xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=1000000000
      
      8C 32 GB(polar.pg.x4.xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 32 -T 120 -D scale=10000 -D range=1000000000
      
      4C 16 GB(polar.pg.x4.large)
      总数据量5亿,热数据5000万
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=50000000
      总数据量5亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000
      
      2C 8 GB(polar.pg.x4.medium)
      总数据量1亿,热数据5000万
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 32 -T 120 -D scale=1000 -D range=50000000
      总数据量1亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 32 -T 120 -D scale=1000 -D range=100000000
    • 读写测试:
      88C 710 GB(polar.pg.x8.12xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000
      
      64C 512 GB(polar.pg.x8.8xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000
      
      32C 256 GB(polar.pg.x8.4xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000
      
      16C 128 GB(polar.pg.x8.2xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000
      
      8C 64 GB(polar.pg.x8.xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000
      
      8C 32 GB(polar.pg.x4.xlarge)
      总数据量10亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000
      总数据量10亿,热数据5亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000
      总数据量10亿,热数据10亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000
      
      4C 16 GB(polar.pg.x4.large)
      总数据量5亿,热数据5000万
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=50000000
      总数据量5亿,热数据1亿
      /usr/pgsql-11/bin/pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000
      
      2C 8 GB(polar.pg.x4.medium)
      总数据量1亿,热数据5000万
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000
      总数据量1亿,热数据1亿
      /usr/pgsql-11/bin/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.pg.x8.12xlarge

88核 710 GB

10亿1亿628863.87259862.37
5亿612612.86243871.65
10亿607162.83217592.26

polar.pg.x8.8xlarge

64核 512 GB

10亿1亿587612.46227352.23
5亿539371.54209782.29
10亿498728.28199821.76

polar.pg.x8.4xlarge

32核 256 GB

10亿1亿487138.21237280.67
5亿442339.25215081.79
10亿420348.28198341.34

polar.pg.x8.2xlarge

16核 128 GB

10亿1亿269781.83168612.27
5亿249271.32131725.26
10亿233219.96109826.82

polar.pg.x8.xlarge

8核 64 GB

10亿1亿148621.3871787.83
5亿130862.8659298.44
10亿123151.9052324.72

polar.pg.x4.xlarge

8核 32 GB

10亿1亿137366.9259738.33
5亿114932.6452873.87
10亿109248.2948993.82

polar.pg.x4.large

4核 16 GB

5亿5000万67289.7640221.21
1亿78393.5646281.85

polar.pg.x4.medium

2核 8 GB

1亿5000万26383.9118983.55
1亿27821.4917986.46
说明
  • 规格:PolarDB PostgreSQL版的规格代码。
  • 测试数据量:本轮测试数据的记录条数。
  • 热(活跃)数据量:本轮测试的查询、更新SQL的记录条数。
  • 只读QPS:只读测试的结果,表示每秒请求数。
  • 读写QPS:读写测试的结果,表示每秒请求数。
4c8g4c16g8c32g8c64g16c128g32c256g64c512g88c710g