Embora o Memorystore para Redis forneça métricas em tempo real do lado do servidor para monitorar a capacidade de processamento, a utilização da CPU e o uso da memória, esses dados sozinhos podem não explicar por que o aplicativo cliente apresenta alta latência em sistemas distribuídos complexos.
As métricas do lado do cliente resolvem esse problema, oferecendo transparência no ciclo completo de solicitação-resposta. Elas medem um comando desde o momento em que o aplicativo o inicia até que ele processe a resposta. Ao capturar esses pontos de dados, é possível determinar com precisão se a latência se origina da lógica do aplicativo, do caminho de rede ou do servidor Redis.
Antes de começar
Verifique se o aplicativo cliente usa uma conta de serviço e se os seguintes papéis do Identity and Access Management (IAM) estão atribuídos a ela:
roles/cloudtrace.agent(agente do Cloud Trace)roles/monitoring.metricWriter(gravador de métricas do Monitoring)
Para mais informações sobre como conceder papéis, consulte o início rápido Conceder um papel do IAM usando o Google Cloud console.
Ativar a API Cloud Monitoring
Para exportar métricas do lado do cliente para o Monitoring, é necessário que a API Monitoring esteja ativada no aplicativo. A exportação e a visualização dessas métricas no Monitoring permitem identificar a causa raiz dos gargalos para determinar a origem da latência.
Para ativar a API Monitoring, faça o seguinte:
No Google Cloud console do, acesse a página APIs e serviços.
Selecione o projeto em que você criou a instância do Memorystore para Redis.
Clique em Ativar APIs e serviços.
Pesquise
monitoring.Nos resultados da pesquisa, clique em API Cloud Monitoring.
Se a mensagem API ativada aparecer, a API já estará ativada. Caso contrário, clique em Ativar.
Ativar a API Cloud Trace
Para visualizar traces distribuídos no Trace, é necessário ativar a API Trace. Em seguida, use o Trace Explorer para visualizar esses traces, diagnosticar gargalos e isolar a origem da latência no aplicativo.
Para ativar a API Trace, faça o seguinte:
No Google Cloud console do, acesse a página APIs e serviços.
Selecione o projeto em que você criou a instância do Memorystore para Redis.
Clique em Ativar APIs e serviços.
Pesquise
trace.Nos resultados da pesquisa, clique em API Cloud Trace.
Se a mensagem API ativada aparecer, a API já estará ativada. Caso contrário, clique em Ativar.
Ativar métricas do lado do cliente
Para ativar as métricas do lado do cliente, adicione o OpenTelemetry SDK, o exportador do Cloud Monitoring e o exportador do Cloud Trace ao código do aplicativo. A instrumentação do OpenTelemetry, que é executada diretamente na biblioteca de cliente do Redis do aplicativo, captura as métricas. Isso permite que o aplicativo grave pontos de dados de latência e os exporte para o Monitoring e o Trace para visualização.
Para ativar as métricas do lado do cliente, você pode usar Go, Java, Node.js, ou Python. As informações para ativar as métricas de cada linguagem aparecem nas guias a seguir.
Go
Para instalar as dependências necessárias do OpenTelemetry e do Google Cloud exportador, execute os seguintes comandos no terminal:
go get github.com/gomodule/redigo/redis@latest go get go.opentelemetry.io/otel go get go.opentelemetry.io/otel/sdk/trace go get go.opentelemetry.io/otel/sdk/metric go get github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace go get github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric
Para ativar as métricas do lado do cliente, crie um arquivo
main.goe adicione o seguinte código a ele:Execute o aplicativo por pelo menos um minuto para dar ao exportador tempo suficiente para agrupar e enviar as métricas publicadas ao Monitoring.
Java
Para instalar as dependências necessárias do OpenTelemetry e do Google Cloud exportador, adicione o seguinte código ao arquivo
pom.xmldo aplicativo:Para ativar as métricas do lado do cliente, crie um arquivo
RedisTelemetryApp.javae adicione o seguinte código a ele:Execute o aplicativo por pelo menos um minuto para dar ao exportador tempo suficiente para agrupar e enviar as métricas publicadas ao Monitoring.
Node.js
Para instalar as dependências necessárias do OpenTelemetry e do Google Cloud exportador, execute os seguintes comandos no terminal:
npm install redis@^4.6.0 @opentelemetry/api@^1.9.0 @opentelemetry/sdk-trace-node@^2.1.0 @opentelemetry/sdk-trace-base@^2.1.0 @opentelemetry/sdk-metrics@^2.1.0 @opentelemetry/instrumentation@^0.205.0 @opentelemetry/instrumentation-redis@^0.67.0 @google-cloud/opentelemetry-cloud-trace-exporter@^3.0.0 @google-cloud/opentelemetry-cloud-monitoring-exporter@^0.21.0 @opentelemetry/resources@^2.1.0
Para ativar as métricas do lado do cliente, crie um arquivo
server.jse adicione o seguinte código a ele:Execute o aplicativo por pelo menos um minuto para dar ao exportador tempo suficiente para agrupar e enviar as métricas publicadas ao Monitoring.
Python
Para instalar as dependências necessárias do OpenTelemetry e do Google Cloud exportador, execute os seguintes comandos no terminal:
pip install redis==7.0.1 opentelemetry-api==1.39.1 opentelemetry-sdk==1.39.1 opentelemetry-instrumentation-redis==0.60b1 opentelemetry-exporter-gcp-trace==1.11.0 opentelemetry-exporter-gcp-monitoring==1.11.0a0
Para ativar as métricas do lado do cliente, crie um arquivo
main.pye adicione o seguinte código ao aplicativo:Execute o aplicativo por pelo menos um minuto para dar ao exportador tempo suficiente para agrupar e enviar as métricas publicadas ao Monitoring.
Visualizar métricas no Monitoring
Depois de ativar as métricas do lado do cliente e executar o aplicativo por pelo menos um minuto para dar ao exportador tempo suficiente para agrupar e enviar métricas ao Monitoring, use o Monitoring para visualizar as métricas, agrupá-las por operação ou instância e aplicar agregadores para monitorar o desempenho do aplicativo.
Para visualizar métricas no Monitoring, faça o seguinte:
No Google Cloud console do, acesse a página Metrics Explorer.
Selecionar o Google Cloud projeto.
Clique em Selecionar uma métrica.
Pesquise
workload.googleapis.com/redis.Selecione uma métrica do lado do cliente. Agrupe os dados por
operationeinstance, conforme necessário, e escolha um agregador. Para conhecer outras opções, consulte Selecionar métricas ao usar o Metrics Explorer.
Visualizar traces distribuídos no Trace
Depois que o aplicativo começar a exportar dados, você poderá usar o Trace para visualizar o ciclo completo de solicitação-resposta dos comandos do Redis. A visualização dos traces distribuídos no Trace permite diagnosticar gargalos para isolar rapidamente a origem exata da latência no aplicativo.
Para visualizar traces distribuídos no Trace, faça o seguinte:
No Google Cloud console, acesse a página Explorador de traces.
Selecione um trace recente representado por um ponto no gráfico de dispersão.
Examine a visualização em cascata para isolar a origem da latência, identificando os seguintes gargalos:
Duração total da solicitação: a barra de nível superior (principal) mostra o tempo total de espera para que a operação seja concluída.
Latência de rede e servidor (RTT): as barras filhas (como as marcadas como
GETouSET) mostram o tempo que o comando passou viajando pela rede e sendo executado no servidor do Memorystore para Redis.Bloqueio de conexão do cliente: se houver uma lacuna horizontal grande e vazia antes do início do período filho do Redis, a linha de execução do aplicativo estará aguardando uma conexão TCP disponível do pool de conexões.
Bloqueio de análise do aplicativo: se houver uma lacuna horizontal grande e vazia após o término do período filho do Redis, o aplicativo terá dificuldades para analisar ou processar o payload retornado. Isso geralmente acontece com strings JSON de vários megabytes.
Repetições: se você encontrar vários períodos filhos curtos para o mesmo comando ocorrendo sequencialmente no mesmo trace pai, o cliente poderá sofrer perda de pacotes de rede e precisará acionar o loop de repetição de backoff exponencial.
Resolver problemas
Esta seção lista problemas comuns de desempenho que podem ser identificados usando métricas do lado do cliente, explica as causas raiz e fornece orientações sobre como solucionar os problemas.
| Problema | Causa | Resolver problemas |
|---|---|---|
O aplicativo apresenta um pico repentino de latência, mas o Memorystore para Redis parece totalmente íntegro.
|
O gargalo está estritamente dentro do aplicativo. As linhas de execução tentam executar comandos do Redis, mas o pool de conexões está totalmente
esgotado. A alta redis_client_blocking_latency representa
o tempo que o código passa esperando por um soquete TCP disponível antes que o
comando seja enviado à rede. |
Para processar o tráfego simultâneo mais alto, aumente os
limites de tamanho do pool de conexões na configuração do cliente do Redis (por exemplo,
MaxActive para Go, MaxTotal para Java ou
max_connections para Node.js e Python). |
A solicitação é concluída, mas o endpoint leva muito mais tempo do que o esperado. Não há problemas associados à integridade da rede ou do servidor.
|
O Memorystore para Redis executa o comando e a rede transfere o
payload rapidamente (RTT baixo). No entanto, o payload retornado é grande (por
exemplo, uma string JSON de 15 MB). O aplicativo apresenta uma
redis_application_blocking_latency alta porque o aplicativo
consome recursos excessivos ao alocar memória e desserializar essa
string grande em um objeto. |
Otimize o modelo de dados. Não armazene blobs JSON enormes em chaves únicas.
Divida os dados usando hashes do Redis (HSET) e use
HGET ou HMGET para recuperar apenas os campos específicos
de que você precisa.
|
A latência do aplicativo voltado ao usuário aumenta, mas as métricas do Redis informam uma latência baixa do servidor e check-outs típicos do pool de conexões.
|
Como redis_client_rtt captura apenas o RTT de
solicitações bem-sucedidas, ele não reflete a duração do tempo limite de um pacote com falha. Quando o aplicativo apresenta quedas de pacotes temporárias ou redefinições de TCP, a lógica de repetição do cliente instrumentado incrementa o
redis_retry_count e aciona o loop de espera exponencial.
Isso introduz um tempo de espera entre as tentativas (por exemplo,
100ms, 200ms, ou 400ms). O usuário
tem uma latência total alta, mas a causa raiz subjacente é uma perda de
pacotes de rede, que aciona atrasos de espera do lado do cliente. |
Verifique os registros de fluxos de VPC para pacotes descartados, limitação de largura de banda,
ou anomalias de roteamento entre regiões. Se você tiver tempos limite agressivos,
verifique se os tempos limite de conexão do cliente (socket_timeout ou
connect_timeout) são maiores que o RTT esperado para considerar
a instabilidade de rede temporária. |
Tudo para e todas as camadas do pipeline de telemetria informam alta latência.
|
O Redis é de linha de execução única. Quando você executa um comando de complexidade de tempo O(N)
como KEYS *, SMEMBERS
em um conjunto enorme ou HGETALL em um hash com milhões de
campos, o mecanismo do Redis pausa para atender a essa solicitação. Enquanto esse comando
é executado, todas as outras solicitações de aplicativos são enfileiradas, causando um pico de latência
em todo o sistema. Como o redis_client_rtt personalizado corresponde à latência do servidor (commands/usec_per_call), o servidor que executa o comando é o gargalo. |
Abra o Trace e examine os comandos do Redis nos períodos lentos para identificar qual consulta causa o bloqueio. Substitua comandos de bloqueio por comandos sem bloqueio no código. Para iterar conjuntos de dados grandes de forma incremental sem bloquear a
linha de execução do servidor, use |
O aplicativo informa uma latência de linha de base consistente e elevada para todos os comandos do Redis, mesmo quando o tráfego é baixo.
|
O servidor Redis executa comandos instantaneamente, mas o aplicativo e a
instância são implantados em regiões diferentes (por exemplo,
us-central1 e us-east1). Cada pacote de rede
precisa viajar pela infraestrutura em nuvem física do Google Cloud entre esses
data centers geográficos. Isso resulta em uma penalidade de latência entre regiões obrigatória de velocidade da luz
para cada ida e volta. |
Para reduzir a latência, implante o aplicativo para que ele resida na mesma região e zona da instância. Para conferir a região do aplicativo e da instância, use o Google Cloud console. |
A seguir
- Saiba mais sobre as métricas do lado do cliente.
- Saiba mais sobre as métricas do lado do cliente disponíveis para o Memorystore para Redis.