

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

`Client:ClientRead` 事件表示 RDS for PostgreSQL 正在等待從用戶端接收資料。

**Topics**
+ [支援的引擎版本](#wait-event.clientread.context.supported)
+ [Context](#wait-event.clientread.context)
+ [等待變多的可能原因](#wait-event.clientread.causes)
+ [動作](#wait-event.clientread.actions)

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

RDS for PostgreSQL 第 10 版及更高版本支援此等待事件資訊。

## Context
<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` 事件增加。

**連線集區使用的 PgBuncer**  
PgBuncer 有一個低階網路組態設定稱為 `pkt_buf`，預設為 4,096。如果工作負載透過 PgBuncer 傳送大於 4,096 個位元組的查詢封包，建議將 `pkt_buf` 設定增加為 8,192。如果新的設定未能減少 `Client:ClientRead` 事件，建議將 `pkt_buf` 設定增加為更大的值，例如 16,384 或 32,768。如果查詢文字很大，則較大的設定可能特別有用。

## 動作
<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)
+ [監控處於 "idle in transaction" 狀態的交易](#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>

在某些情況下，您使用的資料庫執行個體類別可能不支援 Jumbo Frame。如果您在 Amazon EC2 上執行應用程式，請考慮為用戶端使用最新一代的執行個體。此外，在用戶端作業系統上設定最大傳輸單位 (MTU)。此技術可以減少網路往返次數並增加網路輸送量。如需詳細資訊，請參閱《Amazon EC2 使用者指南》**中的 [Jumbo Frame (9001 MTU)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/network_mtu.html#jumbo_frame_instances)。

如需資料庫執行個體類別的相關資訊，請參閱 [ 資料庫執行個體類別](Concepts.DBInstanceClass.md)。若要決定等同於 Amazon EC2 執行個體類型的資料庫執行個體類別，請在 Amazon EC2 執行個體類型名稱前面加上 `db.`。例如，`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)。

### 監控處於 "idle in transaction" 狀態的交易
<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
```