Resolver erros de prazo excedido do Spanner

Nesta página, você encontra uma visão geral dos erros de tempo limite excedido do Spanner: o que são, por que ocorrem e como depurá-los e resolvê-los.

Ao acessar as APIs do Spanner, as solicitações podem falhar devido a erros DEADLINE_EXCEEDED. Esse erro indica que uma resposta não foi recebida dentro do período de tempo limite configurado.

Um erro de prazo excedido pode ocorrer por vários motivos, como instâncias do Spanner sobrecarregadas, esquemas ou consultas não otimizadas. Esta página descreve cenários comuns em que ocorre um erro de prazo excedido e fornece um guia sobre como investigar e resolver esses problemas.

Filosofia de prazo e novas tentativas do Spanner

O prazo e a filosofia de novas tentativas do Spanner são diferentes de muitos outros sistemas. No Spanner, especifique um prazo de tempo limite como o período máximo em que uma resposta é útil. Definir um prazo artificialmente curto apenas para tentar novamente a mesma operação imediatamente não é recomendado, já que isso leva a situações em que as operações nunca são concluídas. Nesse contexto, as seguintes estratégias e operações não são recomendadas. Elas são contraproducentes e prejudicam o comportamento interno de novas tentativas do Spanner:

  • Definir um prazo muito curto. Isso significa que a operação não é resiliente a aumentos ocasionais de latência de cauda e não pode ser concluída antes de atingir o tempo limite. Em vez disso, defina um prazo que seja o tempo máximo em que uma resposta é útil.

  • Definir um prazo muito longo e cancelar a operação antes que ele seja excedido. Isso leva a novas tentativas e desperdício de trabalho em cada uma delas. No total, isso pode criar uma carga adicional significativa na sua instância.

O que é um erro de prazo excedido?

Ao usar uma das bibliotecas de cliente do Spanner, a camada gRPC subjacente cuida da comunicação, da serialização, da desserialização e da aplicação de prazos. Os prazos permitem que o aplicativo especifique por quanto tempo ele está disposto a esperar que uma solicitação seja concluída antes de ser encerrada com o erro de prazo excedido.

O guia de configuração de tempo limite mostra como especificar prazos (ou tempos limite) em cada uma das bibliotecas de cliente do Spanner compatíveis. As bibliotecas de cliente do Spanner usam as configurações de política de tempo limite e repetição padrão, definidas nos seguintes arquivos de configuração:

Para saber mais sobre os prazos do gRPC, consulte gRPC e prazos.

Como investigar e resolver erros comuns de tempo limite excedido

Você pode encontrar erros DEADLINE_EXCEEDED para os seguintes tipos de problemas:

Problemas com a API de acesso aos dados

Uma instância do Spanner precisa ser configurada adequadamente para suas cargas de trabalho específicas a fim de evitar problemas com a API de acesso a dados. As seções a seguir descrevem como investigar e resolver diferentes problemas da API de acesso a dados.

Verificar a carga da CPU da instância do Spanner

A latência da solicitação pode aumentar significativamente à medida que a utilização da CPU ultrapassa o limite recomendado de integridade. É possível verificar a utilização da CPU do Spanner no console de monitoramento fornecido no console Google Cloud . Também é possível criar alertas com base no uso da CPU da instância.

Resolução

Para saber como reduzir o uso da CPU da instância, consulte Redução do uso da CPU.

Verificar o detalhamento da latência de ponta a ponta da solicitação

À medida que uma solicitação viaja do cliente para os servidores do Spanner e volta, há vários saltos de rede que precisam ser feitos: da biblioteca de cliente para o Google Front End (GFE); do GFE para o front-end da API Spanner; e, finalmente, do front-end da API Spanner para o banco de dados do Spanner. Se houver problemas de rede em qualquer uma dessas etapas, você poderá receber erros de prazo excedido.

É possível capturar a latência em cada estágio. Para saber mais, consulte Pontos de latência em uma solicitação do Spanner. Para saber onde a latência ocorre no Spanner, consulte identificar onde a latência ocorre no Spanner.

Resolução

Depois de obter o detalhamento da latência, você pode usar métricas para diagnosticar a latência, entender por que ela está acontecendo e encontrar soluções.

Problemas com a API Data

Alguns padrões de uso não ideais da API Data do Spanner podem causar erros de prazo excedido. Nesta seção, fornecemos diretrizes sobre como verificar esses padrões de uso não ideais.

Verificar consultas caras

Tentar executar consultas caras que não são executadas dentro do prazo de tempo limite configurado nas bibliotecas de cliente pode resultar em um erro de prazo excedido. Alguns exemplos de consultas caras incluem, mas não se limitam a, verificações completas de uma tabela grande, junções cruzadas em várias tabelas grandes ou uma execução de consulta com um predicado em uma coluna não chave (também uma verificação completa da tabela).

É possível inspecionar consultas caras usando a tabela de estatísticas de consulta e a tabela de estatísticas de transação. Essas tabelas mostram informações sobre consultas e transações de execução lenta, como o número médio de linhas lidas, o número médio de bytes lidos, o número médio de linhas verificadas e muito mais. Além disso, é possível gerar planos de execução de consulta para inspecionar melhor como as consultas estão sendo executadas.

Resolução

Para otimizar suas consultas, use o guia de práticas recomendadas para consultas SQL. Você também pode usar os dados obtidos nas tabelas de estatísticas mencionadas anteriormente e os planos de execução para otimizar suas consultas e fazer mudanças de esquema nos bancos de dados. Essas práticas recomendadas podem ajudar a reduzir o tempo de execução das instruções e, assim, evitar erros de prazo excedido.

Verificar a contenção de bloqueio

As transações do Spanner precisam adquirir bloqueios para serem confirmadas. Aplicativos com alta capacidade de processamento podem fazer com que as transações disputem os mesmos recursos, aumentando o tempo de espera para obter os bloqueios e afetando o desempenho geral. Isso pode resultar em prazos excedidos para qualquer solicitação de leitura ou gravação.

Para encontrar a causa raiz de transações de leitura e gravação com alta latência, use a tabela de estatísticas de bloqueio e confira esta postagem do blog. Na tabela de estatísticas de bloqueio, você encontra as chaves de linha com os maiores tempos de espera de bloqueio.

Este guia de solução de problemas de conflitos de bloqueio explica como encontrar as transações que estão acessando as colunas envolvidas no conflito de bloqueio. Você também pode descobrir quais transações estão envolvidas em um conflito de bloqueio usando o guia de solução de problemas com tags de transação.

Resolução

Aplique estas práticas recomendadas para reduzir a contenção de bloqueios. Além disso, use transações somente leitura para casos de uso de leituras simples e evite conflitos de bloqueio com as gravações. O uso de transações de leitura e gravação deve ser reservado para gravações ou fluxos de trabalho mistos de leitura e gravação. Seguir estas etapas melhora a latência geral do tempo de execução da transação e reduz os erros de prazo excedido.

Verificar esquemas não otimizados

Antes de projetar um esquema de banco de dados ideal para seu banco de dados do Spanner, considere os tipos de consultas que serão executadas nele. Esquemas abaixo do ideal podem causar problemas de desempenho ao executar algumas consultas. Esses problemas de desempenho podem impedir que as solicitações sejam concluídas dentro do prazo configurado.

Resolução

O design de esquema mais adequado depende das leituras e gravações feitas no banco de dados. As práticas recomendadas de design de esquema e os guias de práticas recomendadas de SQL precisam ser seguidos, independentemente das especificidades do esquema. Seguindo estes guias, você evita os problemas mais comuns de design de esquema. Outras causas principais de desempenho ruim são atribuídas à escolha de chaves primárias, ao layout da tabela (consulte Usar tabelas intercaladas para acesso mais rápido), ao design do esquema (consulte Otimizar o esquema para desempenho) e ao desempenho do nó configurado na instância do Spanner (consulte Visão geral da performance do Spanner).

Verificar se há superutilizações pontuais

Como o Spanner é um banco de dados distribuído, o design do esquema precisa evitar pontos de acesso. Por exemplo, a criação de colunas monotonicamente crescentes limita o número de divisões com que o Spanner pode trabalhar para distribuir a carga de trabalho de maneira uniforme. Esses gargalos podem resultar em tempos limite. Além disso, use o Key Visualizer para resolver problemas de desempenho causados por hotspots.

Resolução

Consulte as resoluções identificadas na seção anterior Verificar esquemas não otimizados como primeira etapa para resolver esse problema. Redesenhe o esquema do banco de dados e use índices intercalados para evitar índices que possam causar pontos de acesso. Se seguir essas etapas não resolver o problema, consulte o guia de escolha de uma chave primária para evitar pontos de acesso. Por fim, evite padrões de tráfego abaixo do ideal, como leituras de grande intervalo, que podem impedir a divisão com base na carga.

Verificar se há tempos limite configurados incorretamente

As bibliotecas de cliente oferecem tempos limite padrão razoáveis para todas as solicitações no Spanner. No entanto, essas configurações padrão podem precisar ser ajustadas para sua carga de trabalho específica. É importante observar o custo das suas consultas e ajustar os prazos para que sejam adequados ao seu caso de uso específico.

Resolução

As configurações padrão de tempos limite são adequadas para a maioria dos casos de uso. Os usuários podem substituir essas configurações (consulte o guia de tempo limite e novas tentativas personalizados), mas não é recomendável usar tempos limite mais agressivos do que os padrões. Se você decidir mudar o tempo limite, defina-o como a quantidade real de tempo que o aplicativo está disposto a aguardar pelo resultado. Você pode testar tempos limite configurados mais longos, mas nunca defina um tempo limite menor do que o tempo real que o aplicativo está disposto a aguardar, porque isso faria com que a operação fosse repetida com mais frequência.

Problemas com a API Admin

As solicitações da API Admin são operações caras quando comparadas às solicitações da API de dados. Solicitações de administrador, como CreateInstance, CreateDatabase ou CreateBackups, podem levar muitos segundos antes de retornar uma resposta. As bibliotecas de cliente do Spanner definem prazos de 60 minutos para solicitações de administrador de instância e banco de dados. Isso garante que o servidor tenha a oportunidade de concluir a solicitação antes que o cliente tente novamente ou falhe.

Resolução

Se você estiver usando a biblioteca de cliente do Spanner do Google para acessar a API de administrador, verifique se a biblioteca de cliente está atualizada e usando a versão mais recente. Se você estiver acessando a API Spanner diretamente por uma biblioteca de cliente criada, verifique se não há configurações de prazo mais agressivas do que as padrão (60 minutos) para sua instância e solicitações de administrador de banco de dados.

Google Cloud problemas no console

As consultas emitidas na página do Spanner Studio no console Google Cloud não podem exceder cinco minutos. Se você criar uma consulta cara que leva mais de cinco minutos para ser executada, vai receber a seguinte mensagem de erro:

Captura de tela da mensagem de erro "Prazo excedido" do console Google Cloud

O back-end vai cancelar a consulta com falha, e a transação poderá ser reverter se necessário.

Resolução

Você pode reescrever a consulta usando o guia de práticas recomendadas para consultas SQL.

Problemas do Dataflow

No Apache Beam, a configuração de tempo limite padrão é de duas horas para operações de leitura e 15 segundos para operações de commit. Essas configurações permitem operações mais longas em comparação com os tempos limite de prazo da biblioteca de cliente independente. No entanto, ainda é possível receber um erro de tempo limite e prazo excedido quando os itens de trabalho são muito grandes. Se necessário, personalize a configuração de tempo limite de commit do Apache Beam.

Resolução

Se ocorrer um erro de prazo excedido nas etapas ReadFromSpanner / Execute query / Read from Spanner / Read from Partitions, verifique a tabela de estatísticas de consulta para descobrir qual consulta verificou um grande número de linhas. Em seguida, modifique essas consultas para tentar reduzir o tempo de execução.

Outro exemplo de erro de tempo limite excedido do Dataflow é mostrado na seguinte mensagem de exceção:

exception:
     org.apache.beam.sdk.util.UserCodeException:
     com.google.cloud.spanner.SpannerException: DEADLINE_EXCEEDED:
     io.grpc.StatusRuntimeException: DEADLINE_EXCEEDED: deadline exceeded after
     3599.999905380s.
     [remote_addr=batch-spanner.googleapis.com/172.217.5.234:443] at
 org.apache.beam.runners.dataflow.worker.GroupAlsoByWindowsParDoFn$1.output(GroupAlsoByWindowsParDoFn.java:184)

Esse tempo limite ocorreu porque os itens de trabalho são muito grandes. No exemplo anterior, as duas recomendações a seguir podem ajudar. Primeiro, tente ativar o serviço de reprodução aleatória, se ele ainda não estiver ativado. Em segundo lugar, tente ajustar as configurações de leitura do banco de dados, como maxPartitions e partitionSizeBytes. Para mais informações, consulte PartitionOptions para tentar reduzir o tamanho do item de trabalho. Um exemplo de como fazer isso pode ser encontrado neste modelo do Dataflow.

Outros recursos para resolver problemas de prazo excedido

Se você ainda estiver vendo um erro DEADLINE_EXCEEDED depois de concluir as etapas de solução de problemas, abra um caso de suporte se você passar pelas seguintes situações:

  • Uma alta latência do Google Front End, mas baixa latência de solicitação da API Spanner
  • Uma alta latência de solicitação da API Spanner, mas uma baixa latência de consulta

Você também pode consultar os seguintes recursos de solução de problemas: