跳转到主要内容

Client 等待

PostgreSQL 等待应用、网络套接字、TLS/GSS 握手或复制客户端。

Client 颠倒了通常的怀疑方向:PostgreSQL 已准备好读取、写入或完成协议步骤,但远端或网络没有推进。连接池里的空闲连接很多时,大量 Client 等待往往完全正常。

状态与事务年龄决定严重度

ClientReadstate = 'idle' 属于预期。同一个事件若是 idle in transactionxact_start 很老,就可能保留锁、快照和死元组。活动会话上的 ClientWrite 则说明服务器无法足够快地把结果交给消费者。

  • 正常: 空闲池化连接等待下一条命令。
  • 关注: 很老的 idle in transaction、活动状态的 ClientWrite、握手等待,或应用延迟同步上升。
  • 紧急: 客户端停止消费结果、连接槽耗尽、打开的事务阻碍清理,或复制客户端反复断开。

值得先认出的事件

事件 第一个责任方
ClientRead 应用/连接池
ClientWrite 应用消费者或网络
GssOpenServer 认证/网络路径
SslOpenServer TLS 握手路径
LibpqwalreceiverReceive 上游主库/网络
WalSenderWriteData 备库或复制客户端

常见误读

  • “大多数会话都在 ClientRead” 不是数据库瓶颈证据;还要看状态、事务年龄与连接池规模。
  • 取消空闲客户端不能修复过大的连接池,只会让连接池重新连接。
  • 即使数据库主机的网络看起来空闲,慢消费者仍会导致 ClientWrite
  • 带复制语义的 Client 等待仍位于协议边界,但运维责任方不同。

建立 GSSAPI 会话时,等待从客户端读取数据。

在 WAL sender 进程中处理 WAL receiver 的回复时,等待发生任何活动。