

# 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 DB インスタンスは、クライアントからのデータ受信を待っています。RDS for PostgreSQL DB インスタンスは、クライアントにさらにデータを送信する前に、クライアントからデータを受信する必要があります。インスタンスがクライアントからデータを受信する前に待機する時間が `Client:ClientRead` イベントとなります。

## 待機時間が増加する原因の可能性
<a name="wait-event.clientread.causes"></a>

`Client:ClientRead`上位待機中に表示されるイベントの一般的な原因には、次のものがあります。

**ネットワークレイテンシーの増加**  
RDS for PostgreSQL DB インスタンスとクライアントの間のネットワークレイテンシーが増加することがあります。ネットワークレイテンシーが高いほど、DB インスタンスがクライアントからデータを受信するために必要な時間が長くなります。

**クライアントへの負荷の増大**  
クライアント側で CPU プレッシャーまたはネットワーク飽和が発生している可能性があります。クライアント側の負荷が増加すると、クライアントから RDS for PostgreSQL DB インスタンスへのデータの転送が遅延する可能性があります。

**過剰なネットワークラウンドトリップ**  
RDS for PostgreSQL DB インスタンスとクライアントの間のネットワークラウンドトリップが多くなると、クライアントから RDS for PostgreSQL DB インスタンスへのデータの転送が遅延する可能性があります。

**大規模なコピーオペレーション**  
コピーオペレーション中、データはクライアントのファイルシステムから RDS for PostgreSQL DB インスタンスに転送されます。DB インスタンスに大量のデータを送信すると、クライアントから DB インスタンスへのデータの転送が遅延する可能性があります。

**アイドル状態のクライアントの接続**  
クライアントが RDS for PostgreSQL DB インスタンスに `idle in transaction` 状態で接続している場合、DB インスタンスは、クライアントがより多くのデータを送信するのを待ったり、コマンドを発したりすることがあります。この状態での接続は、`Client:ClientRead`イベントの増加につながることがあります。

**接続プーリングに使用される pgBouncer**  
pgBouncer には`pkt_buf`という低レベルネットワーク構成設定があり、デフォルトでは 4,096 に設定されています。ワークロードが 4,096 バイトを超えるクエリパケットを pgBouncer を介して 送信する場合は、`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)
+ [「トランザクションのアイドル」状態のトランザクションをモニタリングする](#wait-event.clientread.actions.check-idle-in-transaction)

### クライアントをインスタンスと同じアベイラビリティーゾーンと VPC サブネットに配置します。
<a name="wait-event.clientread.actions.az-vpc-subnet"></a>

ネットワークレイテンシーを減らしてネットワークスループットを向上するには、RDS for PostgreSQL DB インスタンスと同じアベイラビリティーゾーンおよび仮想プライベートクラウド (VPC) サブネットにクライアントを配置します。クライアントが、DB インスタンスにできる限り地理的に近い場所に配置されていることを確認してください。

### クライアントのスケーリング
<a name="wait-event.clientread.actions.scale-client"></a>

Amazon CloudWatch またはその他のホストメトリクスを使用して、クライアント側が現在 CPU またはネットワーク帯域幅、またはその両方によって制約を受けているかどうかを判断します。クライアント側が制約を受けている場合は、それに応じてクライアントをスケーリングします。

### 現行世代のインスタンスを使用
<a name="wait-event.clientread.actions.db-instance-class"></a>

場合によっては、ジャンボフレームをサポートする DB インスタンスクラスを使用していない可能性があります。Amazon EC2 でアプリケーションを実行している場合は、クライアント側に現行世代のインスタンスを使用することを検討してください。また、クライアントのOSで最大送信単位 (MTU) を設定します。この技術では、ネットワークラウンドトリップの数を減らし、ネットワークスループットを向上させることができます。詳細については、「*Amazon EC2 ユーザーガイド*」の「[ジャンボフレーム (9001 MTU)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/network_mtu.html#jumbo_frame_instances)」を参照してください。

DB インスタンスクラスの詳細については、「[ DB インスタンスクラス](Concepts.DBInstanceClass.md)」を参照してください。Amazon EC2 インスタンスタイプと同等の DB インスタンスクラスを決定するには、`db.`Amazon EC2 インスタンスタイプの前に配置します。例えば、`r5.8xlarge`Amazon EC2 インスタンスは`db.r5.8xlarge`DB インスタンスクラスと同等です。

### ネットワーク帯域幅の増加
<a name="wait-event.clientread.actions.increase-network-bandwidth"></a>

`NetworkReceiveThroughput` および `NetworkTransmitThroughput` の Amazon CloudWatch メトリクスを使用して、DB インスタンス上の着信および発信ネットワークトラフィックをモニタリングします。これらのメトリックは、ネットワーク帯域幅がワークロードに十分であるかどうかを判断するのに役立ちます。

ネットワーク帯域幅が十分でない場合は、増加してください。AWSクライアントまたは DB インスタンスがネットワーク帯域幅の制限に達している場合、帯域幅を増やす唯一の方法は、DB インスタンスのサイズを増加することことです。詳細については、「[DB インスタンスクラスタイプ](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
```