Client - ClientRead
当 PostgreSQL 等待从客户端接收数据时,会发生 ClientRead
事件。
PostgreSQL 数据库实例正在等待从客户端接收数据。PostgreSQL 数据库实例必须先从客户端接收数据,然后才能向客户端发送更多数据。集群在从客户端接收数据之前等待的时间为 ClientRead
事件。
ClientRead
显示在主要等待中的常见原因包括以下各项:
-
网络延迟增加
PostgreSQL 数据库实例和客户端之间的网络延迟可能会增加。较高的网络延迟会增加数据库实例从客户端接收数据所需的时间。
-
客户端负载增加
客户端上可能存在 CPU 压力或网络饱和。客户端负载的增加可能会延迟从客户端向 PostgreSQL 数据库实例传输数据的时间。
-
过多的网络往返次数
PostgreSQL 数据库实例和客户端之间的大量网络往返可能会延迟将数据从客户端传输到 PostgreSQL 数据库实例的过程。
-
大型复制操作
在复制操作期间,数据将从客户端的文件系统传输到 PostgreSQL 数据库实例。向数据库实例发送大量数据可能会延迟从客户端向数据库实例传输数据的时间。
-
空闲客户端连接
当客户端以
idle in transaction
状态连接到 PostgreSQL 数据库实例时,数据库实例可能会等待客户端发送更多数据或发出命令。在这种状态下的连接可能会导致ClientRead
事件增加。 -
用于连接池的 PgBouncer
PgBouncer 有一个名为
pkt_buf
的低级网络配置设置,预设情况下设置为 4096。如果工作负载通过 PgBouncer 发送大于 4096 字节的查询数据包,我们建议增加pkt_buf
设置为 8192。如果新设置没有减少ClientRead
事件的数量,我们建议增加pkt_buf
设置为较大的值,例如 16384 或 32768。如果查询文本很大,则较大的设置可能会特别有用。
根据等待事件的原因,我们建议采取不同的操作。
检查您是否有越来越多的 idle in transaction
连接。要做到这一点,请监控 pg_stat_activity
表中的 state
列。您可能能够通过运行类似于以下内容的查询来识别连接源。
select client_addr, state, count(1) from pg_stat_activity
where state like 'idle in transaction%'
group by 1,2
order by 3 desc