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