

# Client:ClientRead
<a name="wait-event.clientread"></a>

当 RDS for PostgreSQL 等待从客户端接收数据时，会发生 `Client:ClientRead` 事件。

**Topics**
+ [支持的引擎版本](#wait-event.clientread.context.supported)
+ [上下文](#wait-event.clientread.context)
+ [等待次数增加的可能原因](#wait-event.clientread.causes)
+ [操作](#wait-event.clientread.actions)

## 支持的引擎版本
<a name="wait-event.clientread.context.supported"></a>

RDS for PostgreSQL 版本 10 及更高版本支持此等待事件信息。

## 上下文
<a name="wait-event.clientread.context"></a>

RDS for PostgreSQL 数据库实例正在等待从客户端接收数据。RDS for PostgreSQL 数据库实例必须先从客户端接收数据，然后才能向客户端发送更多数据。实例在从客户端接收数据之前等待的时间为 `Client:ClientRead` 事件。

## 等待次数增加的可能原因
<a name="wait-event.clientread.causes"></a>

`Client:ClientRead` 显示在主要等待中的常见原因包括以下各项：

**网络延迟增加**  
RDS for PostgreSQL 数据库实例和客户端之间的网络延迟可能会增加。较高的网络延迟会增加数据库实例从客户端接收数据所需的时间。

**客户端负载增加**  
客户端上可能存在 CPU 压力或网络饱和。客户端负载的增加可能会延迟从客户端向 RDS for PostgreSQL 数据库实例传输数据的时间。

**过多的网络往返次数**  
RDS for PostgreSQL 数据库实例和客户端之间的大量网络往返可能会延迟将数据从客户端传输到 RDS for PostgreSQL 数据库实例的过程。

**大型复制操作**  
在复制操作期间，数据将从客户端的文件系统传输到 RDS for PostgreSQL 数据库实例。向数据库实例发送大量数据可能会延迟从客户端向数据库实例传输数据的时间。

**空闲客户端连接**  
当客户端以 `idle in transaction` 状态连接到 RDS for PostgreSQL 数据库实例时，数据库实例可能会等待客户端发送更多数据或发出命令。在这种状态下的连接可能会导致 `Client:ClientRead` 事件增加。

**用于连接池的 PgBouncer**  
PgBouncer 有一个名为 `pkt_buf` 的低级网络配置设置，预设情况下设置为 4096。如果工作负载通过 PgBouncer 发送大于 4096 字节的查询数据包，我们建议增加 `pkt_buf` 设置为 8192。如果新设置没有减少 `Client:ClientRead` 事件的数量，我们建议增加 `pkt_buf` 设置为较大的值，例如 16384 或 32768。如果查询文本很大，则较大的设置可能会特别有用。

## 操作
<a name="wait-event.clientread.actions"></a>

根据等待事件的原因，我们建议采取不同的操作。

**Topics**
+ [将客户端放置在与实例相同的可用区和 VPC 子网中](#wait-event.clientread.actions.az-vpc-subnet)
+ [扩展客户端](#wait-event.clientread.actions.scale-client)
+ [使用当前一代实例](#wait-event.clientread.actions.db-instance-class)
+ [提高网络带宽](#wait-event.clientread.actions.increase-network-bandwidth)
+ [监控网络性能的最大值](#wait-event.clientread.actions.monitor-network-performance)
+ [监控处于“空闲事务”状态的事务](#wait-event.clientread.actions.check-idle-in-transaction)

### 将客户端放置在与实例相同的可用区和 VPC 子网中
<a name="wait-event.clientread.actions.az-vpc-subnet"></a>

为了减少网络延迟并提高网络吞吐量，请将客户端放在与 RDS for PostgreSQL 数据库实例相同的可用区和虚拟私有云（VPC）子网中。确保客户端在地理位置上尽可能靠近数据库实例。

### 扩展客户端
<a name="wait-event.clientread.actions.scale-client"></a>

使用 Amazon CloudWatch 或其他主机指标，确定您的客户端当前是受 CPU 或网络带宽的限制，还是受此两者的限制。如果客户端受到限制，请相应地扩展您的客户端。

### 使用当前一代实例
<a name="wait-event.clientread.actions.db-instance-class"></a>

在某些情况下，您可能没有使用支持巨型帧的数据库实例类。如果您在 Amazon EC2 上运行应用程序，请考虑为客户端使用当前一代实例。另外，在客户端操作系统上配置最大传输单位 (MTU)。这种技术可能会减少网络往返次数并提高网络吞吐量。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[巨型帧（9001 MTU）](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/network_mtu.html#jumbo_frame_instances)。

有关数据库实例类的信息，请参阅 [数据库实例类](Concepts.DBInstanceClass.md)。要确定等同于 Amazon EC2 实例类型的数据库实例类，请将 `db.` 放置在 Amazon EC2 实例类型名称之前。例如，`r5.8xlarge` Amazon EC2 实例等同于 `db.r5.8xlarge` 数据库实例类。

### 提高网络带宽
<a name="wait-event.clientread.actions.increase-network-bandwidth"></a>

使用 `NetworkReceiveThroughput` 和 `NetworkTransmitThroughput` Amazon CloudWatch 指标监控数据库实例上的传入和传出网络流量。这些指标可以帮助您确定网络带宽是否足以满足您的工作负载。

如果您的网络带宽不够，请增加它。如果 AWS 客户端或您的数据库实例已达到网络带宽限制，增加带宽的唯一方法是增加数据库实例大小。有关更多信息，请参阅 [数据库实例类类型](Concepts.DBInstanceClass.Types.md)。

有关 CloudWatch 指标的更多信息，请参阅[Amazon RDS 的 Amazon CloudWatch 指标](rds-metrics.md)。

### 监控网络性能的最大值
<a name="wait-event.clientread.actions.monitor-network-performance"></a>

如果您使用的是 Amazon EC2 客户端，Amazon EC2 会提供网络性能指标的最大值，包括聚合入站和出站网络带宽。它还提供连接跟踪功能，以确保按预期返回数据包以及域名系统 (DNS) 等服务的链接本地服务访问。要监控这些最大值，请使用当前的增强型联网驱动程序并监控客户端的网络性能。

有关更多信息，请参阅《Amazon EC2 用户指南》**中的[监控您的 Amazon EC2 实例的网络性能](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-network-performance-ena.html)，以及《Amazon EC2 用户指南》**中的[监控您的 Amazon EC2 实例的网络性能](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/monitoring-network-performance-ena.html)。

### 监控处于“空闲事务”状态的事务
<a name="wait-event.clientread.actions.check-idle-in-transaction"></a>

检查您是否有越来越多的 `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
```