Ir para o conteúdo

Como soluciono problemas de alta utilização da CPU no meu cluster do OpenSearch Service?

9 minuto de leitura
0

Meus nós de dados apresentam alta utilização de CPU no meu cluster do Amazon OpenSearch Service.

Breve descrição

Para solucionar problemas de alta utilização de CPU em seu cluster, realize as seguintes ações:

  • Use um runbook automatizado para identificar a causa da alta utilização de CPU.
  • Use a detecção de anomalias para identificar padrões.
  • Use a API de hot threads de nós para entender o uso de recursos.
  • Verifique a operação de gravação ou o grupo de threads de API em massa.
  • Verifique o grupo de threads de pesquisa.
  • Verifique o grupo de threads de mesclagem do Apache Lucene.
  • Verifique a pressão de memória de Java virtual machine (JVM).
  • Revise sua estratégia de fragmentos.
  • Escale seu cluster.
  • Otimize suas consultas.

É uma prática recomendada manter a utilização de CPU baixa o suficiente para que o OpenSearch Service execute suas tarefas. Um cluster com alta utilização de CPU de forma consistente pode enfrentar problemas de desempenho. O OpenSearch Service não responde a clusters sobrecarregados e você recebe uma solicitação de tempo limite.

Resolução

Use um runbook automatizado

Pré-requisito: Certifique-se de ter as permissões necessárias do AWS Identity and Access Management (AWS IAM) para executar o runbook. Para mais informações, consulte Permissões obrigatórias do IAM em AWSSupport-TroubleshootOpenSearchHighCPU.

Use o runbook AWSSupport-TroubleshootOpenSearchHighCPU do AWS Systems Manager Automation para solucionar problemas de alta utilização de CPU no OpenSearch Service.

A saída exibe as seguintes informações:

  • Hot threads
  • Tarefas em execução
  • Estatísticas do grupo de threads para cada nó no domínio
  • Informações sobre os nós no domínio classificados pela utilização de CPU
  • Alocação de fragmentos para cada nó de dados e seu espaço em disco
  • Estado de integridade e informações sobre a integridade do domínio do OpenSearch Service

Use a saída do runbook para identificar a causa da alta utilização de CPU.

Use a detecção de anomalias para identificar padrões

Para identificar possíveis problemas antes que eles causem interrupções, use a detecção de anomalias no Amazon OpenSearch Service para detectar automaticamente padrões incomuns em métricas, como a utilização de CPU. Para obter mais informações, consulte Tutorial: detectar uso elevado da CPU com detecção de anomalias.

Use a API de hot threads de nós

Se houver picos constantes de CPU em seu cluster do OpenSearch Service, execute o seguinte comando para visualizar as informações de todos os nós do cluster:

GET/_nodes/hot_threads

A duração da sua saída depende de quantos nós estão em execução no cluster do OpenSearch Service. Para obter mais informações sobre a API de hot threads de nós, consulte Nodes hot threads API (API de hot threads de nós) no site do OpenSearch.

Exemplo de saída:

GET _nodes/hot_threads
100.0% (131ms out of 500ms) cpu usage by thread 'opensearch[abc][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)

Também é possível usar a API de nós cat para visualizar a distribuição atual da utilização de recursos. Para visualizar os nós com a maior utilização de CPU, execute 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 sobre a API nós cat, consulte CAT nodes API (API de nós cat) no site do OpenSearch.

Em seguida, execute o seguinte comando para nós com alta utilização de CPU:

GET _nodes/node_id/hot_threads

Observação: substitua node_id pelo ID do node.

A saída mostra os processos do OpenSearch Service no nó que usa mais CPU. Se você ver um thread de mesclagem do Apache Lucene na saída, consulte Verificar o grupo de threads de mesclagem do Apache Lucene para solucionar problemas.

Exemplo de saída:

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

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

Se você receber uma mensagem de erro "429", o cluster pode ter muitas solicitações de indexação em massa. Quando há picos constantes de CPU no seu cluster, o OpenSearch Service rejeita as solicitações de indexação em massa.

O grupo de threads de gravação gerencia solicitações de indexação e inclui operações de API em massa. Para verificar se seu domínio está sob pressão devido ao excesso de solicitações de indexação em massa, verifique a métrica do Amazon CloudWatch IndexingRate.

Se seu cluster tiver muitas solicitações de indexação em massa, realize as seguintes ações:

  • Reduza o número de solicitações em massa em seu cluster.
  • Reduza o tamanho de cada solicitação em massa para que seus nós possam processá-la com mais eficiência.
  • Se você usar Logstash para fazer upload de dados para seu cluster do OpenSearch Service, reduza o tamanho do lote ou o número de processamentos.
  • Se a taxa de ingestão do seu cluster diminuir, escale seu cluster horizontal ou verticalmente.

Verifique o grupo de threads de pesquisa

Um grupo de threads de pesquisa que possui alta utilização de CPU mostra que as consultas de pesquisa sobrecarregam seu cluster do OpenSearch Service. Uma única consulta de longa duração pode sobrecarregar seu cluster. Um aumento nas consultas que seu cluster realiza também pode afetar seu grupo de threads de pesquisa.

Para verificar se uma única consulta aumenta sua utilização de CPU, execute o seguinte comando:

GET _tasks?actions=*search&detailed

A API de gerenciamento de tarefa mostra todas as consultas de pesquisa ativas executadas no seu cluster. Para mais informações, consulte List tasks API (API de tarefas de lista) no site do OpenSearch.

Na saída, verifique o campo descrição para identificar a consulta que está sendo executada. O campo running_time_in_nanos mostra o tempo de execução de uma consulta.

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": {}
                }
            }
        }
    }
}

Observação: para tarefas de pesquisa, a saída da API de gerenciamento de tarefa inclui somente o campo de descrição.

Para diminuir a utilização de CPU, execute o seguinte comando para cancelar a consulta de pesquisa com alta utilização de CPU:

POST _tasks/U4M_p_x2Rg6YqLujeInPOw:53506997/_cancel

Observação: substitua U4M_p_x2Rg6YqLujeInPOw:53506997 pelo ID da sua tarefa.

A consulta anterior marca a tarefa como cancelada e, em seguida, libera os recursos dependentes da AWS. Se várias consultas estiverem em execução no seu cluster, use o comando POST para cancelar cada consulta até que seu cluster retorne a um estado normal.

Para evitar picos de CPU, também é uma prática recomendada definir um valor limite no corpo da consulta. Para obter mais informações, consulte Search settings (Configurações de pesquisa) no site do OpenSearch. Para verificar se o número de consultas ativas diminuiu, consulte a métrica do CloudWatch SearchRate.

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

Verifique o grupo de threads de mesclagem do Apache Lucene

O OpenSearch Service usa o Apache Lucene para indexar e pesquisar documentos em seu cluster. Quando você cria novos segmentos de fragmento, o Apache Lucene executa operações de mesclagem para reduzir o número efetivo de segmentos para cada fragmento e remover documentos excluídos. Para mais informações, consulte Merge settings (Configurações de mesclagem) no site da Elastic.

Se um thread de mesclagem do Apache Lucene afetar sua utilização de CPU, execute o seguinte comando para aumentar a configuração refresh_interval dos seus índices:

PUT /your-index-name/_settings
{
  "index": {
    "refresh_interval": "value"
  }
}

Observação: substitua o valor pelo seu novo intervalo de solicitação. Essa atualização retarda a criação de segmentos de cluster. Para obter mais informações, consulte Refresh index API (Atualizar a API de índice) no site do OpenSearch.

Quando um cluster migra índices para o armazenamento UltraWarm, a utilização de CPU pode aumentar. Uma migração para UltraWarm geralmente envolve uma operação de API de forçar mesclagem, que pode demandar muito da CPU. Para mais informações, consulte Force merge API (API de forçar mesclagem) no site do OpenSearch.

Para verificar migrações para UltraWarm, execute o seguinte comando:

GET _ultrawarm/migration/_status?v

Verifique a pressão de memória de JVM

Analise a porcentagem de pressão de memória de JVM do heap do Java em um nó de cluster. No exemplo de log a seguir, a JVM está dentro da faixa recomendada, mas uma coleta de resíduos de longa duração está afetando o cluster:

[2022-06-28T10:08:12,066][WARN ][o.o.m.j.JvmGcMonitorService] [515f8f06f23327e6df3aad7b2863bb1f] [gc][6447732] overhead, spent [9.3s]collecting in the last [10.2s]

Para solucionar problemas de alta pressão de memória de JVM, consulte Como soluciono problemas de alta pressão de memória de JVM no meu cluster do OpenSearch Service?

Revise sua estratégia de fragmentos

Dependendo do tamanho do cluster, o desempenho do seu cluster pode diminuir devido ao excesso de fragmentos. É uma prática recomendada ter até um máximo de 25 fragmentos por GiB de heap de Java.

Por padrão, o OpenSearch Service tem uma estratégia de fragmentos de 5:1, em que cada índice tem cinco fragmentos primários. Em cada índice, cada fragmento primário também tem sua própria réplica. O OpenSearch Service atribui automaticamente fragmentos primários e fragmentos de réplica a nós de dados separados e garante que haja um backup em caso de falha.

Para redistribuir seus fragmentos, consulte Como reequilibrar a distribuição desigual de fragmentos em meu cluster do OpenSearch Service?

Escale o cluster

Certifique-se de que o cluster tenha CPU, memória e espaço em disco suficientes para suas necessidades. Se sua aplicação realizar consultas grandes ou gravações frequentes, redimensione seu cluster ou nós para atender às demandas de desempenho.

Além disso, use nós principais dedicados para melhorar a estabilidade e a resiliência do cluster, especialmente em implantações maiores. Essa configuração remove as responsabilidades de gerenciamento de clusters dos nós de dados.

Otimize suas consultas

Agregações pesadas; consultas curingas, como curingas principais; e expressão regular (regex), podem causar picos de utilização da CPU. Para diagnosticar essas consultas, verifique seus logs lentos do OpenSearch.

Informações relacionadas

Como melhorar a performance de indexação em meu cluster do Amazon OpenSearch Service?

Como resolvo rejeições de pesquisa ou gravação no OpenSearch Service?

Dimensionamento de domínios do Amazon OpenSearch Service