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參數支援在控制台修改。設定叢集參數的方式,請參見設定叢集參數。修改配置參數後,重啟叢集讓配置生效。
測試方法
- 通過以下命令配置環境變數:
export PGHOST=<PolarDB叢集地址的私網地址> export PGPORT=<PolarDB叢集地址的私網連接埠> export PGDATABASE=postgres export PGUSER=<PolarDB資料庫使用者名稱> export PGPASSWORD=<PolarDB對應使用者的密碼>
說明 如何查看PolarDB PostgreSQL版(相容Oracle)叢集的串連地址,請參見查看串連地址和連接埠。 - 根據目標庫大小初始化測試資料,具體命令如下:
- 初始化資料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
- 初始化資料10億:
- 建立唯讀和讀寫的測試指令碼。
- 建立唯讀指令碼ro.sql:
- 在命令列執行
vim ro.sql
命令。 - 按I鍵進入編輯頁面。
- 在編輯頁面輸入如下內容:
\set aid random_gaussian(1, :range, 10.0) SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
- 按Esc鍵退出編輯,輸入
:wq
進行儲存並退出。
- 在命令列執行
- 建立讀寫指令碼rw.sql:
- 在命令列執行
vim rw.sql
命令。 - 按I鍵進入編輯頁面。
- 在編輯頁面輸入如下內容:
\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;
- 按Esc鍵退出編輯,輸入
:wq
進行儲存並退出。
- 在命令列執行
- 建立唯讀指令碼ro.sql:
- 在命令列執行如下命令測試:
- 唯讀測試:
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.40 | 263746.37 |
5億 | 601262.24 | 247352.76 | ||
10億 | 589405.79 | 218788.92 | ||
polar.o.x8.8xlarge 64核 512 GB | 10億 | 1億 | 592064.65 | 227352.23 |
5億 | 554777.11 | 213343.13 | ||
10億 | 508404.07 | 203331.35 | ||
polar.o.x8.4xlarge 32核 256 GB | 10億 | 1億 | 522182.92 | 213212.34 |
5億 | 509372.85 | 203322.34 | ||
10億 | 489349.72 | 198531.37 | ||
polar.o.x8.2xlarge 16核 128 GB | 10億 | 1億 | 263893.72 | 152863.27 |
5億 | 250221.62 | 129238.26 | ||
10億 | 239832.62 | 106212.82 | ||
polar.o.x8.xlarge 8核 64 GB | 10億 | 1億 | 142836.56 | 69725.29 |
5億 | 133931.69 | 55927.65 | ||
10億 | 124151.02 | 50786.21 | ||
polar.o.x4.xlarge 8核 32 GB | 10億 | 1億 | 126748.07 | 59738.33 |
5億 | 113432.32 | 48372.25 | ||
10億 | 104232.84 | 49763.64 | ||
polar.o.x4.large 4核 16 GB | 5億 | 5000萬 | 76238.89 | 47388.27 |
1億 | 69892.83 | 43638.85 | ||
polar.o.x4.medium 2核 8 GB | 1億 | 5000萬 | 28320.70 | 18152.63 |
1億 | 30792.19 | 19111.15 |
說明
- 規格:PolarDB PostgreSQL版(相容Oracle)的規格代碼。
- 測試資料量:本輪測試資料的記錄條數。
- 熱(活躍)資料量:本輪測試的查詢、更新SQL的記錄條數。
- 唯讀QPS:唯讀測試的結果,表示每秒請求數。
- 讀寫QPS:讀寫測試的結果,表示每秒請求數。