Skip to content

1.pgbench简介

PostgreSQL自带一款轻量级的压力测试工具:pgbench。pgbench是一种在PostgreSQL上运行基准测试的简单程序。它可以在并发的数据库会话中一遍一遍地运行相同的SQL命令

1.1安装方法

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
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

2.测试指标

2.1 只读QPS

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

2.2 读写QPS

数据库读写时每秒执行的SQL数(含insert、select、update)

3.测试步骤

3.1修改配置文件

本文以PostgreSQL10.0 版本为例,需要修改主备实例上的postgresql.auto.conf文件

sql
vacuum_cost_delay = 0 
bgwriter_delay = 10ms
bgwriter_lru_maxpages = 1000
bgwriter_lru_multiplier = 10.0
effective_io_concurrency = 0
max_worker_processes = 128
max_parallel_workers_per_gather = 0
synchronous_commit = off
wal_compression = on
wal_writer_delay = 10ms
wal_writer_flush_after = 1MB
checkpoint_timeout = 30min
max_wal_size = 64GB    # 1/2 当前PG实例的规格内存 
min_wal_size = 16GB    # 1/8 当前PG实例的规格内存 
checkpoint_completion_target = 0.2
hot_standby_feedback = off
random_page_cost = 1.1
log_checkpoints = on
log_statement = 'ddl'
log_autovacuum_min_duration = 0
autovacuum_freeze_max_age = 1500000000
autovacuum_multixact_freeze_max_age = 1600000000
autovacuum_vacuum_cost_delay = 0ms
vacuum_freeze_table_age = 1450000000
vacuum_multixact_freeze_table_age = 1450000000
log_min_duration_statement=5s
vacuum_cost_delay = 0 
bgwriter_delay = 10ms
bgwriter_lru_maxpages = 1000
bgwriter_lru_multiplier = 10.0
effective_io_concurrency = 0
max_worker_processes = 128
max_parallel_workers_per_gather = 0
synchronous_commit = off
wal_compression = on
wal_writer_delay = 10ms
wal_writer_flush_after = 1MB
checkpoint_timeout = 30min
max_wal_size = 64GB    # 1/2 当前PG实例的规格内存 
min_wal_size = 16GB    # 1/8 当前PG实例的规格内存 
checkpoint_completion_target = 0.2
hot_standby_feedback = off
random_page_cost = 1.1
log_checkpoints = on
log_statement = 'ddl'
log_autovacuum_min_duration = 0
autovacuum_freeze_max_age = 1500000000
autovacuum_multixact_freeze_max_age = 1600000000
autovacuum_vacuum_cost_delay = 0ms
vacuum_freeze_table_age = 1450000000
vacuum_multixact_freeze_table_age = 1450000000
log_min_duration_statement=5s

重启pg实例

3.2根据目标库大小初始化测试数据

具体命令如下

  • 初始化数据50亿:pgbench -i -s 50000
  • 初始化数据10亿:pgbench -i -s 10000
  • 初始化数据5亿:pgbench -i -s 5000
  • 初始化数据1亿:pgbench -i -s 1000

3.3配置环境变量

export PGHOST=<PostgreSQL实例内网地址>
export PGPORT=<PostgreSQL实例端口>
export PGDATABASE=postgres
export PGUSER=<PostgreSQL数据库用户名>
export PGPASSWORD=<PostgreSQL对应用户的密码>
export PGHOST=<PostgreSQL实例内网地址>
export PGPORT=<PostgreSQL实例端口>
export PGDATABASE=postgres
export PGUSER=<PostgreSQL数据库用户名>
export PGPASSWORD=<PostgreSQL对应用户的密码>

3.4创建只读和读写的测试脚本

3.4.1创建只读脚本ro.sql

\set aid random_gaussian(1, :range, 10.0)
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
\set aid random_gaussian(1, :range, 10.0)
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;

3.4.2创建读写脚本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;
\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.命令测试

4.1只读测试

只读测试

rds.pg.st.h43,总数据量50亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=100000000

rds.pg.st.h43,总数据量50亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=500000000

rds.pg.st.h43,总数据量50亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=1000000000

rds.pg.st.h43,总数据量50亿,热数据50亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=5000000000

pg.x4.4xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000

pg.x4.4xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000

pg.x4.4xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000

pg.x8.2xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000

pg.x8.2xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000

pg.x8.2xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000

pg.x8.xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000

pg.x8.xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000

pg.x8.xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000

pg.x8.large.2,总数据量5亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000

pg.x8.large.2,总数据量5亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=500000000

pg.x8.medium.2,总数据量1亿,热数据5000万

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000

pg.x8.medium.2,总数据量1亿,热数据1亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=100000000
rds.pg.st.h43,总数据量50亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=100000000

rds.pg.st.h43,总数据量50亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=500000000

rds.pg.st.h43,总数据量50亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=1000000000

rds.pg.st.h43,总数据量50亿,热数据50亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=5000000000

pg.x4.4xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000

pg.x4.4xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000

pg.x4.4xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000

pg.x8.2xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000

pg.x8.2xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000

pg.x8.2xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000

pg.x8.xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000

pg.x8.xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000

pg.x8.xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000

pg.x8.large.2,总数据量5亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000

pg.x8.large.2,总数据量5亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=500000000

pg.x8.medium.2,总数据量1亿,热数据5000万

pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000

pg.x8.medium.2,总数据量1亿,热数据1亿

pgbench -M prepared -n -r -P 1 -f ./ro.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=100000000

读写测试

rds.pg.st.h43,总数据量50亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=100000000

rds.pg.st.h43,总数据量50亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=500000000

rds.pg.st.h43,总数据量50亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=1000000000

rds.pg.st.h43,总数据量50亿,热数据50亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=5000000000

pg.x4.4xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000

pg.x4.4xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000

pg.x4.4xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000

pg.x8.2xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000

pg.x8.2xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000

pg.x8.2xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000

pg.x8.xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000

pg.x8.xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000

pg.x8.xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000

pg.x8.large.2,总数据量5亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000

pg.x8.large.2,总数据量5亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=500000000

pg.x8.medium.2,总数据量1亿,热数据5000万

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000

pg.x8.medium.2,总数据量1亿,热数据1亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=100000000
rds.pg.st.h43,总数据量50亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=100000000

rds.pg.st.h43,总数据量50亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=500000000

rds.pg.st.h43,总数据量50亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=1000000000

rds.pg.st.h43,总数据量50亿,热数据50亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 240 -j 240 -T 120 -D scale=50000 -D range=5000000000

pg.x4.4xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=100000000

pg.x4.4xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=500000000

pg.x4.4xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 128 -j 128 -T 120 -D scale=10000 -D range=1000000000

pg.x8.2xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=100000000

pg.x8.2xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000

pg.x8.2xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000

pg.x8.xlarge.2,总数据量10亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=100000000

pg.x8.xlarge.2,总数据量10亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000

pg.x8.xlarge.2,总数据量10亿,热数据10亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000

pg.x8.large.2,总数据量5亿,热数据1亿

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=100000000

pg.x8.large.2,总数据量5亿,热数据5亿

pgbench -M prepared -n -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=500000000

pg.x8.medium.2,总数据量1亿,热数据5000万

pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 8 -j 8 -T 120 -D scale=1000 -D range=50000000

pg.x8.medium.2,总数据量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:表示测试连接数,测试连接数不代表该规格的最大连接数,最大连接数