Comment puis-je résoudre une exception de disjoncteur dans Amazon OpenSearch Service ?

Date de la dernière mise à jour 01/09/2021

J'essaie d'envoyer des données à mon cluster Amazon OpenSearch Service (successeur d'Amazon Elasticsearch Service). Je reçois un message d'erreur d'exception de disjoncteur de circuit qui indique que mes données sont trop volumineuses. D'où vient le problème et comment puis-je le résoudre ?

Brève description

Lorsqu'une demande atteint les nœuds OpenSearch Service, les disjoncteurs calculent la quantité de mémoire nécessaire pour charger les données requises. OpenSearch Service compare ensuite la taille estimée à la limite de taille de tas configurée. Si la taille estimée de vos données est supérieure à la taille de tas disponible, la requête est résiliée. En conséquence, une exception CircuitBreakerException est levée pour éviter de surcharger le nœud.

OpenSearch Service utilise les disjoncteurs suivants pour empêcher les exceptions JVM OutofMemoryError :

  • Demande
  • Fielddata
  • Requêtes à la volée
  • Comptabilité
  • Parent

Remarque : il est important de savoir lequel de ces cinq disjoncteurs a levé l'exception, car chaque disjoncteur a ses propres besoins de réglage. Pour plus d'informations sur les types de disjoncteurs, consultez Circuit breaker settings sur le site Elasticsearch.

Pour connaître l'utilisation actuelle de la mémoire par nœud et par disjoncteur, utilisez la commande suivante :

GET _nodes/stats/breaker

En outre, notez que les disjoncteurs ne sont qu'un mécanisme visant à optimiser les efforts. Bien que les disjoncteurs offrent une certaine résilience contre la surcharge d'un nœud, vous pouvez toujours voir une erreur OutOfMemoryError. Les disjoncteurs ne peuvent suivre la mémoire que si elle est explicitement réservée, de sorte qu'il n'est pas toujours possible d'estimer d'emblée l'utilisation exacte de la mémoire. Par exemple, si vous avez une petite quantité de mémoire, la surcharge relative de la mémoire non suivie est plus grande. Pour plus d'informations sur les disjoncteurs et la résilience des nœuds, consultez Améliorer la résilience des nœuds grâce au disjoncteur à mémoire réelle sur le site Elasticsearch.

Pour éviter de surcharger vos nœuds de données, suivez les conseils fournis dans la section consacrée à la résolution des problèmes liés à une forte sollicitation de la mémoire JVM.

Résolution

Exception du disjoncteur

Si vous utilisez Elasticsearch version 7.x et supérieure avec 16 Go de mémoire (tas), l'erreur suivante s'affiche lorsque la limite du disjoncteur est atteinte :

"error": {
        "root_cause": [
            {
                "type": "circuit_breaking_exception",
                "reason": "[parent] Data too large, data for [<http_request>] would be [16355096754/15.2gb], which is larger than the limit of [16213167308/15gb], real usage: [15283269136/14.2gb], new bytes reserved: [1071827618/1022.1mb]",
               }
      ]
}

Cet exemple indique que les données à traiter sont trop volumineuses pour être gérées par le disjoncteur parent. Le disjoncteur parent (un type de disjoncteur) est responsable de l'utilisation globale de la mémoire de votre cluster. Lorsqu'une exception de disjoncteur parent se produit, cela signifie que la mémoire totale utilisée sur tous les disjoncteurs a dépassé la limite définie. Un disjoncteur parent déclenche une exception lorsque le cluster dépasse 95 % de 16 Go, soit 15,2 Go de mémoire.

Vous pouvez vérifier cette logique en calculant la différence entre l'utilisation de la mémoire et la limite du disjoncteur définie. Utilisez les valeurs de notre exemple et soustrayez « l'utilisation réelle, à savoir [15283269136/14.2gb] » à « la limite de [16213167308/15gb] ». Ce calcul montre que cette requête nécessite environ 1,02 Go de nouveaux octets réservés pour pouvoir être traitée. Toutefois, dans cet exemple, le cluster disposait de moins de 0,8 Go de mémoire libre disponible dans le tas lorsque la demande de données a été reçue. En conséquence, le disjoncteur se déclenche.

Le message d'exception du disjoncteur peut être interprété comme suit :

  • data for (données pour) [ ] : le client envoie des requêtes HTTP à un nœud de votre cluster. OpenSearch Service traite la demande localement ou la transmet à un autre nœud pour un traitement supplémentaire.
  • would be (serait) [#] : taille du tas lorsque la demande est traitée.
  • limit of (limite de) [#] : limite actuelle du disjoncteur.
  • real usage (utilisation réelle) : utilisation réelle du tas JVM.
  • new bytes reserved (nouveaux octets réservés) : mémoire réelle nécessaire au traitement de la demande.

Sollicitation de la mémoire JVM

Une exception de disjoncteur est souvent causée par une importante sollicitation de la mémoire JVM. La sollicitation de mémoire JVM désigne le pourcentage de tas Java utilisé pour tous les nœuds de données de votre cluster. Vérifiez la métrique JVMMemoryPressure dans Amazon CloudWatch pour déterminer l'utilisation actuelle.

Remarque : la taille du tas JVM d'un nœud de données est définie sur la moitié de la taille de la mémoire physique (RAM), jusqu'à un maximum de 32 Go. Par exemple, si la mémoire physique (RAM) est de 128 Go par nœud, la taille du tas sera toujours de 32 Go (taille maximale du tas). Sinon, la taille du heap est calculée comme la moitié de la taille de la mémoire physique.

Une forte sollicitation de la mémoire JVM peut survenir pour les raisons suivantes :

  • Augmentation du nombre de demandes envoyées au cluster. Vérifiez les métriques IndexRate et SearchRate dans Amazon CloudWatch pour déterminer la charge actuelle.
  • Agrégation, caractères génériques et utilisation de plages de temps étendues dans vos requêtes.
  • Allocation déséquilibrée des partitions entre les nœuds ou nombre trop élevé de partitions dans un cluster.
  • Foisonnement de mappage d'index.
  • Utilisation de la structure de données fielddata pour interroger des données. Fielddata peut consommer une grande quantité d'espace du tas et reste dans celui-ci pendant toute la durée de vie du segment. Par conséquent, la sollicitation de la mémoire JVM reste élevée sur le cluster lorsque fieldata est utilisé. Pour plus d'informations, consultez Fielddata sur le site Elasticsearch.

Résolution des problèmes liés à une forte sollicitation de la mémoire JVM

Pour résoudre mes problèmes liés à une forte sollicitation de la mémoire JVM, suivez les conseils ci-dessous :

  • Réduisez le trafic entrant vers votre cluster, surtout en cas de forte charge de travail.
  • Pensez à mettre le cluster à l'échelle afin d'obtenir plus de mémoire JVM pour prendre en charge votre charge de travail.
  • Si cette opération est impossible, essayez de réduire le nombre de fragments en supprimant les index anciens ou inutilisés. Étant donné que les métadonnées de partition sont stockées en mémoire, la réduction du nombre de fragments peut réduire l'utilisation globale de la mémoire.
  • Activez les journaux lents pour identifier les demandes défectueuses.
    Remarque : avant d'activer les modifications de configuration, vérifiez que la sollicitation de la mémoire JVM est inférieure à 85 %. De cette façon, vous pouvez éviter des frais supplémentaires pour les ressources existantes.
  • Optimisez les requêtes de recherche et d'indexation, et choisissez le nombre adéquat de partitions. Pour plus d'informations sur l'indexation et le nombre de partitions, consultez Get started with Amazon OpenSearch Service: How many shards do I need?
  • Désactivez et évitez d'utiliser fielddata. Par défaut, fielddata est défini à « false » sur un champ de texte, à moins qu'il ne soit explicitement défini autrement dans les mappages d'index.
  • Modifiez votre type de mappage d'index en un mot clé à l'aide de l'API de réindexation, ou créez ou mettez à jour l'API de modèle d'index. Vous pouvez utiliser le type de mot clé comme alternative pour effectuer des agrégations et trier des champs de texte.
  • Évitez l'agrégation sur les champs de texte pour prévenir l'augmentation des données de champ. Lorsque vous utilisez davantage de données de champ, une part plus importante d'espace de tas est consommée. Utilisez l'opération d'API cluster stats pour vérifier les données de champ.
  • Effacez le cache fielddata à l'aide de l'appel d'API suivant :
POST /index_name/_cache/clear?fielddata=true (index-level cache)
POST */_cache/clear?fielddata=true (cluster-level cache)

Avertissement : si vous effacez le cache fieldata, les requêtes en cours peuvent être interrompues.

Pour plus d'informations, veuillez consulter la rubrique Comment puis-je résoudre les problèmes liés à une forte sollicitation de mémoire JVM sur mon cluster Amazon OpenSearch Service ?