postgresql 客户端_PostgreSQL上线优化案例QPS从500到上万级别压测之路

文章转载自公众号:DB印象

业务需求描述

要求每个事务逻辑延迟1秒以内,业务初期读写3000的QPS,后续有明星大咖空降活动,要求QPS能力可横向扩展。

注:这里说的读写3000的QPS,其实水有点坑。(详见后文)

系统架构环境

1.前端应用部署55台客户端设备,单台client机型配置8核心14G内存,程序使用golang+lib/pq实现编码。

2.DB侧使用pg分布式,单分片一主二从架构,可进行读写分离(后续有时间再补充独立分离的情况):

1)写平面配置2个cn,机型8核14G虚拟机;

2)同城只读平面、异地只读平面各配置1个cn,8核14G虚拟机。

3)主备dn节点一主二从均为32核64G的物理机,SSD存储。

3.架构简图如下:

a6311d92e24c1da497630488b3d61474.png

本次压测最终使用的链路如下: 1台client-->负载均衡-->1个cn-primary节点-->1个dn-primary节点

压测优化过程

业务层面设置每个tps为1秒强制超时,当tps达到500时业务出现大量超时报错,吐槽pg能力太差:

30ecb19f0653ab20c53a0b1c1d85d732.png

本次压测的SQL单次执行性能都在15ms以内,500并发请求业务层面就开始出现大量超时异常,打死也不能认了。 根本原因是前端应用使用的无上限短连接导致DB侧接入节点cn负载过高导致。 首先,暂且先保持这个无上限的短连接,将写平面2个cn节点替换成1台32核64G的物理机,使写平面变成1cn->1dn的关系,再看看QPS能去到多少。 再次压测,当DB侧QPS达到8400左右的时候,业务侧开始出现超时,DB侧cn节点CPU使用率接近100%:

6ccc1a4c5f9d6bf43e6dbfb95bec2a0a.png

466680da8d1d2038d8d40e4b32bd526d.png

接下来我们得拿短连接下刀,排查应用代码发现开发同学在程序里调用动态库时未配置SetMaxOpenConns()参数,该参数缺省为0,即短连接无上限。 将client连接数上限控制在32个,重新压测,DB侧QPS提升到1.2w左右,CPU使用率还有大半空余,但此时业务侧开始出现同样的超时报错:

37f3feb8f41375e91b4ae06ff14310cd.png

d823f9dbc20e7905d51a975a4f74a50d.png

cn资源负载:

b0d535c19e008a8dd296c7ffdf81d02f.png

dn资源负载:

d4f8d955bc93c76658ec887e33ce7758.png

从上
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值