Comment résoudre les problèmes d'utilisation élevée du processeur sur mon cluster Amazon Elasticsearch Service ?

Dernière mise à jour : 25/03/2021

Mes nœuds de données affichent une utilisation élevée du processeur sur mon cluster Elasticsearch. Comment puis-je résoudre ce problème ?

Brève description

Il est recommandé de maintenir l'utilisation de votre processeur pour vous assurer qu'Amazon ES dispose de suffisamment de ressources pour effectuer ses tâches. Un cluster Elasticsearch qui fonctionne constamment avec une utilisation élevée du processeur peut dégrader les performances du cluster. Lorsque votre cluster Elasticsearch est surchargé, Amazon ES peut cesser de répondre, ce qui entraîne une demande de délai d'expiration.

Pour résoudre une utilisation élevée du processeur sur votre cluster Elasticsearch, envisagez les approches suivantes :

  • Utilisez l'API des threads chauds des nœuds. (Pour plus d'informations, consultez API des threads chauds des nœuds sur le site Web Elasticsearch.)
  • Vérifiez l'opération d'écriture ou le groupe de threads d'API en bloc. (Pour plus d'informations, consultez API en bloc sur le site Web Elasticsearch.)
  • Vérifiez le groupe de threads de recherche. (Pour plus d'informations, consultez Groupes de threads sur le site Web Elasticsearch.)
  • Vérifiez le groupe de threads de fusion Apache Lucene. (Pour plus d'informations, consultez Fusion sur le site Web Elasticsearch.)

Solution

Utiliser l'API des threads chauds des nœuds

Si vous observez des pics UC constants dans votre cluster Elasticsearch, utilisez l'API des threads chauds des nœuds. L'API des threads chauds des nœuds agit comme un gestionnaire de tâches, vous montrant la répartition de tous les threads gourmands en ressources qui s'exécutent sur votre cluster Elasticsearch.

Voici un exemple de sortie de l'API des threads chauds des nœuds :

GET _nodes/hot_threads

100.0% (131ms out of 500ms) cpu usage by thread 
'elasticsearch[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.elasticsearch.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)
Remarque : la sortie des threads chauds des nœuds répertorie les informations pour chaque nœud. La longueur de votre sortie dépend du nombre de nœuds en cours d'exécution dans votre cluster Elasticsearch.

De plus, utilisez l'API cat nodes pour afficher la répartition actuelle de l'utilisation des ressources. Vous pouvez restreindre le sous-ensemble de nœuds avec l'utilisation de l'UC la plus élevée avec la commande suivante :

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

La dernière colonne de votre sortie affiche le nom de votre nœud. Pour plus d'informations, consultez API des nœuds cat sur le site Web d'Elasticsearch.

Ensuite, transmettez le nom de nœud pertinent à votre API de threads chauds :

GET _nodes/<node-name>/hot_threads

Pour plus d'informations, consultez API des threads chauds sur le site Web Elasticsearch.

La sortie des threads chauds des nœuds ressemble à ce qui suit :

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

Le nom du thread indique quels processus Amazon ES consomment beaucoup d'UC.

Vérifier l'opération d'écriture ou le groupe de threads d'API en bloc

Une erreur 429 dans Amazon ES peut indiquer que votre cluster Elasticsearch gère trop de demandes d'indexation en bloc. Lorsqu'il y a des pics d'UC constants dans votre cluster, Amazon ES rejette les demandes d'indexation en bloc.

Le groupe de threads d'écriture gère les demandes d'indexation, qui incluent les opérations d'API en bloc. Pour vérifier si votre cluster Elasticsearch gère trop de demandes d'indexation en bloc, vérifiez la métrique IndexingRate dans Amazon CloudWatch.

Si votre cluster Elasticsearch gère trop de demandes d'indexation en bloc, envisagez les approches suivantes :

  • Réduisez le nombre de requêtes en bloc sur votre cluster Elasticsearch.
  • Réduisez la taille de chaque requête en bloc, afin que vos nœuds puissent les traiter plus efficacement.
  • Si Logstash est utilisé pour transmettre des données dans votre cluster Elasticsearch, réduisez la taille du lot ou le nombre de nœuds de calcul.
  • Si le taux d'assimilation de votre cluster Elasticsearch ralentit, mettez votre cluster à l'échelle (horizontalement ou verticalement). Pour mettre à l'échelle votre cluster, augmentez le nombre de nœuds et le type d'instance afin qu'Amazon ES puisse traiter correctement les demandes entrantes.

Vérifier le groupe de threads de recherche

Un pool de threads de recherche qui consomme beaucoup d'UC indique que les requêtes de recherche submergent votre cluster Elasticsearch. Votre cluster peut être submergé par une seule requête de longue durée. Une augmentation du nombre de requêtes exécutées par le cluster Elasticsearch peut également affecter votre groupe de threads de recherche.

Pour vérifier si une seule requête augmente votre utilisation du processeur, utilisez l'API de gestion des tâches. Par exemple :

GET _tasks?actions=*search&detailed

L'API de gestion des tâches récupère toutes les requêtes de recherche actives qui s'exécutent sur votre cluster Elasticsearch. Pour plus d'informations, voir API de gestion des tâches sur le site Web Elasticsearch.

Voici un exemple de sortie :

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

Cochez le champ de description pour identifier quelle requête particulière est en cours d'exécution. Le champ running_time_in_nanos indique la durée pendant laquelle une requête a été exécutée. Pour réduire votre utilisation de l'UC, annulez la requête de recherche qui consomme beaucoup de processeur. L'API de gestion des tâches prend également en charge un appel _cancel.

Remarque : veillez à enregistrer l'ID de tâche de votre sortie pour annuler une tâche particulière. Dans cet exemple, l'ID de tâche est « U4M_p_x2Rg6YqLujeInPOw:53506997 ».

Voici un exemple d'appel POST de gestion des tâches :

POST _tasks/U4M_p_x2Rg6YqLujeInPOw:53506997/_cancel

L'appel POST de gestion des tâches marque la tâche comme « annulée », libérant toutes les ressources AWS dépendantes. Si plusieurs requêtes sont exécutées sur votre cluster Elasticsearch, utilisez l'appel POST pour annuler les requêtes une par une. Annulez chaque requête jusqu'à ce que votre cluster Elasticsearch revienne à un état normal. Il est également recommandé de définir une valeur de délai d'expiration appropriée dans le corps de la requête, afin d'éviter des pics d'UC élevés. (Pour plus d'informations, consultez Demander des paramètres de recherche de corps sur le site Web Elasticsearch.) Pour vérifier si le nombre de requêtes actives a diminué, vérifiez la métrique SearchRate dans Amazon CloudWatch.

Remarque : l'annulation de toutes les requêtes de recherche actives en même temps dans votre cluster Elasticsearch peut provoquer des erreurs du côté de l'application cliente.

Vérifier le groupe de threads de fusion Apache Lucene

Amazon ES utilise Apache Lucene pour indexer et rechercher des documents sur le cluster Elasticsearch. Apache Lucene exécute des opérations de fusion pour réduire le nombre effectif de segments nécessaires pour chaque partition et pour supprimer tous les documents supprimés. Ce processus est exécuté chaque fois que de nouveaux segments sont créés dans une partition.

Si vous observez une opération de fusion de thread Apache Lucene ayant un impact sur l'utilisation de l'UC, augmentez le paramètre refresh_interval de vos indices de cluster Elasticsearch. L'augmentation du paramètre refresh_interval ralentit la création de segments de votre cluster.

Remarque : un cluster Elasticsearch qui migre des indices vers le stockage UltraWarm peut augmenter votre utilisation de l'UC. Une migration UltraWarm implique généralement une opération d'API de fusion forcée, qui peut nécessiter une utilisation intensive de l'UC.

Pour rechercher des migrations UltraWarm, utilisez la commande suivante :

GET _ultrawarm/migration/_status?v