1. 在测试前需要提交工单申请,修改PostgreSQL实例参数,本文以PostgreSQL10.0 版本为例,需要修改主备实例上的postgresql.auto.conf文件。
    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
  2. 修改配置后,重启PostgreSQL实例让配置生效。
  3. 根据目标库大小初始化测试数据,具体命令如下。
    • 初始化数据50亿:pgbench -i -s 50000
    • 初始化数据10亿:pgbench -i -s 10000
    • 初始化数据5亿:pgbench -i -s 5000
    • 初始化数据1亿:pgbench -i -s 1000
  4. 通过以下命令配置环境变量:
    export PGHOST=<PostgreSQL实例内网地址>
    export PGPORT=<PostgreSQL实例端口>
    export PGDATABASE=postgres
    export PGUSER=<PostgreSQL数据库用户名>
    export PGPASSWORD=<PostgreSQL对应用户的密码>
  5. 创建只读和读写的测试脚本。
    • 创建只读脚本ro.sql内容如下:
      \set aid random_gaussian(1, :range, 10.0)
      SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
    • 创建读写脚本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;
  6. 使用如下命令测试。
    • 只读测试:
      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
    说明
    • scale乘以10万:表示测试数据量。
    • range:表示活跃数据量。
    • -c:表示测试连接数,测试连接数不代表该规格的最大连接数,最大连接数请参考实例规格表