1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ? 00:00:00 postgres: postgres my_app ::1(45035) idle 1 S postgres 9796 876 0 80 0 - 11964 sk_wai 11:01 ? 00:00:00 postgres: postgres my_app ::1(43084) idle
我看到很多他们。我们正在努力修复我们的连接泄漏。但同时,我们要为这些空闲连接设置超时,也许最多为5分钟。
听起来你的应用程序有一个连接泄漏,因为它无法关闭池连接。您没有遇到问题,只需使用< idle>在事务会话中,但总体连接太多。
杀死连接不是正确的答案,但它是一个OK-ish临时解决方法。
而不是重新启动Postgresql以从一个Postgresql数据库引导所有其他连接,请参阅:How do I detach all other users from a postgres database?和How to drop a PostgreSQL database if there are active connections to it?。后者显示更好的查询。
对于设置超时,如@Doon建议看到Is it possible to configure PostgreSQL to automatically close idle connections?,建议您使用PgBouncer代理Postgresql和管理空闲连接。这是一个很好的主意,如果你有一个buggy应用程序泄漏连接;我强烈建议配置PgBouncer。
一个TCP keepalive不会在这里做的工作,因为应用程序仍然连接和活着,它只是不应该。
在Postgresql 9.2及以上版本中,您可以使用新的state_change时间戳列和pg_stat_activity的状态字段来实现空闲连接回收。有一个cron工作运行这样:
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'regress' AND pid <> pg_backend_pid() AND state = 'idle' AND state_change < current_timestamp - INTERVAL '5' MINUTE;
在旧版本中,您需要实现复杂的方案来跟踪连接何时空闲。不要打扰;只是使用pgbouncer。