news 2026/7/12 8:48:45

ClickHouse Managed Postgres扩展PgBouncer:进程组吞吐量达单进程4倍,突破连接池瓶颈!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ClickHouse Managed Postgres扩展PgBouncer:进程组吞吐量达单进程4倍,突破连接池瓶颈!

如何在ClickHouse Managed Postgres中扩展PgBouncer

PgBouncer单线程运行,无论服务器有多少CPU核心,单个进程仅使用一个核心。在16个虚拟CPU的服务器上,一个核心承担所有连接池管理工作,其余15个核心闲置。并且,在Postgres还有处理能力时,连接池就开始限制吞吐量。

在ClickHouse Managed Postgres中,运行一组与可用核心数成正比的PgBouncer进程。这组进程中的每个进程都使用启用了 `so_reuseport` 的相同端口进行绑定。内核会将传入的连接负载均衡到各个进程上,客户端仍连接到单个端点,不会察觉到背后有多个PgBouncer进程。这正是PgBouncer官方文档中提到的利用多个核心的机制:每个进程是单线程的,而 `so_reuseport` 可以让每个核心都发挥作用。

问题:查询取消

Postgres的取消请求会通过一个全新的连接发送,该连接携带一个取消密钥,与运行查询的连接分开。使用 `so_reuseport` 时,内核可能会将这个新连接分配给与持有会话的进程不同的进程。这样,取消请求就会发送到一个从未听说过该查询的进程上,导致取消操作失败。

通过进程间的“对等机制(peering)”可以解决这个问题。这些进程相互了解,若取消请求发送到了错误的进程,它会被转发到实际持有会话的进程。这样,即使任何给定的请求可能到达任意进程,整个进程组都能正常处理取消操作。

连接池以事务模式运行,一旦事务提交,服务器连接就会返回到连接池。并且连接预算会在整个进程组中进行分配:`max_client_conn` 和 `max_db_connections` 会除以进程数量,确保整个进程组不会使Postgres过载。

在真实硬件上的测试结果

在相同的AWS EC2实例上运行了两种配置:一个16虚拟CPU的 `c7i.4xlarge` 实例用于运行连接池,另一个单独的实例运行Postgres,还有一个实例使用 `pgbench` 在仅查询、事务池模式下施加负载。一个连接池实例运行单个PgBouncer进程,另一个运行16个进程组成的进程组。实例类型、Postgres、工作负载均相同,唯一的变量就是单个进程与16个进程的区别。

将客户端连接数从8增加到256,并测量了吞吐量以及每个连接池实际使用的16核心服务器的资源情况。

单个进程在大约87000笔交易/秒时达到峰值,之后随着负载增加性能反而下降。当客户端数量达到256时,吞吐量降至77000笔交易/秒,因为所有操作都在争夺一个核心的资源。而进程组的吞吐量持续上升,最终达到约336000笔交易/秒,大约是单个进程的4倍,因为它可以利用更多的核心。

单个进程的工作负载从未超过一个核心:在负载下,`pidstat` 显示PgBouncer进程的CPU使用率固定在约97%,即一个完整的核心,而16虚拟CPU的服务器整体利用率仍低于10%。进程组则可以充分利用服务器资源,大约有8个核心处于忙碌状态,并且在Postgres和负载生成器成为瓶颈之前,还有提升空间。

保持256个客户端对每个实例的稳定连接:单进程实例在整个运行过程中的CPU使用率接近9%,而进程组的CPU使用率约为52%。实例类型、Postgres、工作负载相同,但一种配置使服务器闲置,另一种则充分利用了服务器资源。

EC2的CloudWatch指标从外部也反映了相同的情况:在负载期间,单进程实例的平均CPU利用率约为16%,而进程组约为60%。CloudWatch的读数比实例内部的读数略高,但差距依然存在:在为16个虚拟CPU付费的服务器上,单个PgBouncer几乎让所有资源都闲置了。

连接上限的情况也是如此。单个进程会自行实施 `max_client_conn` 限制,一旦超过这个限制,新的客户端就会被拒绝连接:

FATAL: no more connections allowed (max_client_conn)

将连接预算分配到进程组中,可以在保证每个进程和Postgres处于安全限制范围内的同时,提高总体连接上限。

客户端数量单进程TPS单进程实例CPU进程组TPS进程组实例CPU
889100.8%64502.9%
32542035.2%6424412.3%
64865708.3%21943931.9%
128834638.1%32054745.9%
256768937.7%33646948.9%

在连接数较少时,单个进程的表现实际上还不错,甚至稍微快一些,因为此时没有并行操作,而进程组的连接分布较分散。但在真正的并发场景下,差距就会显现出来,因为单个核心会成为性能瓶颈。

总结

在连接池(而非Postgres)成为吞吐量瓶颈之前,单个PgBouncer是一个不错的默认选择。根据核心数量调整进程组的大小,使用 `so_reuseport` 共享一个端口,并通过对等机制将进程连接起来,可以让连接池不再成为瓶颈,而是高效的基础组件。

每个ClickHouse Managed Postgres服务器默认都采用这种配置。可以创建一个Postgres实例来体验一下。

试用ClickHouse管理的Postgres

ClickHouse + Postgres已成为可扩展应用程序的统一数据栈。随着ClickHouse Cloud中托管Postgres的推出,可以从一开始就选择这个强大的数据栈。

立即注册

立即开始使用

想了解ClickHouse如何处理数据吗?只需几分钟即可开始使用ClickHouse Cloud,并获得300美元的免费信用额度。

立即注册

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/12 8:48:22

锂电池主动平衡技术:BQ25887与STM32F756ZG的高效方案

1. 电池平衡系统的核心挑战与选型思路在串联锂电池组应用中,单体电压差异是影响整体性能的关键瓶颈。当多个电芯串联工作时,即使初始容量相同,由于制造公差、温度分布不均等因素,充放电过程中必然会出现电压偏差。这种不平衡如果长…

作者头像 李华
网站建设 2026/7/12 8:46:51

Unity纹理优化实战:MipMaps开关决策与性能内存平衡指南

1. 项目概述:MipMaps的抉择困境在Unity项目开发中,尤其是面向移动端或WebGL平台时,贴图优化是绕不开的核心议题。其中,关于MipMaps的开关问题,几乎每个项目都会遇到,也常常引发团队内的讨论:美术…

作者头像 李华
网站建设 2026/7/12 8:43:51

STM32与TDA7468音频系统设计与优化指南

1. 音频处理系统的核心组件解析在嵌入式音频处理领域,TDA7468和STM32L4A6RG的组合堪称黄金搭档。TDA7468是STMicroelectronics推出的一款专业级音频处理器芯片,具有4路输入选择和2路输出,支持IC总线控制,内置可编程增益放大器、音…

作者头像 李华
网站建设 2026/7/12 8:43:31

AD7490与MKV46F256VLH16高速ADC方案设计与优化

1. AD7490与MKV46F256VLH16的黄金组合:高速模数转换方案解析在工业自动化、医疗设备和测试测量领域,模拟信号的快速数字化一直是工程师面临的经典挑战。AD7490作为ADI公司推出的16位高速ADC(模数转换器),与NXP的MKV46F…

作者头像 李华
网站建设 2026/7/12 8:42:52

GitHub Desktop 3.3 企业级迁移实战:从 SVN 到 GitLab 的 5 步平滑过渡方案

GitHub Desktop 3.3 企业级迁移实战:从 SVN 到 GitLab 的 5 步平滑过渡方案对于长期使用 SVN 的企业团队来说,向 GitLab 迁移不仅是工具切换,更是一次开发流程的革新。传统集中式版本控制系统与分布式 Git 在工作模式上存在本质差异&#xff…

作者头像 李华
网站建设 2026/7/12 8:42:40

基于51单片机智能家居可燃气体报警器无线APP视频监控设计DIY074X

本系统由STC89C52单片机最小系统电路、OLED液晶显示电量、ADC0832(或xx0832芯片)的AD转换电路、可燃气体传感器、(无线蓝牙/WIFI模块-可选)、蜂鸣器报警驱动电路、继电器驱动电路(可以外接其他水泵/加热器/风扇等等设备)、按键电路…

作者头像 李华