¿Cómo soluciono problemas de uso elevado de CPU en mi clúster de Amazon OpenSearch Service?

Última actualización: 05-08-2021

Mis nodos de datos muestran un uso elevado de CPU en mi clúster de Amazon OpenSearch Service (sucesor de Amazon Elasticsearch Service). ¿Cómo soluciono este problema?

Descripción breve

Es recomendable mantener el uso de la CPU para asegurarse de que OpenSearch Service tenga recursos suficientes para realizar sus tareas. Un clúster que funciona de forma coherente con un uso elevado de la CPU puede degradar el rendimiento del clúster. Cuando el clúster se sobrecarga, OpenSearch Service deja de responder, lo que provoca una solicitud de tiempo de espera.

Para solucionar problemas de uso elevado de la CPU en el clúster, tenga en cuenta los siguientes enfoques:

  • Utilice la API de hot threads de nodos. (Para obtener más información, consulte API de hot threads de nodos en el sitio web de Elasticsearch).
  • Verifique la operación de escritura o el grupo de subprocesos de API masivos. (Para obtener más información, consulte API masiva en el sitio web de Elasticsearch).
  • Verifique el grupo de subprocesos de búsqueda. (Para obtener más información, consulte Grupos de subprocesos en el sitio web de Elasticsearch).
  • Verifique el grupo de subprocesos de combinación de Apache Lucene. (Para obtener más información, consulte Combinación en el sitio web de Elasticsearch).

Resolución

Uso de la API de hot threads de nodos

Si hay picos constantes de CPU en el clúster de OpenSearch Service, utilice la API de hot threads de nodos. La API de hot threads de nodos actúa como administrador de tareas y muestra el desglose de todos los subprocesos que consumen muchos recursos que se ejecutan en el clúster.

A continuación, se muestra un ejemplo de salida de la API de hot threads de nodos:

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: la salida de hot threads de nodos muestra información de cada nodo. La longitud de la salida depende del número de nodos que se ejecuten en el clúster de OpenSearch Service.

Además, use la API de cat nodes para ver el desglose actual de la utilización de los recursos. Puede reducir el subconjunto de nodos con mayor utilización de CPU con el siguiente comando:

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

La última columna de la salida muestra el nombre del nodo. Para obtener más información, consulte API de cat nodes en el sitio web de Elasticsearch.

A continuación, envíe el nombre del nodo correspondiente a la API de hot threads:

GET _nodes/<node-name>/hot_threads

Para obtener más información, consulte API de hot threads en el sitio web de Elasticsearch.

La salida de hot threads de nodos tiene el siguiente aspecto:

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

El nombre del subproceso indica qué procesos de OpenSearch Service están consumiendo mucha CPU.

Verificar la operación de escritura o el grupo de subprocesos de API masivos

Un error 429 en OpenSearch Service puede indicar que el clúster está administrando demasiadas solicitudes de indexación masiva. Cuando hay picos de CPU constantes en el clúster, OpenSearch Service rechaza las solicitudes de indexación masiva.

El grupo de subprocesos de escritura maneja las solicitudes de indexación, que incluyen operaciones de API masivas. Para confirmar si el clúster maneja demasiadas solicitudes de indexación masiva, verifique la métrica IndexingRate en Amazon CloudWatch.

Si el clúster maneja demasiadas solicitudes de indexación masiva, considere los siguientes enfoques:

  • Reduzca el número de solicitudes masivas del clúster.
  • Reduzca el tamaño de cada solicitud masiva para que los nodos puedan procesarlas de forma más eficiente.
  • Si se utiliza Logstash para insertar datos en el clúster de OpenSearch Service, reduzca el tamaño del lote o el número de empleados.
  • Si la tasa de ingesta del clúster se ralentiza, escale el clúster (horizontal o verticalmente). Para escalar verticalmente el clúster, aumente el número de nodos y el tipo de instancias para que OpenSearch Service pueda procesar correctamente las solicitudes entrantes.

Verifique el grupo de subprocesos de búsqueda

Un grupo de subprocesos de búsqueda que consume mucha CPU indica que las consultas de búsqueda abruma el clúster de OpenSearch Service. El clúster puede verse abrumado por una sola consulta de larga duración. El aumento de las consultas que realiza el clúster también puede afectar al grupo de subprocesos de búsqueda.

Para verificar si una sola consulta aumenta el uso de la CPU, use la API de administración de tareas. Por ejemplo:

GET _tasks?actions=*search&detailed

La API de administración de tareas obtiene todas las consultas de búsqueda activas que se ejecutan en el clúster. Para obtener más información, consulte API de administración de tareas en el sitio web de Elasticsearch.

A continuación, se muestra un resultado de ejemplo:

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

Verifique el campo de descripción para identificar qué consulta concreta se ejecuta. El campo running_time_in_nanos indica la cantidad de tiempo que se ha estado ejecutando una consulta. Para reducir el uso de CPU, cancele la consulta de búsqueda que consume mucha CPU. La API de administración de tareas también admite una llamada _cancel.

Nota: asegúrese de registrar el ID de tarea de la salida para cancelar una tarea concreta. En este ejemplo, el ID de tarea es "U4M_p_x2Rg6YqLujeInPOw:53506997".

A continuación, se muestra un ejemplo de una llamada POST de administración de tareas:

POST _tasks/U4M_p_x2Rg6YqLujeInPOw:53506997/_cancel

La llamada POST de administración de tareas marca la tarea como "cancelada" y libera los recursos de AWS dependientes. Si tiene varias consultas ejecutándose en el clúster, use la llamada POST para cancelar las consultas de una en una. Cancele cada consulta hasta que el clúster vuelva a su estado normal. También, se recomienda establecer un valor de tiempo de espera adecuado en el cuerpo de la consulta para evitar picos elevados de CPU. (Para obtener más información, consulte Parámetros de búsqueda del cuerpo de la solicitud en el sitio web de Elasticsearch). Para verificar si el número de consultas activas ha disminuido, consulte la métrica SearchRate de Amazon CloudWatch.

Nota: cancelar todas las consultas de búsqueda activas al mismo tiempo en el clúster de OpenSearch Service puede provocar errores en la aplicación cliente.

Verifique el grupo de subprocesos de combinación de Apache Lucene

OpenSearch Service utiliza Apache Lucene para indexar y buscar documentos en el clúster. Apache Lucene ejecuta operaciones de combinación para reducir el número efectivo de segmentos necesarios para cada partición y eliminar los documentos eliminados. Este proceso se ejecuta siempre que se crean nuevos segmentos en una partición.

Si observa que una operación de subproceso de combinación de Apache Lucene afecta al uso de la CPU, aumente la configuración refresh_interval de los índices de clúster de OpenSearch Service. El aumento de la configuración refresh_interval ralentiza la creación de segmentos del clúster.

Nota: Un clúster que migre índices al almacenamiento UltraWarm puede aumentar el uso de la CPU. Una migración UltraWarm suele implicar una operación de API de combinación forzada, que puede requerir un uso intensivo de la CPU.

Para verificar si hay migraciones UltraWarm, utilice el siguiente comando:

GET _ultrawarm/migration/_status?v