Come posso risolvere i problemi di utilizzo elevato della CPU nel mio cluster Amazon OpenSearch Service?

Ultimo aggiornamento: 05/08/2021

I nodi di dati mostrano un utilizzo elevato della CPU nel mio cluster Amazon OpenSearch Service (successore di Amazon Elasticsearch Service). In che modo posso risolvere il problema?

Breve descrizione

È consigliabile mantenere l'utilizzo della CPU per assicurarsi che OpenSearch Service disponga di risorse sufficienti per eseguire le sue attività. Un cluster che funziona in modo coerente con un utilizzo elevato della CPU può compromettere le prestazioni. Quando il cluster è sovraccarico, OpenSearch Service smette di rispondere, con conseguente richiesta di timeout.

Per risolvere i problemi relativi all'utilizzo elevato della CPU nel cluster, prendi in considerazione i seguenti approcci:

  • Usa l'API dei thread attivi dei nodi. (Per ulteriori informazioni, consulta API dei thread attivi dei nodi sul sito Web di Elasticsearch.)
  • Controlla l'operazione di scrittura o il pool dei thread dell'API bulk. (Per ulteriori informazioni, consulta API bulk sul sito Web di Elasticsearch.)
  • Controlla il pool dei thread di ricerca. (Per ulteriori informazioni, consulta Pool di thread sul sito Web di Elasticsearch.)
  • Controlla il pool di thread di unione di Apache Lucene (Per ulteriori informazioni, consulta Unione sul sito Web di Elasticsearch.)

Risoluzione

Usa l'API dei thread attivi dei nodi

Se ci sono picchi di CPU costanti nel cluster OpenSearch Service, utilizza l'API dei thread attivi dei nodi. L'API dei thread attivi dei nodi funge da task manager, mostrando la suddivisione di tutti i thread ad alta intensità di risorse in esecuzione sul cluster.

Ecco un output di esempio dell'API dei thread attivi dei nodi:

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)
Nota: l'output dei thread attivi dei nodi riporta le informazioni per ogni nodo. La lunghezza dell'output dipende dal numero di nodi in esecuzione nel cluster di OpenSearch Service.

Inoltre, utilizza l'API dei nodi cat per visualizzare la suddivisione corrente dell'utilizzo delle risorse. Puoi limitare il sottoinsieme di nodi con il massimo utilizzo della CPU con il seguente comando:

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

L'ultima colonna dell'output mostra il nome del nodo. Per ulteriori informazioni, consulta API dei nodi cat sul sito Web di Elasticsearch.

Quindi, passa il nome del nodo pertinente all'API dei thread attivi:

GET _nodes/<node-name>/hot_threads

Per ulteriori informazioni, consulta API dei thread attivi sul sito Web di Elasticsearch.

L'output dei thread attivi dei nodi ha il seguente aspetto:

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

Il nome del thread indica quali processi di OpenSearch Service utilizzano una CPU elevata.

Controlla l'operazione di scrittura o il pool di thread dell'API bulk

Un errore 429 in OpenSearch Service può indicare che il cluster sta gestendo troppe richieste di indicizzazione bulk. Quando ci sono picchi di CPU costanti nel cluster, OpenSearch Service rifiuta le richieste di indicizzazione bulk.

Il pool di thread di scrittura gestisce le richieste di indicizzazione, che includono le operazioni di API bulk. Per verificare se il cluster sta gestendo troppe richieste di indicizzazione bulk, controlla il parametro IndexingRate in Amazon CloudWatch.

Se il cluster sta gestendo troppe richieste di indicizzazione bulk, considera i seguenti approcci:

  • Riduci il numero di richieste bulk sul tuo cluster.
  • Riduci le dimensioni di ogni richiesta bulk, in modo che i nodi possano elaborarle in modo più efficiente.
  • Se Logstash viene utilizzato per inviare dati nel cluster OpenSearch Service, riduci la dimensione del batch o il numero di worker.
  • Se la velocità di inserimento nel cluster rallenta, dimensiona il cluster (orizzontalmente o verticalmente). Per dimensionare il cluster, aumenta il numero di nodi e il tipo di istanza in modo che OpenSearch Service possa elaborare correttamente le richieste in arrivo.

Controlla il pool dei thread di ricerca

Un pool di thread di ricerca che utilizza CPU elevata indica che le query di ricerca stanno sovraccaricando il cluster di OpenSearch Service. Il cluster può essere sovraccaricato da una singola query di lunga esecuzione. Un aumento delle query eseguite dal cluster può influire anche sul pool di thread di ricerca.

Per verificare se una singola query aumenta l'utilizzo della CPU, utilizza l'API di gestione delle attività. Ad esempio:

GET _tasks?actions=*search&detailed

L'API di gestione delle attività recupera tutte le query di ricerca attive in esecuzione sul cluster. Per ulteriori informazioni, consulta API di gestione delle attività sul sito Web di Elasticsearch.

Ecco un output di esempio:

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

Controlla il campo della descrizione per identificare quale particolare query viene eseguita. Il campo running_time_in_nanos indica il tempo di esecuzione di una query. Per ridurre l'utilizzo della CPU, annulla la query di ricerca che utilizza una CPU elevata. L'API di gestione delle attività supporta anche una chiamata _cancel.

Nota: assicurati di registrare l'ID attività dall'output per annullare una particolare attività. In questo esempio, l'ID attività è "U4M_p_x2Rg6YqLujeInPOw:53506997".

Ecco un esempio di chiamata POST per la gestione delle attività:

POST _tasks/U4M_p_x2Rg6YqLujeInPOw:53506997/_cancel

La chiamata POST per la gestione delle attività contrassegna l'attività come "annullata", rilasciando tutte le risorse AWS dipendenti. Se nel cluster sono in esecuzione più query, utilizza la chiamata POST per annullare le query una alla volta. Annulla ogni query finché il cluster non ritorna allo stato normale. È inoltre consigliabile impostare un valore di timeout corretto nel corpo della query per evitare picchi elevati della CPU. (Per ulteriori informazioni, consulta Parametri di ricerca nel corpo della richiesta sul sito Web di Elasticsearch.) Per verificare se il numero di query attive è diminuito, controlla il parametro SearchRate in Amazon CloudWatch.

Nota: l'annullamento di tutte le query di ricerca attive contemporaneamente nel cluster di OpenSearch Service può causare errori sul lato dell'applicazione client.

Controlla il pool di thread di unione di Apache Lucene

OpenSearch Service utilizza Apache Lucene per l'indicizzazione e la ricerca di documenti nel cluster. Apache Lucene esegue operazioni di unione per ridurre il numero effettivo di segmenti necessari per ogni shard e per rimuovere eventuali documenti eliminati. Questo processo viene eseguito ogni volta che vengono creati nuovi segmenti in uno shard.

Se vedi che un'operazione di thread di unione di Apache Lucene influisce sull'utilizzo della CPU, aumenta l'impostazione refresh_interval degli indici del cluster OpenSearch Service. L'aumento dell'impostazione refresh_interval rallenta la creazione di segmenti del cluster.

Nota: un cluster che migra gli indici allo storage UltraWarm può aumentare l'utilizzo della CPU. Una migrazione UltraWarm di solito comporta un'operazione API di unione forzata, che può richiedere un utilizzo intensivo della CPU.

Per verificare eventuali migrazioni UltraWarm, utilizza il seguente comando:

GET _ultrawarm/migration/_status?v