全部產品
Search
文件中心

PolarDB:效能白皮書

更新時間:Jul 06, 2024

PostgreSQL內建一款輕量級的壓力測試工具pgbench。pgbench是一種在PostgreSQL(相容Oracle)上運行基準測試的簡單程式,它可以在並發的資料庫會話中重複運行相同的SQL命令。本文介紹如何使用pgbench測試PolarDB PostgreSQL版(相容Oracle)叢集的最大效能。

測試環境

  • 所有測試均在華北1(青島)地區完成,PolarDB叢集和ECS執行個體在同一可用性區域。
  • ECS的執行個體規格:ecs.g5.16xlarge(64核 256 GiB)。
  • ECS儲存規格:SSD本地碟200 GiB。
  • 網路類型:Virtual Private Cloud,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。
    sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo 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版(相容Oracle)叢集的串連地址,請參見查看串連地址和連接埠
  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.o.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.o.x8.8xlarge)
      總資料量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
      
      32C 256 GB(polar.o.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
      
      16cC 128 GB(polar.o.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.o.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.o.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.o.x4.large)
      總資料量5億,熱資料5000萬
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -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 32 -j 32 -T 120 -D scale=5000 -D range=100000000
      
      2C 4 GB(polar.o.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.o.x8.12xlarge)
      總資料量10億,熱資料1億
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.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 ./rw.sql -c 256 -j 256 -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 256 -j 256 -T 120 -D scale=10000 -D range=1000000000
      
      64C 512 GB(polar.o.x8.8xlarge)
      總資料量10億,熱資料1億
      /usr/pgsql-11/bin/pgbench -M prepared -v -r -P 1 -f ./rw.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 ./rw.sql -c 256 -j 256 -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 256 -j 256 -T 120 -D scale=10000 -D range=1000000000
      
      32C 256 GB(polar.o.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.o.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.o.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.o.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.o.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.o.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.o.x8.12xlarge

88核 710 GB

10億1億630650.40263746.37
5億601262.24247352.76
10億589405.79218788.92

polar.o.x8.8xlarge

64核 512 GB

10億1億592064.65227352.23
5億554777.11213343.13
10億508404.07203331.35

polar.o.x8.4xlarge

32核 256 GB

10億1億522182.92213212.34
5億509372.85203322.34
10億489349.72198531.37

polar.o.x8.2xlarge

16核 128 GB

10億1億263893.72152863.27
5億250221.62129238.26
10億239832.62106212.82

polar.o.x8.xlarge

8核 64 GB

10億1億142836.5669725.29
5億133931.6955927.65
10億124151.0250786.21

polar.o.x4.xlarge

8核 32 GB

10億1億126748.0759738.33
5億113432.3248372.25
10億104232.8449763.64

polar.o.x4.large

4核 16 GB

5億5000萬76238.8947388.27
1億69892.8343638.85

polar.o.x4.medium

2核 8 GB

1億5000萬28320.7018152.63
1億30792.1919111.15
說明
  • 規格:PolarDB PostgreSQL版(相容Oracle)的規格代碼。
  • 測試資料量:本輪測試資料的記錄條數。
  • 熱(活躍)資料量:本輪測試的查詢、更新SQL的記錄條數。
  • 唯讀QPS:唯讀測試的結果,表示每秒請求數。
  • 讀寫QPS:讀寫測試的結果,表示每秒請求數。
2c8g4c16g8c32g8c64g16c128g32c256g64c512g88c710g