利用 SO_REUSEPORT 和 peering 实现 PgBouncer 跨所有核心的扩展
本文探讨如何通过 SO_REUSEPORT 和 peering 机制,让 PgBouncer 连接池能够充分利用多核 CPU 的并行处理能力,突破传统单线程模型的性能瓶颈,从而在 ClickHouse 托管的 PostgreSQL 服务中实现更高的连接吞吐量和更低的延迟。
背景速读
- **PgBouncer** 是 PostgreSQL 生态中最流行的轻量级连接池中间件,负责复用数据库连接、避免每次查询都新建 TCP 连接,从而降低数据库负载。
- **SO_REUSEPORT** 是 Linux 内核的一个套接字选项,允许多个进程/线程绑定到同一个端口,内核负责在它们之间负载均衡流量。它常被用来突破单进程的网络 I/O 瓶颈。
- **Peering(对等直连)** 指在同一托管商或同一数据中心内,实例间通过内部 IP 直接通信、不走公网,以降低延迟和成本。
- 这篇文章来自 ClickHouse 官方博客。ClickHouse 是一家以同名列式数据库闻名的基础设施公司,近年来也提供托管 PostgreSQL 服务。其 PostgreSQL 团队遇到了 PgBouncer 单进程性能瓶颈,因此尝试用 SO_REUSEPORT 让 PgBouncer 跨所有 CPU 核心水平扩展,再结合内网对等路由优化连接路径。
- 类似思路在 Envoy、Nginx 等代理中已有实践,但针对 PgBouncer 这种 fork 模型的改造案例较为少见,对运行大规模托管数据库的团队有直接参考价值。