Postgres客户端大量空闲连接(空查询/DISCARD ALL)与RDS Proxy关联排查
问题分析与解答
1. 空闲连接查询字段为空或执行DISCARD ALL的含义
- 查询字段为空:说明当前连接处于空闲状态,没有正在执行的SQL语句,仅维持着与数据库的会话连接。
- 执行
DISCARD ALL:这是PostgreSQL的内置命令,作用是重置会话状态——清理临时表、释放保存点、重置会话级配置参数、取消预备语句等。通常是连接池(包括RDS Proxy)在回收连接、准备复用给下一个请求时执行的操作,目的是确保新请求拿到的是“干净”的会话环境,避免前一个请求的会话状态干扰后续请求。
2. query_start时间持续更新的原因
这个现象和RDS Proxy的连接复用机制直接相关:
- RDS Proxy会维护一个与RDS实例的连接池,当服务端的连接归还到Proxy的连接池后,Proxy不会立即关闭它,而是会定期执行
DISCARD ALL来重置会话,每次执行该命令时,query_start就会被更新为当前时间。 - 即使连接处于空闲状态,Proxy的保活或清理操作也会触发这个时间戳更新,所以你看到的
query_start始终是最近的时间,这并不代表有查询在持续执行,只是Proxy维护连接池的操作痕迹。
3. 是否由RDS Proxy导致?连接是否被阻塞?
- 这个现象确实是RDS Proxy的正常行为,并非连接阻塞:
- 连接阻塞通常会表现为
wait_event字段有具体的等待类型(比如锁等待、IO等待),且query_start会停留在阻塞开始的时间,不会持续更新。 - 你看到的情况是Proxy在管理连接池的常规操作,空闲连接被Proxy保持并定期清理状态,等待下一次被服务请求复用。
- 连接阻塞通常会表现为
- 补充:如果是服务端的原生连接池(比如Node.js的pg-pool、Spring Boot的HikariCP),也可能出现类似的
DISCARD ALL操作,但结合query_start持续更新的特征,更符合RDS Proxy的连接池管理逻辑——因为Proxy会主动维护后端连接的状态,而非完全依赖服务端的连接池行为。
内容的提问来源于stack exchange,提问作者Selvakumar Ponnusamy
相关产品推荐
相关产品推荐

