本文介绍测试RDS PPAS实例性能的步骤。

  1. 在测试前需要提交工单申请,修改PPAS实例参数,本文以PPAS 10版本为例,需要修改主备实例上的postgresql.auto.conf文件。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    edb_redwood_date = on
    edb_redwood_greatest_least = on
    edb_redwood_strings = on
    edb_redwood_raw_names = on
    edb_stmt_level_tx = off
    db_dialect = 'redwood'
    optimizer_mode = choose
    edb_early_lock_release = on
    datestyle = 'iso, ymd'
    default_with_oids = off   
    default_with_rowids = off 
    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 当前PPAS实例的规格内存
    min_wal_size = 16GB    # 1/8 当前PPAS实例的规格内存
    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. 修改配置后,重启PPAS实例让配置生效。
  3. 根据目标库大小初始化测试数据,具体命令如下:
    • 初始化数据50亿:pgbench -i -s 50000
    • 初始化数据10亿:pgbench -i -s 10000
    • 初始化数据5亿:pgbench -i -s 5000
    • 初始化数据1亿:pgbench -i -s 1000
  4. 通过以下命令配置环境变量:
    1
    2
    3
    4
    5
    export PGHOST=<PPAS实例内网地址>
    export PGPORT=<PPAS实例端口>
    export PGDATABASE=postgres
    export PGUSER=<PPAS数据库用户名>
    export PGPASSWORD=<PPAS对应用户的密码>
  5. 创建只读和读写的测试脚本。
    • 创建只读脚本ro.sql内容如下:
      1
      2
      \set aid random_gaussian(1, :range, 10.0)
      SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
    • 创建读写脚本rw.sql内容如下:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      \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. 使用如下命令测试:
    • 只读测试:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      rds.ppas.st.h43,总数据量50亿,热数据1亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 480 -j 480 -T 120 -D scale=50000 -D range=100000000
       
      rds.ppas.st.h43,总数据量50亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 480 -j 480 -T 120 -D scale=50000 -D range=500000000
       
      rds.ppas.st.h43,总数据量50亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 480 -j 480 -T 120 -D scale=50000 -D range=1000000000
       
      rds.ppas.st.h43,总数据量50亿,热数据50亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 480 -j 480 -T 120 -D scale=50000 -D range=5000000000
       
      ppas.x8.4xlarge.2,总数据量10亿,热数据1亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=100000000
       
      ppas.x8.4xlarge.2,总数据量10亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=500000000
       
      ppas.x8.4xlarge.2,总数据量10亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=1000000000
       
      ppas.x4.4xlarge.2,总数据量10亿,热数据1亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=100000000
       
      ppas.x4.4xlarge.2,总数据量10亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=500000000
       
      ppas.x4.4xlarge.2,总数据量10亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=1000000000
       
      ppas.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
       
      ppas.x8.2xlarge.2,总数据量10亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000
       
      ppas.x8.2xlarge.2,总数据量10亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000
       
      ppas.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
       
      ppas.x8.xlarge.2,总数据量10亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000
       
      ppas.x8.xlarge.2,总数据量10亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000
       
      ppas.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
       
      ppas.x8.large.2,总数据量5亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./ro.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=500000000
    • 读写测试:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      rds.ppas.st.h43,总数据量50亿,热数据1亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 480 -j 480 -T 120 -D scale=50000 -D range=100000000
       
      rds.ppas.st.h43,总数据量50亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 480 -j 480 -T 120 -D scale=50000 -D range=500000000
       
      rds.ppas.st.h43,总数据量50亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 480 -j 480 -T 120 -D scale=50000 -D range=1000000000
       
      rds.ppas.st.h43,总数据量50亿,热数据50亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 480 -j 480 -T 120 -D scale=50000 -D range=5000000000
       
      ppas.x8.4xlarge.2,总数据量10亿,热数据1亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=100000000
       
      ppas.x8.4xlarge.2,总数据量10亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=500000000
       
      ppas.x8.4xlarge.2,总数据量10亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=1000000000
       
      ppas.x4.4xlarge.2,总数据量10亿,热数据1亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=100000000
       
      ppas.x4.4xlarge.2,总数据量10亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=500000000
       
      ppas.x4.4xlarge.2,总数据量10亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 320 -j 320 -T 120 -D scale=10000 -D range=1000000000
       
      ppas.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
       
      ppas.x8.2xlarge.2,总数据量10亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=500000000
       
      ppas.x8.2xlarge.2,总数据量10亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 64 -j 64 -T 120 -D scale=10000 -D range=1000000000
       
      ppas.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
       
      ppas.x8.xlarge.2,总数据量10亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=500000000
       
      ppas.x8.xlarge.2,总数据量10亿,热数据10亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 32 -j 32 -T 120 -D scale=10000 -D range=1000000000
       
      ppas.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
       
      ppas.x8.large.2,总数据量5亿,热数据5亿
       
      pgbench -M prepared -v -r -P 1 -f ./rw.sql -c 16 -j 16 -T 120 -D scale=5000 -D range=500000000
    说明
    • scale乘以10万:表示测试数据量。
    • range:表示活跃数据量。
    • -c:表示测试连接数,测试连接数不代表该规格的最大连接数,最大连接数请参见主实例规格列表