Como solucionar problemas de alta utilização da CPU em meu cluster do Amazon OpenSearch Service?

Última atualização: 05-08-2021

Meus nós de dados estão mostrando alto uso da CPU no cluster do Amazon OpenSearch Service (sucessor do Amazon Elasticsearch Service). Como corrigir isso?

Breve descrição

É uma melhor prática fazer a manutenção da utilização da CPU para garantir que o OpenSearch Service tenha recursos suficientes para executar suas tarefas. Um cluster com uma alta utilização constante da CPU pode ter a performance degradada. Quando o cluster está sobrecarregado, o OpenSearch Service deixa de responder, resultando em uma solicitação de tempo limite.

Para solucionar problemas de alta utilização da CPU no cluster, considere as seguintes abordagens:

  • Use a API nodes hot threads. (Para obter mais informações, consulte API Nodes hot threads no site do Elasticsearch.)
  • Confira a operação de gravação ou o grupo de threads de API em massa. (Para obter mais informações, consulte API em massa no site do Elasticsearch.)
  • Confira o grupo de threads de pesquisa. (Para obter mais informações, consulte Grupos de threads no site do Elasticsearch.)
  • Confira o grupo de threads de mesclagem do Apache Lucene. (Para obter mais informações, consulte Mesclagem no site do Elasticsearch.)

Resolução

Use a API nodes hot threads

Se houver picos constantes de CPU no cluster do OpenSearch Service, use a API nodes hot threads. A API nodes hot threads atua como um gerenciador de tarefas, mostrando o detalhamento de todos os threads com uso intensivo de recursos que estão sendo executados no cluster.

Veja aqui um exemplo de saída da API nodes hot threads:

GET _nodes/hot_threads

100.0% (131ms out of 500ms) cpu usage by thread 
'opensearch[xxx][search][T#62]' 10/10 snapshots sharing following 10 
elements sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
java.util.concurrent.LinkedTransferQueue.awaitMatch(LinkedTransferQueue.java:737)
 
java.util.concurrent.LinkedTransferQueue.xfer(LinkedTransferQueue.java:647)
 
java.util.concurrent.LinkedTransferQueue.take(LinkedTransferQueue.java:1269)
 
org.opensearch.common.util.concurrent.SizeBlockingQueue.take(SizeBlockingQueue.java:162)
 
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)
Observação: a saída da nodes hot threads lista as informações para cada nó. O comprimento da saída depende de quantos nós estão sendo executados no cluster do OpenSearch Service.

Além disso, use a API cat nodes para visualizar o detalhamento atual da utilização de recursos. É possível restringir o subconjunto de nós com a maior utilização da CPU com o seguinte comando:

GET _cat/nodes?v&s=cpu:desc

A última coluna na saída exibe o nome do nó. Para obter mais informações, consulte a API cat nodes no site do Elasticsearch.

Em seguida, passe o nome do nó relevante para a API hot threads:

GET _nodes/<node-name>/hot_threads

Para obter mais informações, consulte a API hot threads no site do Elasticsearch.

A saída da nodes hot threads tem a seguinte aparência:

<percentage> of cpu usage by thread 'opensearch[<nodeName>][<thread-name>]

O nome do thread indica quais processos do OpenSearch Service estão consumindo alta CPU.

Confira a operação de gravação ou o grupo de threads de API em massa

Um erro 429 no OpenSearch Service pode indicar que o cluster está lidando com muitas solicitações de indexação em massa. Quando há picos constantes de CPU no cluster, o OpenSearch Service rejeita as solicitações de indexação em massa.

O grupo de threads de gravação lida com solicitações de indexação, que incluem operações de API em massa. Para confirmar se o cluster está lidando com muitas solicitações de indexação em massa, confira a métrica IndexingRate no Amazon CloudWatch.

Se o cluster estiver lidando com muitas solicitações de indexação em massa, considere as seguintes abordagens:

  • Reduza o número de solicitações em massa no cluster.
  • Reduza o tamanho de cada solicitação em massa para que os nós possam processá-las com mais eficiência.
  • Se o Logstash estiver sendo usado para enviar dados para o cluster do OpenSearch Service, reduza o tamanho do lote ou o número de operadores.
  • Se a taxa de ingestão do cluster ficar mais lenta, dimensione o cluster (horizontal ou verticalmente). Para expandir verticalmente o cluster, aumente o número de nós e o tipo de instância para que o OpenSearch Service possa processar adequadamente as solicitações recebidas.

Confira o grupo de threads de pesquisa

Um grupo de threads de pesquisa que consome alta CPU indica que as consultas de pesquisa estão sobrecarregando o cluster do OpenSearch Service. O cluster pode ficar sobrecarregado por uma única consulta de longa duração. Um aumento de consultas realizadas pelo cluster também pode afetar o grupo de threads de pesquisa.

Para conferir se uma única consulta está aumentando o uso da CPU, use a API task management. Por exemplo:

GET _tasks?actions=*search&detailed

A API de gerenciamento de tarefas busca todas as consultas de pesquisa ativas que estão sendo executadas no cluster. Para obter mais informações, consulte API de gerenciamento de tarefas no site do Elasticsearch.

Veja abaixo um exemplo de saída:

{
  "nodes": {
    "U4M_p_x2Rg6YqLujeInPOw": {
      "name": "U4M_p_x",
      "roles": [
        "data",
        "ingest"
      ],
      "tasks": {
        "U4M_p_x2Rg6YqLujeInPOw:53506997": {
          "node": "U4M_p_x2Rg6YqLujeInPOw",
          "id": 53506997,
          "type": "transport",
          "action": "indices:data/read/search",
          "description": """indices[*], types[], search_type[QUERY_THEN_FETCH], source[{"size":10000,"query":{"match_all":{"boost":1.0}}}]""",
          "start_time_in_millis": 1541423217801,
          "running_time_in_nanos": 1549433628,
          "cancellable": true,
          "headers": {}
        }
      }
    }
  }
}

Confira o campo description (descrição) para identificar qual consulta específica está sendo executada. O campo running_time_in_nanos indica há quanto tempo uma consulta está sendo executada. Para diminuir o uso da CPU, cancele a consulta de pesquisa que está consumindo CPU alta. A API de gerenciamento de tarefas também oferece suporte a uma chamada _cancel.

Observação: certifique-se de registrar o ID da tarefa da saída para cancelar uma tarefa específica. Neste exemplo, o ID da tarefa é “U4M_p_x2Rg6YqLujeInPOw:53506997”.

Veja aqui um exemplo de chamada POST de gerenciamento de tarefas:

POST _tasks/U4M_p_x2Rg6YqLujeInPOw:53506997/_cancel

A chamada POST de gerenciamento de tarefas marca a tarefa como “cancelada”, liberando quaisquer recursos da AWS dependentes. Caso tenha várias consultas em execução no cluster, use a chamada POST para cancelar as consultas uma de cada vez. Cancele cada consulta até que o cluster retorne ao estado normal. Também é uma melhor prática definir um valor de tempo limite adequado no corpo da consulta para evitar altos picos de CPU. (Para obter mais informações, consulte Parâmetros de pesquisa do corpo da solicitação no site do Elasticsearch.) Para verificar se o número de consultas ativas diminuiu, confira a métrica SearchRate no Amazon CloudWatch.

Observação: cancelar todas as consultas de pesquisa ativas ao mesmo tempo no cluster do OpenSearch Service pode causar erros no lado da aplicação cliente.

Confira o grupo de threads de mesclagem do Apache Lucene

O OpenSearch Service usa o Apache Lucene para indexar e pesquisar documentos no cluster. O Apache Lucene executa operações de mesclagem para reduzir o número efetivo de segmentos necessários para cada shard e remover quaisquer documentos excluídos. Esse processo é executado sempre que novos segmentos são criados em um shard.

Caso perceba que uma operação de thread de mesclagem do Apache Lucene está afetando o uso da CPU, aumente a configuração refresh_interval dos índices de cluster do OpenSearch Service. O aumento na configuração refresh_interval desacelera a criação de segmentos do cluster.

Observação: um cluster que está migrando índices para o armazenamento UltraWarm pode aumentar a utilização da CPU. Uma migração UltraWarm geralmente envolve uma operação de API de mesclagem forçada, que pode fazer uso intensivo da CPU.

Para conferir se há migrações UltraWarm, use o seguinte comando:

GET _ultrawarm/migration/_status?v