Investigar a alta utilização da CPU

Nesta página, descrevemos como usar métricas e gráficos de utilização da CPU, além de outras ferramentas de introspecção, para investigar o alto uso de CPU no seu banco de dados.

Identificar se uma tarefa do sistema ou do usuário está causando alta utilização da CPU

O console do Google Cloud fornece várias ferramentas de monitoramento para o Spanner, permitindo que você veja o status das métricas mais essenciais para sua instância. Um deles é um gráfico chamado Utilização da CPU: total. O gráfico mostra a utilização total da CPU como uma porcentagem dos recursos da CPU da instância, dividida por prioridade de tarefa e tipo de operação. Há dois tipos de tarefas: tarefas do usuário, como leituras e gravações, e tarefas do sistema, que abrangem tarefas automatizadas em segundo plano, como compactação e preenchimento de índices.

A Figura 1 mostra um exemplo do gráfico Uso da CPU: total.

Exemplo de uso da CPU: gráfico total

Figura 1. Gráfico Utilização da CPU: total no painel do Monitoring no console do Google Cloud.

Agora, imagine que você receba um alerta do Cloud Monitoring informando que o uso da CPU aumentou significativamente. Abra o painel Monitoramento da instância no console do Google Cloud e analise o gráfico Utilização da CPU: total no Console do Cloud. Conforme mostrado na Figura 1, é possível ver o aumento da utilização da CPU em tarefas de alta prioridade do usuário. A próxima etapa é descobrir qual operação de usuário de alta prioridade está causando esse aumento no uso da CPU.

É possível visualizar essa e outras métricas em uma série temporal usando os painéis do Insights de consulta. Esses painéis pré-criados ajudam a ver picos no uso da CPU e a identificar consultas ineficientes.

Identifique qual operação do usuário está causando o pico de utilização da CPU

O gráfico Utilização da CPU: total na Figura 1 mostra que tarefas do usuário de alta prioridade são a causa do maior uso da CPU.

A seguir, você vai analisar o gráfico Utilização da CPU por tipo de operação no Console do Cloud. Este gráfico mostra a utilização da CPU detalhada por operações iniciadas pelo usuário de alta, média e baixa prioridade.

O que é uma operação iniciada pelo usuário?

Uma operação iniciada pelo usuário é uma operação iniciada por meio de uma solicitação de API. O Spanner agrupa essas solicitações em tipos ou categorias de operação. É possível exibir cada tipo de operação como uma linha no gráfico Utilização da CPU por tipo de operação. A tabela a seguir descreve os métodos de API incluídos em cada tipo de operação.

Operação Métodos da API Descrição
read_readonly Read
StreamingRead
Inclui leituras que buscam linhas do banco de dados usando pesquisas e verificações de chave.
read_readwrite Read
StreamingRead
Inclui leituras dentro de transações de leitura e gravação.
read_withpartitiontoken Read
StreamingRead
Inclui operações de leitura realizadas usando um conjunto de tokens de partição.
executesql_select_readonly ExecuteSql
ExecuteStreamingSql
Inclui a instrução SQL Select e as consultas de fluxo de alteração.
executesql_select_readwrite ExecuteSql
ExecuteStreamingSql
Inclui a execução da instrução Select em transações de leitura e gravação.
executesql_select_withpartitiontoken ExecuteSql
ExecuteStreamingSql
Inclui a execução da instrução Select executada usando um conjunto de tokens de partição.
executesql_dml_readwrite ExecuteSql
ExecuteStreamingSql
ExecuteBatchDml
Inclui executar a instrução SQL DML.
executesql_dml_partitioned ExecuteSql
ExecuteStreamingSql
ExecuteBatchDml
Inclui a execução da instrução SQL DML particionada.
beginorcommit BeginTransaction
Confirmação
Reverter
Inclui transações de início, confirmação e reversão.
misc PartitionQuery
PartitionRead
GetSession
CreateSession
Inclui PartitionQuery, PartitionRead, Criar banco de dados, criar instância, operações relacionadas à sessão, operações de exibição internas com limite de tempo etc.

Veja um exemplo de gráfico da métrica de utilização da CPU por tipos de operação.

Exemplo de gráfico de utilização da CPU por tipo de operação

Figura 2. Gráfico Uso da CPU por tipo de operação no console do Google Cloud.

Para limitar a exibição a uma prioridade específica, use o menu Prioridade na parte superior do gráfico. Ela representa cada tipo ou categoria de operação em um gráfico de linhas. As categorias listadas abaixo do gráfico identificam cada gráfico. É possível ocultar e mostrar cada gráfico marcando ou desmarcando o respectivo filtro de categoria.

Se preferir, também é possível criar esse gráfico no Metrics Explorer conforme descrito abaixo:

Crie um gráfico para a utilização da CPU por tipo de operação no Metrics Explorer

  1. No console do Google Cloud, selecione Monitoramento ou use o botão a seguir:

    Acessar Monitoring

  2. Selecione Metrics Explorer no painel de navegação.
  3. No campo Localizar tipo de recurso e métrica, insira o valor spanner.googleapis.com/instance/cpu/utilization_by_operation_type e clique na linha exibida abaixo da caixa.
  4. No campo Filtro, insira o valor instance_id e, em seguida, o ID da instância a ser examinada e clique em Aplicar.
  5. No campo Agrupar por, selecione category na lista suspensa. O gráfico mostrará a utilização da CPU das tarefas do usuário agrupadas por tipo de operação ou categoria.

Embora a métrica Utilização da CPU por prioridade na seção anterior tenha ajudado a determinar se um usuário ou tarefa do sistema causou um aumento no uso de recursos da CPU, com a métrica Utilização da CPU por tipo de operação é possível se aprofundar e descobrir o tipo de operação iniciada pelo usuário por trás desse aumento no uso da CPU.

Identificar qual solicitação do usuário está contribuindo para o aumento do uso da CPU

Para determinar qual solicitação específica do usuário é responsável pelo pico na utilização da CPU no gráfico do tipo de operação executesql_select_readonly mostrado na Figura 2, use as tabelas de estatísticas de introspecção integradas para ter mais insights.

Use a tabela a seguir como guia para determinar qual tabela de estatísticas consultar com base no tipo de operação que está causando o alto uso da CPU.

Tipo de operação Query Ler Transação
read_readonly Não Sim Não
read_readwrite Não Sim Sim
read_withpartitiontoken Não Sim Não
executesql_select_readonly Sim Não Não
executesql_select_withpartitiontoken Sim Não Não
executesql_select_readwrite Sim Não Sim
executesql_dml_readwrite Sim Não Sim
executesql_dml_partitioned Não Não Sim
beginorcommit Não Não Sim

Por exemplo, se read_withpartitiontoken for o problema, solucione problemas usando estatísticas de leitura.

Nesse cenário, a operação executesql_select_readonly parece ser o motivo do aumento no uso da CPU que você está observando. Com base na tabela anterior, analise as estatísticas de consulta para descobrir quais consultas são caras, que são executadas com frequência ou que verifica muitos dados.

Para descobrir as consultas com o maior uso de CPU na hora anterior, execute a consulta a seguir na tabela de estatísticas query_stats_top_hour.

SELECT text,
       execution_count AS count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;

O resultado mostrará consultas classificadas pelo uso da CPU. Depois de identificar a consulta com o maior uso de CPU, tente as opções a seguir para ajustá-la.

  • Analise o plano de execução de consulta para identificar quaisquer ineficiências possíveis que possam contribuir para a alta utilização da CPU.

  • Revise sua consulta para garantir que ela esteja seguindo as práticas recomendadas de SQL para o Cloud Spanner.

  • Analise o design do esquema do banco de dados e atualize o esquema para permitir consultas mais eficientes.

  • Estabeleça um valor de referência para o número de vezes que o Spanner executa uma consulta durante um intervalo. Com essa linha de base, você poderá detectar e investigar a causa de quaisquer desvios inesperados do comportamento normal.

Se você não conseguiu encontrar uma consulta com uso intensivo de CPU, adicione capacidade de computação à instância. A adição de capacidade de computação fornece mais recursos de CPU e permite que o Spanner processe uma carga de trabalho maior. Para mais informações, consulte Como aumentar a capacidade de computação.

A seguir