使用sysbench测试阿里云RDS PostgreSQL性能

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 测试PostgreSQL数据库性能的方法很多,例如pgbench, sysbench。sysbench因为使用lua脚本编程,支持多线程,灵活度更高,测试复杂的业务逻辑建议用sysbench。pgbench其实也很好,纯C写的,本身的开销小,测高并发低延迟的场景建议用pgbench。 首先要购

测试PostgreSQL数据库性能的方法很多,例如pgbench, sysbench。
sysbench因为使用lua脚本编程,支持多线程,灵活度更高,测试复杂的业务逻辑建议用sysbench。
pgbench其实也很好,纯C写的,本身的开销小,测高并发低延迟的场景建议用pgbench。

首先要购买RDS PG数据库实例
创建数据库用户
还需要购买同机房,与RDS PG同VPC网络ECS或者同经典网络的ECS
在ECS端安装PostgreSQL客户端

useradd digoal
su - digoal

wget https://ftp.postgresql.org/pub/source/v9.5.2/postgresql-9.5.2.tar.bz2
tar -jxvf postgresql-9.5.2.tar.bz2
cd postgresql-9.5.2
./configure --prefix=/home/digoal/pgsql9.5
gmake world -j 16
gmake install-world -j 16

vi ~/env_pg.sh
export PS1="$USER@`/bin/hostname -s`-> "
export PGPORT=1921
export LANG=en_US.utf8
export PGHOME=/home/digoal/pgsql9.5
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
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
alias rm='rm -i'
alias ll='ls -lh'
unalias vi

. ~/env_pg.sh

安装sysbench

cd ~
mkdir sysbench
cd sysbench

git clone https://github.com/digoal/sysbench.git

cd sysbench
gcc -o gendata gendata.c

初始化测试数据

./sysbench_pg --test=lua/parallel_init_pg.lua \
  --db-driver=pgsql \
  --pgsql-host=xxx.xxx.xxx.xxx \
  --pgsql-port=3432 \
  --pgsql-user=digoal \
  --pgsql-password=pwd \
  --pgsql-db=postgres \
  --oltp-tables-count=16 \
  --oltp-table-size=1000000 \
  --num-threads=16 \
  cleanup


./sysbench_pg --test=lua/parallel_init_pg.lua \
  --db-driver=pgsql \
  --pgsql-host=xxx.xxx.xxx.xxx \
  --pgsql-port=3432 \
  --pgsql-user=digoal \
  --pgsql-password=pwd \
  --pgsql-db=postgres \
  --oltp-tables-count=16 \
  --oltp-table-size=1000000 \
  --num-threads=16 \
  run

测试oltp_pg.lua的内容,包含SQL如下,其中第一条SQL循环10次 :

   -- select c from tbl where id = $1;
   -- select id,k,c,pad from tbl where id in ($1,...$n);
   -- select c from tbl where id between $1 and $2;
   -- select sum(k) from tbl where id between $1 and $2;
   -- select c from tbl where id between $1 and $2 order by c;
   -- select distinct c from tbl where id between $1 and $2 order by c;
   -- update tbl set k=k+1 where id = $1;
   -- update tbl set c=$2 where id = $1;
   -- delete from tbl where id = $1;
   -- insert into tbl(id, k, c, pad) values ($1,$2,$3,$4);

一个事务执行19条SQL。

./sysbench_pg --test=lua/oltp_pg.lua \
  --db-driver=pgsql \
  --pgsql-host=xxx.xxx.xxx.xxx \
  --pgsql-port=3432 \
  --pgsql-user=digoal \
  --pgsql-password=pwd \
  --pgsql-db=postgres \
  --oltp-tables-count=16 \
  --oltp-table-size=1000000 \
  --num-threads=16 \
  --max-time=120  \
  --max-requests=0 \
  --report-interval=1 \
  run

OLTP test statistics:
    queries performed:
        read:                            0
        write:                           0
        other:                           566572
        total:                           566572
    transactions:                        26972  (224.62 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 0      (0.00 per sec.)
    other operations:                    566572 (4718.32 per sec.)

General statistics:
    total time:                          120.0791s
    total number of events:              26972
    total time taken by event execution: 1919.7217s
    response time:
         min:                                 39.35ms
         avg:                                 71.17ms
         max:                               3159.62ms
         approx.  95 percentile:             124.54ms

Threads fairness:
    events (avg/stddev):           1685.7500/85.94
    execution time (avg/stddev):   119.9826/0.02



下面是本次测试的瓶颈分析
连接到阿里云RDS管控平台,观察压测时间段的资源开销,哪个到了瓶颈就升级哪个资源。
如果是网络的问题,可以增加测试的并发来提升TPS。
因为单个会话的链路延迟已经是没法降低的。
关于链路延迟量化分析的文章可参考
https://yq.aliyun.com/articles/35176

RDS PG的优化手段

alter role all set random_page_cost=1.2;
alter role all set synchronous_commit=off;

因为RDS链路较长,延迟会比本地延迟大很多。
但是如何量化这个延迟呢?
因为rds pg数据库服务器我们没法用qperf来测试,所以需要借助数据库本身来测试延迟。

alter role all set random_page_cost=1.2;  
alter role all set synchronous_commit=off;  

重连数据库,测试数据库本身处理SQL的RT

create table test(crt_time timestamp);  

do language plpgsql 
$$

declare
begin
  for i in 1..10000 loop
    insert into test values (clock_timestamp());
  end loop;
end;

$$
;

postgres=> select avg(rt) from (select lead(extract(microseconds from crt_time)) over (order by crt_time)-extract(microseconds from crt_time) rt from test) t;
       avg        
------------------
 10.1338133813381
(1 row)

数据库处理RT平均约10微秒。
创建用于测试网络RT的函数。

create or replace function f() returns void as 
$$

  insert into test values(clock_timestamp());  

$$
 language sql;  

清除数据

truncate test;  

在ECS主机上创建测试脚本

vi test.sql
select f();

压测

export PGPASSWORD=pwd; pgbench -M prepared -n -r -P 1 -f ./test.sql -c 1 -j 1 -T 10 -h xxx.xxx.xxx.xxx -p 3432 -U digoal postgres
tps = 197.976441 (including connections establishing)

计算RT

postgres=> select avg(rt) from (select lead(extract(microseconds from crt_time)) over (order by crt_time)-extract(microseconds from crt_time) rt from test) t;
       avg        
------------------
 5045.96513390601  
(1 row)

扣除数据库自身处理开销10微秒,网络的RT约5.036毫秒。
延迟不小。

使用并发可以弥补这个链路延迟的短板问题,例如开启300个并发,再次测试。

truncate test;  
export PGPASSWORD=pwd; pgbench -M prepared -n -r -P 1 -f ./test.sql -c 300 -j 300 -T 10 -h xxx.xxx.xxx.xxx -p 3432 -U digoal postgres
tps = 27368.404844 (including connections establishing)
postgres=> select avg(rt) from (select lead(extract(microseconds from crt_time)) over (order by crt_time)-extract(microseconds from crt_time) rt from test) t;
       avg        
------------------
 37.5476444551323
(1 row)

吞吐量上来了,但是单个事务的RT还是摆在那里的。
另外一点,使用云数据库,建议多用UDF,减少应用程序和数据库的交互次数,从而缩短整个业务逻辑的响应时间。

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
1月前
|
SQL 关系型数据库 MySQL
阿里云的云数据库RDS简介
阿里云关系型数据库RDS(Relational Database Service)是一种安全稳定、高性价比、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供容灾、备份、恢复、监控、迁移等全套解决方案,帮助用户轻松应对数据库运维挑战。RDS具备高可用性、高安全性、轻量运维和弹性伸缩等优势,适用于各类业务场景,助力企业降低成本、提升效率。
|
1月前
|
存储 人工智能 关系型数据库
阿里云AnalyticDB for PostgreSQL 入选VLDB 2025:统一架构破局HTAP,Beam+Laser引擎赋能Data+AI融合新范式
在数据驱动与人工智能深度融合的时代,企业对数据仓库的需求早已超越“查得快”这一基础能力。面对传统数仓挑战,阿里云瑶池数据库AnalyticDB for PostgreSQL(简称ADB-PG)创新性地构建了统一架构下的Shared-Nothing与Shared-Storage双模融合体系,并自主研发Beam混合存储引擎与Laser向量化执行引擎,全面解决HTAP场景下性能、弹性、成本与实时性的矛盾。 近日,相关研究成果发表于在英国伦敦召开的数据库领域顶级会议 VLDB 2025,标志着中国自研云数仓技术再次登上国际舞台。
235 0
|
8月前
|
关系型数据库 数据库 数据安全/隐私保护
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
|
9月前
|
SQL 人工智能 关系型数据库
【PG锦囊】阿里云 RDS PostgreSQL 版插件—AI 插件(rds_ai)
本文介绍了AI 插件(rds_ai)的核心优势、适用场景等,帮助您更好地了解 rds_ai 插件。想了解更多 RDS 插件信息和讨论交流,欢迎加入 RDS PG 插件用户专项服务群(103525002795)
|
9月前
|
运维 关系型数据库 MySQL
体验领礼啦!体验自建数据库迁移到阿里云数据库RDS,领取桌面置物架!
「技术解决方案【Cloud Up 挑战赛】」上线!本方案介绍如何将自建数据库平滑迁移至云数据库RDS,解决业务增长带来的运维难题。通过使用RDS MySQL,您可获得稳定、可靠和安全的企业级数据库服务,专注于核心业务发展。完成任务即可领取桌面置物架,每个工作日限量50个,先到先得。
|
4月前
|
存储 关系型数据库 测试技术
拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)
本文深入解析PostgreSQL分区表的核心原理与优化策略,涵盖性能痛点、实战案例及压测对比。首先阐述分区表作为继承表+路由规则的逻辑封装,分析分区裁剪失效、全局索引膨胀和VACUUM堆积三大性能杀手,并通过电商订单表崩溃事件说明旧分区维护的重要性。接着提出四维设计法优化分区策略,包括时间范围分区黄金法则与自动化维护体系。同时对比局部索引与全局索引性能,展示后者在特定场景下的优势。进一步探讨并行查询优化、冷热数据分层存储及故障复盘,解决分区锁竞争问题。
521 2

推荐镜像

更多