

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

O evento `Client:ClientRead` ocorre quando o RDS para PostgreSQL está aguardando receber dados do cliente.

**Topics**
+ [Versões compatíveis do mecanismo](#wait-event.clientread.context.supported)
+ [Contexto](#wait-event.clientread.context)
+ [Possíveis causas do maior número de esperas](#wait-event.clientread.causes)
+ [Ações](#wait-event.clientread.actions)

## Versões compatíveis do mecanismo
<a name="wait-event.clientread.context.supported"></a>

Essas informações sobre eventos de espera são compatíveis com o RDS para PostgreSQL versão 10 e superiores.

## Contexto
<a name="wait-event.clientread.context"></a>

Uma instância de banco de dados do RDS para PostgreSQL está aguardando para receber dados do cliente. A instância de banco de dados do RDS para PostgreSQL deve receber os dados do cliente para poder enviar mais dados ao cliente. O tempo de espera da instância antes de receber dados do cliente é um evento `Client:ClientRead`.

## Possíveis causas do maior número de esperas
<a name="wait-event.clientread.causes"></a>

Causas comuns do surgimento do evento `Client:ClientRead` nas principais esperas incluem: 

**Maior latência de rede**  
Pode haver maior latência de rede entre a instância de banco de dados do RDS para PostgreSQL e o cliente. A latência de rede mais alta aumenta o tempo necessário para a instância de banco de dados receber dados do cliente.

**Maior carga no cliente**  
Pode haver pressão da CPU ou saturação da rede no lado do cliente. Um aumento na carga no cliente pode atrasar a transmissão de dados do cliente para a instância de banco de dados do RDS para PostgreSQL.

**Excesso de viagens de ida e volta na rede**  
Um número elevado de viagens de ida e volta na rede entre a instância de banco de dados do RDS para PostgreSQL e o cliente pode atrasar a transmissão de dados do cliente para a instância do RDS para PostgreSQL.

**Operação de cópia extensa**  
Durante uma operação de cópia, os dados são transferidos do sistema de arquivos do cliente para a instância de banco de dados do RDS para PostgreSQL. O envio de uma muitos dados para a instância de banco de dados pode atrasar a transmissão de dados do cliente para a instância de banco de dados.

**Desconexão de um cliente inativo**  
Quando um cliente se conecta à instância de banco de dados do RDS para PostgreSQL em um estado `idle in transaction`, a instância de banco de dados pode esperar que o cliente envie mais dados ou emitir um comando. Uma conexão nesse estado pode resultar no aumento de eventos `Client:ClientRead`.

**PgBouncer utilizado para agrupamento de conexões**  
PgBouncer tem uma configuração de rede de baixo nível chamada `pkt_buf` e que está definida como 4.096 por padrão. Se a workload estiver enviando pacotes de consulta maiores que 4.096 bytes por meio de PgBouncer, convém aumentar a configuração `pkt_buf` para 8.192. Se a nova configuração não diminuir o número de eventos `Client:ClientRead`, convém aumentar a configuração `pkt_buf` para valores maiores, como 16.384 ou 32.768. Se o texto da consulta for grande, a configuração maior pode ser particularmente útil.

## Ações
<a name="wait-event.clientread.actions"></a>

Recomenda-se ações distintas, dependendo dos motivos do evento de espera.

**Topics**
+ [Colocar os clientes na mesma zona de disponibilidade e sub-rede da VPC que a instância](#wait-event.clientread.actions.az-vpc-subnet)
+ [Escalar seu cliente](#wait-event.clientread.actions.scale-client)
+ [Utilizar instâncias da geração atual](#wait-event.clientread.actions.db-instance-class)
+ [Aumentar a largura de banda da rede](#wait-event.clientread.actions.increase-network-bandwidth)
+ [Monitorar máximos de performance da rede](#wait-event.clientread.actions.monitor-network-performance)
+ [Monitorar transações no estado de “inatividade em transação”](#wait-event.clientread.actions.check-idle-in-transaction)

### Colocar os clientes na mesma zona de disponibilidade e sub-rede da VPC que a instância
<a name="wait-event.clientread.actions.az-vpc-subnet"></a>

Para reduzir a latência e aumentar o throughput da rede, coloque clientes na mesma zona de disponibilidade e na mesma sub-rede de nuvem privada virtual (VPC) que a instância de banco de dados do RDS para PostgreSQL. Os clientes devem estar o mais próximos possível da instância de banco de dados.

### Escalar seu cliente
<a name="wait-event.clientread.actions.scale-client"></a>

Utilizando o Amazon CloudWatch ou outras métricas de host, determine se o cliente está atualmente restrito pela CPU ou pela largura de banda da rede, ou por ambas. Se o cliente estiver restrito, escale-o de acordo.

### Utilizar instâncias da geração atual
<a name="wait-event.clientread.actions.db-instance-class"></a>

Em alguns casos, talvez você não esteja utilizando uma classe de instância de banco de dados que ofereça suporte a quadros jumbo. Se estiver executando sua aplicação no Amazon EC2, considere utilizar uma instância de geração atual para o cliente. Além disso, configure a MTU (unidade de transmissão máxima) no sistema operacional cliente. Essa técnica pode reduzir o número de idas e voltas pela rede e aumentar a taxa de transferência da rede. Consulte mais informações em [Frames jumbo (9001 MTU)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/network_mtu.html#jumbo_frame_instances) no *Guia do usuário do Amazon EC2*.

Para obter informações sobre classes de instância de banco de dados, consulte [Classes de instâncias de banco de dados do ](Concepts.DBInstanceClass.md). Para determinar a classe de instância de banco de dados equivalente a um tipo de instância do Amazon EC2, coloque `db.` antes do nome do tipo de instância do Amazon EC2. Por exemplo, a instância `r5.8xlarge` do Amazon EC2 é equivalente à classe de instância de banco de dados `db.r5.8xlarge`.

### Aumentar a largura de banda da rede
<a name="wait-event.clientread.actions.increase-network-bandwidth"></a>

Utilize as métricas `NetworkReceiveThroughput` e `NetworkTransmitThroughput` do Amazon CloudWatch para monitorar o tráfego de rede de entrada e saída na instância de banco de dados. Essas métricas podem ajudar você a determinar se a largura de banda da rede é suficiente para a sua workload. 

Se a largura de banda da rede não suficiente, aumente-a. Se o cliente AWS ou sua instância de banco de dados estiver atingindo os limites de largura de banda da rede, a única maneira de aumentar a largura de banda será ampliar o tamanho da instância de banco de dados. Para obter mais informações, consulte [Tipos de classe de instância de banco de dados](Concepts.DBInstanceClass.Types.md).

Para ter mais informações sobre métricas do CloudWatch, consulte [Métricas do Amazon CloudWatch para o Amazon RDS](rds-metrics.md). 

### Monitorar máximos de performance da rede
<a name="wait-event.clientread.actions.monitor-network-performance"></a>

Se você utiliza clientes do Amazon EC2, o Amazon EC2 fornece máximos para métricas de performance da rede, incluindo largura de banda de rede agregada de entrada e saída. Ele também fornece rastreamento de conexões para garantir que os pacotes sejam retornados conforme esperado e vinculem localmente o acesso para serviços como o Sistema de Nomes de Domínio (DNS). Para monitorar esses máximos, utilize um driver de rede avançado atual e monitore a performance de rede do seu cliente. 

Consulte mais informações em [Monitorar a performance de rede de sua instância do EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-network-performance-ena.html) no *Guia do usuário do Amazon EC2*.

### Monitorar transações no estado de “inatividade em transação”
<a name="wait-event.clientread.actions.check-idle-in-transaction"></a>

Verifique se você tem um número cada vez maior de conexões `idle in transaction`. Para isso, monitore a coluna `state` na tabela `pg_stat_activity`. Talvez seja possível identificar a origem da conexão executando uma consulta semelhante à seguinte.

```
select client_addr, state, count(1) from pg_stat_activity 
where state like 'idle in transaction%' 
group by 1,2 
order by 3 desc
```