Salta al contenuto

Come posso risolvere i problemi che comportano un utilizzo elevato della CPU nel mio cluster del Servizio OpenSearch?

9 minuti di lettura
0

I miei nodi dati mostrano un utilizzo elevato della CPU nel mio cluster del Servizio OpenSearch di Amazon.

Breve descrizione

Per risolvere i problemi che comportano un utilizzo elevato della CPU in un cluster, intraprendi le seguenti azioni:

  • Utilizza un runbook automatizzato per identificare la causa dell'utilizzo elevato della CPU.
  • Utilizza il rilevamento delle anomalie per identificare i modelli.
  • Utilizza l'API nodes hot threads per analizzare l'utilizzo delle risorse.
  • Controlla il pool di thread di scrittura o delle operazioni API in blocco.
  • Controlla il pool dei thread di ricerca.
  • Controlla il pool di thread di unione di Apache Lucene.
  • Controlla la pressione sulla memoria della macchina virtuale Java (JVM).
  • Rivedi la strategia di sharding.
  • Scala il cluster.
  • Ottimizza le query.

È consigliabile mantenere l'utilizzo della CPU sufficientemente basso da consentire al Servizio OpenSearch di svolgere le proprie attività. Un cluster con un utilizzo costantemente elevato della CPU può presentare problemi di prestazioni. Il Servizio OpenSearch non risponde ai cluster sovraccarichi e ricevi una richiesta di timeout.

Risoluzione

Utilizza un runbook automatizzato

Prerequisito: assicurati di avere le autorizzazioni AWS Identity and Access Management (AWS IAM) necessarie per eseguire il runbook. Per ulteriori informazioni, consulta Autorizzazioni IAM richieste in AWSSupport-TroubleshootOpenSearchHighCPU.

Utilizza il runbook di automazione AWSSupport-TroubleshootOpenSearchHighCPU di AWS Systems Manager per risolvere i problemi che comportano un utilizzo elevato della CPU nel Servizio OpenSearch.

L'output mostra le seguenti informazioni:

  • Thread attivi
  • Attività in esecuzione
  • Statistiche del pool di thread per ogni nodo del dominio
  • Informazioni sui nodi del dominio ordinate in base all'utilizzo della CPU
  • Allocazione di shard a ciascun nodo di dati e relativo spazio su disco
  • Stato di integrità e informazioni sullo stato di integrità del dominio del Servizio OpenSearch

Utilizza l'output del runbook per identificare la causa dell'utilizzo elevato della CPU.

Utilizza il rilevamento delle anomalie per identificare i modelli

Per identificare potenziali problemi prima che causino interruzioni, utilizza il rilevamento delle anomalie nel Servizio OpenSearch per identificare automaticamente modelli insoliti di metriche come l'utilizzo della CPU. Per ulteriori informazioni, consulta Tutorial: rileva un elevato utilizzo della CPU con il rilevamento delle anomalie.

Utilizza l'API nodes hot threads

Se sono presenti picchi di CPU costanti nel cluster del Servizio OpenSearch, esegui questo comando per visualizzare le informazioni per tutti i nodi del cluster:

GET/_nodes/hot_threads

La lunghezza dell'output dipende dal numero di nodi in esecuzione nel cluster del Servizio OpenSearch. Per ulteriori informazioni sull'API node hot threads, consulta Nodes Hot Threads API (API nodes hot threads) sul sito web OpenSearch.

Esempio di output:

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)

Puoi anche utilizzare l'API cat nodes per visualizzare l'attuale ripartizione dell'utilizzo delle risorse. Per visualizzare i nodi con il massimo utilizzo della CPU, esegui questo comando:

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

L'ultima colonna dell'output mostra il nome del nodo. Per ulteriori informazioni sull'API cat nodes, consulta CAT nodes API (API cat nodes) sul sito web OpenSearch.

Quindi esegui questo comando per i nodi con un utilizzo elevato della CPU:

GET _nodes/node_id/hot_threads

Nota: sostituisci node_id con l'ID del nodo.

L'output mostra i processi del Servizio OpenSearch nel nodo che utilizzano la maggior parte della CPU. Se nell'output vedi un thread di unione di Apache Lucene, consulta la sezione Controlla il pool di thread di unione di Apache Lucene per risolvere i problemi.

Esempio di output:

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

Controlla il pool di thread di scrittura o le operazioni API in blocco

Se ricevi un messaggio di errore "429", è possibile che il cluster abbia troppe richieste di indicizzazione in blocco. Quando sono presenti picchi costanti di utilizzo della CPU nel cluster, il Servizio OpenSearch rifiuta le richieste di indicizzazione in blocco.

Il pool di thread di scrittura gestisce le richieste di indicizzazione, comprese le operazioni API in blocco. Per verificare se il dominio è sottoposto a stress a causa di troppe richieste di indicizzazione in blocco, controlla la metrica IndexingRate di Amazon CloudWatch.

Se il cluster ha troppe richieste di indicizzazione in blocco, intraprendi le seguenti azioni:

  • Riduci il numero di richieste in blocco nel cluster.
  • Riduci le dimensioni di ogni richiesta in blocco, in modo che i nodi possano elaborarle in maniera più efficiente.
  • Se utilizzi Logstash per caricare dati nel cluster del Servizio OpenSearch, riduci la dimensione del batch o il numero di worker.
  • Se la velocità di assimilazione del cluster diminuisce, aumenta verticalmente od orizzontalmente il cluster.

Controlla il pool di thread di ricerca

Un pool di thread di ricerca che ha un utilizzo elevato della CPU indica che le query di ricerca sovraccaricano il cluster del Servizio OpenSearch. Una sola query di lunga durata può sovraccaricare il cluster. Analogamente, un aumento delle query eseguite dal cluster può influire sul pool di thread di ricerca.

Per verificare se una sola query aumenta l'utilizzo della CPU, esegui questo comando:

GET _tasks?actions=*search&detailed

L'API task management mostra tutte le query di ricerca attive eseguite sul cluster. Per ulteriori informazioni, consulta List Tasks API (API list tasks) sul sito web OpenSearch.

Nell'output, controlla il campo description per identificare la query in esecuzione. Il campo running_time_in_nanos indica il tempo di esecuzione di una query.

Esempio di output:

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

Nota: per le attività di ricerca, l'output dell'API task management include solo il campo della descrizione.

Per ridurre l'utilizzo della CPU, annulla la query di ricerca con utilizzo elevato della CPU eseguendo questo comando:

POST _tasks/U4M_p_x2Rg6YqLujeInPOw:53506997/_cancel

Nota: sostituisci U4M_p_x2Rg6YqLujeInPOw:53506997 con l'ID della tua attività.

La query precedente contrassegna l'attività come annullata e libera le relative risorse AWS. Se nel cluster sono in esecuzione più query, utilizza il comando POST per annullare ogni query fino a quando il cluster non torna a uno stato normale.

È consigliabile impostare un valore di timeout nel corpo della query per evitare picchi di utilizzo della CPU. Per ulteriori informazioni, consulta Search settings (Impostazioni di ricerca) sul sito web OpenSearch. Per verificare se il numero di query attive è diminuito, controlla la metrica di CloudWatch SearchRate.

Nota: l'annullamento di tutte le query di ricerca attive contemporaneamente nel cluster del Servizio OpenSearch potrebbe causare errori sul lato client dell'applicazione.

Controlla il pool di thread di unione di Apache Lucene

Il Servizio OpenSearch utilizza Apache Lucene per indicizzare e cercare documenti nel cluster. Quando si creano nuovi segmenti di shard, Apache Lucene esegue operazioni di unione per ridurre il numero effettivo di segmenti per ogni shard e rimuovere i documenti eliminati. Per ulteriori informazioni, consulta Merge settings (Impostazioni di unione) sul sito web Elastic.

Se un thread di unione di Apache Lucene influisce sull'utilizzo della CPU, esegui questo comando per aumentare l'impostazione refresh_interval degli indici:

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

Nota: sostituisci value con il tuo nuovo intervallo tra le richieste. Questo aggiornamento rallenta la creazione di segmenti di cluster. Per ulteriori informazioni, consulta Refresh index API (API refresh index) sul sito web OpenSearch.

Quando un cluster esegue la migrazione degli indici verso lo spazio di archiviazione UltraWarm, l'utilizzo della CPU potrebbe aumentare. Una migrazione verso UltraWarm di solito implica un'operazione API di forzatura dell'unione, che può richiedere un utilizzo intensivo della CPU. Per ulteriori informazioni, consulta Force merge API (API force merge) sul sito web OpenSearch.

Per verificare le migrazioni verso UltraWarm, esegui questo comando:

GET _ultrawarm/migration/_status?v

Controlla l'utilizzo della memoria JVM

Controlla la percentuale di pressione sulla memoria JVM dell'heap Java in un nodo del cluster. Nel seguente esempio di log, la JVM è nell'intervallo consigliato, ma una rimozione di oggetti inutili (garbage collection a lungo termine influisce sul 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]

Per risolvere i problemi di pressione elevata sulla memoria JVM, consulta Come posso risolvere il problema della pressione elevata della memoria JVM del mio cluster del Servizio OpenSearch?

Rivedi la strategia di sharding

A seconda delle dimensioni del cluster, le prestazioni del cluster potrebbero ridursi a causa del numero eccessivo di shard. È consigliabile avere fino a un massimo di 25 shard per GiB di heap Java.

Per impostazione predefinita, il Servizio OpenSearch ha una strategia per gli shard di 5:1, in cui ogni indice ha cinque shard primari. All'interno di ogni indice, ogni shard primario ha una propria replica. Il Servizio OpenSearch assegna automaticamente gli shard primari e gli shard di replica a nodi di dati separati e garantisce che sia disponibile un backup in caso di errore.

Per ridistribuire gli shard, consulta Come posso riequilibrare la distribuzione irregolare degli shard nel mio cluster del Servizio OpenSearch?

Scala il cluster

Assicurati che il cluster disponga di CPU, memoria e spazio su disco sufficienti per le esigenze del caso d'uso. Se l'applicazione esegue query di grandi dimensioni o scritture frequenti, ridimensiona il cluster o i nodi per ottenere le prestazioni richieste.

Inoltre, utilizza nodi principali dedicati per migliorare la stabilità e la resilienza del cluster, specialmente nelle distribuzioni più grandi. Questa configurazione rimuove le responsabilità della gestione del cluster dai nodi di dati.

Ottimizza le query

Le aggregazioni pesanti, le query con caratteri jolly come i caratteri jolly iniziali e le query con espressioni regolari (regex) potrebbero causare picchi di utilizzo della CPU. Per diagnosticare queste query, controlla i log delle query lente di OpenSearch.

Informazioni correlate

In che modo è possibile migliorare le prestazioni di indicizzazione nel mio cluster del Servizio OpenSearch di Amazon?

Come posso risolvere il problema dei rifiuti di ricerca o scrittura nel Servizio OpenSearch?

Dimensionamento dei domini del Servizio OpenSearch di Amazon