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.

Identifique se uma tarefa do sistema ou do usuário está causando um alto uso da CPU

O console do Google Cloud oferece 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. Este gráfico mostra o uso total da CPU como porcentagem dos recursos da CPU da instância, detalhado por prioridade de tarefa e tipo de operação. Existem 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 Utilização da CPU - Total.

Exemplo de utilização 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 examine o gráfico Utilização da CPU: total no console. Conforme mostrado na Figura 1, é possível ver o aumento da utilização da CPU por tarefas de usuário de alta prioridade. 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 de Insights de consulta. Esses painéis pré-criados ajudam você a visualizar picos de utilização da CPU e 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 as tarefas do usuário de alta prioridade são a causa do maior uso da CPU.

Em seguida, 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 dividida 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, e é 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 SELECT SQL e as consultas de fluxo de alterações.
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 Utilização da CPU por tipo de operação no console do Google Cloud.

É possível limitar a exibição a uma prioridade específica usando o menu Prioridade na parte superior do gráfico. Ele 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.

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

Crie um gráfico de uso da CPU por tipo de operações no Metrics Explorer

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

    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 da seção anterior tenha ajudado a determinar se uma tarefa do usuário ou 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 de tipos 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 No Sim No
read_readwrite No Sim Sim
read_withpartitiontoken No Sim No
executesql_select_readonly Sim No No
executesql_select_withpartitiontoken Sim No No
executesql_select_readwrite Sim No Sim
executesql_dml_readwrite Sim No Sim
executesql_dml_partitioned No No Sim
beginorcommit No No 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, você deve consultar as estatísticas de consulta ao lado para descobrir quais consultas são caras, são executadas com frequência ou verificam muitos dados.

Para descobrir as consultas com o maior uso de CPU na hora anterior, execute a seguinte consulta 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 verificar se ela está seguindo as práticas recomendadas de SQL.

  • 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. Adicionar capacidade de computação fornece mais recursos de CPU e permite que o Spanner lide com uma carga de trabalho maior. Para mais informações, consulte Como aumentar a capacidade de computação.

A seguir