Postgres 上的 PGBouncer IDLE 连接未关闭

PGBouncer IDLE Connections not Closing on Postgres

我们有一个设置 运行 6 个 PgBouncer 进程,我们的性能基准随时间呈线性下降。 PgBouncer 运行 的时间越长,与 Postgres 的连接存在的时间越长,导致基准测试的响应时间越慢。我们有一个包含 2000 多个关系的多租户模式分离数据库。我们现在配置为事务模式池。随着时间的推移,我们看到每个 Postgres 进程的内存占用不断攀升,再一次攀升,这再次导致性能下降。

我们尝试通过以下设置更积极地清理空闲连接:

min_pool_size=0

server_idle_timeout=30 (seconds)

server_lifetime=120 (seconds)

我们看到的问题是,我们仍然总是在 Postgres 中遇到大量空闲连接。当我们使用“show pools”监控 PgBouncer 时,我们看到 sv_idle 计数在上升和下降,因此我们假设这些设置在 PgBouncer 中有效,但这并没有转化为 Postgres 中的空闲连接减少。就好像 PgBouncer 真的没有终止与 Postgres 的会话。

我四处寻找解决方案并测试了几个不同的选项 - 但一直无法找到任何解决方案。我在其他地方读到有关 cron 作业以从 Postgres 中删除空闲连接的信息,但我真的不想在生产中这样做,而是希望 PgBouncer 完全清除这些空闲连接。

我们使用的是 Postgres 9.6 并使用 PgBouncer 1.15 版

感谢任何帮助。

/**

应该在原始评论中指出这一点 - 我们有多个 PgBouncer 运行 并且我们正在使用 Unix 套接字来执行此操作。我们不确定这是否会对 Postgres 留下连接产生影响。

**/

谢谢

问题已解决。

该应用程序非常繁琐,即使将 server_idle_timeout 设置为低至 5 秒,连接也没有在 Postgres 端回收。

我们遇到的问题是 server_lifetime 在我们认为它处于活动状态时被意外评论,一旦我们更改它,我们可以清楚地看到 Postgres 连接每 2 分钟回收一次(基于我们的设置) .

随着时间的推移每个连接的内存增加,特别是对于长期连接,只考虑了私有内存而不是共享内存。我们观察到连接存在的时间越长,消耗的内存就越多。我们尝试为 reset_query 设置 DISCARD ALL 之类的设置,但它对内存消耗没有影响。根据我的在线研究,我们并不是唯一面临池连接挑战的人。

感谢您的评论和帮助。我们最终的解决方案是利用 pgBouncer 中的 server_lifetime 来控制 Postgres 上的长期连接数。

-玛雅