qinghuan
← 回到知识探索

后端现场 / 常见误区

连接池调大十倍,为什么反而更慢?

连接只是进入数据库的通道,调大通道数量不会同时增加 CPU、磁盘与锁的容量。

展开本文目录
  1. 复用连接,和增加处理能力是两件事
  2. 先算所有实例加起来会借多少
  3. 量四段时间,再决定改哪里
  4. 用同样负载试几个候选值
  5. 记住这三点
  6. 别把例子用过头
  7. 自己试一小步
  8. 查原始资料
  9. 找一份资料继续练
开始前,会这些就够了
  • 知道数据库连接与 SQL 查询
遇到不熟悉的词,先看这 3 个解释
连接池
把可复用的连接集中管理,请求需要时借用,用完归还,减少反复建立连接的成本;池还会限制可借出的数量,并按规则处理没有空闲连接的情况。
并发
多项任务在同一段时间内处于推进或等待中,执行过程可以交错,也可能在多个核心上同时进行;并发强调任务的重叠,不要求每个瞬间都一起执行。
容器
容器是根据镜像创建的隔离运行环境,用来运行应用进程;镜像带上应用文件和所需依赖,便于重复部署。同一镜像可以创建多个容器,容器也可以处于停止状态。
打开完整术语小抄 ↗

假设应用经常等数据库连接,你把每个实例的连接池从二十改成二百。等待连接的现象暂时减少,SQL 却更慢,超时更多。这里是一个假设故障链,不是某个产品的测评结果。连接不够确实可能成为瓶颈,但“有人等连接”还不足以证明池应该加大。

复用连接,和增加处理能力是两件事

连接池保存可重复使用的连接,请求需要操作数据库时借用,用完归还。它省去了反复建立连接的开销,也给应用同时占用多少数据库连接设了上限。这个上限不是数据库同时高效处理多少条查询的保证,更不是在线用户人数。

数据库的 CPU、内存、存储和锁资源仍有限。当更多查询同时争用同一批资源,可能只是把等待从应用里的池,搬到数据库内部。有些负载需要更多并发来覆盖等待,有些负载则会因争抢加剧而变慢,所以不能用一个固定大小回答所有场景。

先算所有实例加起来会借多少

假设四个应用实例,各自最多二十个连接,配置允许它们合计占用八十个。扩到八个实例而不改池大小,潜在总量就变成一百六十个。滚动更新时新旧实例还可能短暂并存,后台任务、迁移和管理连接也需要留出位置。这里算的是上限,不代表每一刻都建满。

PostgreSQL 17 的 max_connections 限制服务器可接受的并发连接,还影响部分资源的分配。把这个上限调高,不会自动解决慢查询。应用的连接预算应与整个数据库的承载和预留能力协调,而不是每个服务单独决定一个看起来宽裕的数。

量四段时间,再决定改哪里

先分别记录借连接等待、拿到连接后执行 SQL、事务中其他等待,以及归还连接前的总占用。假设某请求执行 SQL 只用几毫秒,却借着连接等外部接口数秒,那么减少无用占用,可能比开更多连接更直接。还应排查连接泄漏、长事务和慢 SQL。

若等待连接很久,而数据库仍有余力,适当增加池可能有效;若数据库已经繁忙、锁等待增加,继续加大可能扩大拥堵。一次请求甚至可能在持有一个连接时再借另一个,形成资源互等。此时要审查调用和事务结构,不能只靠无止境扩大池掩盖问题。

用同样负载试几个候选值

在可控练习环境中,固定数据量、SQL、并发请求和时间范围,逐档改变池大小。一起比较完成吞吐量、错误、尾延迟、借连接等待与数据库资源;如果只看平均查询时间,可能把排在池外的等待完全漏掉。保留饱和时的表现,也别把轻载结果当作高峰保证。

HikariCP 作者的池大小说明强调实际部署与负载差异,其中的经验公式和旧硬件示例不是普遍最优值。连接等待也要有预算:超过用户请求总时限后,继续无限排队只会累积无用工作。选择一个能满足目标、还有容量余地的范围,比追求“越多越强”更可检验。

记住这三点

  • 连接池限制连接并发,不会增加数据库本身的资源。
  • 实例扩容和滚动更新会改变总连接预算。
  • 调池前区分借用等待、SQL 耗时和持有连接的其他时间。

别把例子用过头

  • 没有通用的最佳连接数;硬件、SQL 和事务结构都会改变结果。
  • 这里的假设数字用于算预算,不能当作性能推荐。
  • 池外等待也是请求耗时的一部分,不能从体验指标中删掉。

自己试一小步

四个实例平时够用,滚动更新时却连接失败,应怎样核对总预算?

  1. 列出旧实例、新实例、后台任务和管理操作各自可能占用的连接数。
  2. 标记哪些数是实际观测,哪些只是配置上限。
  3. 设计一个只改变实例数量的练习,记录等待与错误。

做到这些,就算完成

  • 没有把 max_connections 当作推荐负载。
  • 包含发布时新旧实例重叠的情况。
  • 提出的改动对应明确证据,而不只是增大数字。

查原始资料

想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。

  • About Pool Sizing (新标签页)↗HikariCP 作者维护的 Wiki · 英文

    直接阅读资源限制、池中等待、同一任务持有多个连接和部署相关的限制;不复用文中的性能数字。

    公开英文项目文档;案例参数与硬件有关,应通过自己的工作负载测量池大小。

  • PostgreSQL 17: Connections and Authentication (新标签页)↗PostgreSQL Global Development Group · 英文

    支持 max_connections、资源分配和预留连接参数的含义。

    公开英文固定版本文档;连接上限及保留连接属于 PostgreSQL 17 的设置规则。

找一份资料继续练

先选一项,按下面的范围继续学;不必从头读完整门课程。