连接池的 size 设多大,一个反直觉的答案
直觉是池越大吞吐越高。实际测试里,把池从 100 降到 20,吞吐反而上升,p99 明显下降。原因是数据库侧的并行能力有限,超过之后连接之间争抢 CPU 和锁,切换成本超过了并行收益。
一个经验公式是 连接数 ≈ 核数 × 2 + 有效磁盘数。对 4 核的机器,10–12 个连接通常就够了,剩下的应该在应用侧排队。
关键是排队要有上限和超时。无上限的等待队列会让故障从「数据库慢」变成「应用全挂」,因为请求堆积到内存耗尽。
另外要注意池的分层:应用连 PgBouncer,PgBouncer 连数据库。两层都按大池配,等于没配。真正需要限制的是最内层。