开启log_connection后Postgres日志大量unknown连接记录原因查询
核心原因
你遇到的现象是应用端使用无复用的短连接访问PostgreSQL导致的,结合你的配置和日志可以完全确认:
- 你开启了
log_connections参数,所以PostgreSQL会把每一次连接请求都记录到日志中,这是大量日志生成的前提 - 从第二部分日志可以看到,每个连接的会话时长仅10~60毫秒,连接刚完成授权就立刻断开,没有任何SQL执行的时间,说明应用每次发起数据库操作都会新建一个独立连接,操作完成立即关闭,完全没有连接复用逻辑
- 单日45万+的连接记录完全符合短连接的流量特征,这类场景会导致数据库和应用服务器都产生大量TCP TIME_WAIT连接,浪费大量系统资源在连接建立、销毁的流程上,严重影响业务性能。
验证方法
你可以登录IP为192.168.7.61的应用服务器,执行ss -ant | grep :5432(或netstat命令)查看TCP连接状态,如果TIME_WAIT状态的连接数远高于ESTABLISHED状态的连接数,即可100%确认短连接问题。
解决方案
- 最优方案是在应用侧配置数据库连接池,根据业务实际并发量设置合理的最小空闲连接、最大连接数参数,实现连接复用,从根源解决短连接问题。不同语言生态有成熟的连接池组件可选,比如Java生态的HikariCP、Druid,Python生态的SQLAlchemy连接池、DBUtils,PHP生态的PDO持久连接等。
- 如果应用侧暂时无法调整代码,可以在应用和PostgreSQL之间部署PgBouncer连接池中间件,代理所有数据库连接请求,由中间件实现连接复用,降低数据库侧的连接开销。
- 问题排查完成后如果不需要保留所有连接日志,可以将PostgreSQL的
log_connections参数调整为off,避免日志占用过多磁盘空间。
内容的提问来源于stack exchange,提问作者supersantos
相关产品推荐
相关产品推荐

