Come si risolve un'eccezione di interruttore su Amazon OpenSearch Service?

Ultimo aggiornamento: 01/09/2021

Sto cercando di inviare dati al mio cluster Amazon OpenSearch Service. Tuttavia, ricevo un errore di eccezione di interruzione del circuito che indica che i miei dati sono troppo grandi. Perché si verifica questo problema e come posso risolverlo?

Breve descrizione

Quando una richiesta raggiunge i nodi di OpenSearch Service, gli interruttori stimano la quantità di memoria necessaria per caricare i dati richiesti. OpenSearch Service confronta quindi la dimensione stimata con il limite di dimensione dell'heap configurato. Se la dimensione stimata dei dati è maggiore della dimensione dell'heap disponibile, la query viene terminata. Di conseguenza, viene generata una CircuitBreakerException per evitare il sovraccarico del nodo.

OpenSearch Service utilizza i seguenti interruttori per evitare eccezioni JVM OutofMemoryError:

  • Richiesta
  • Dati sul campo
  • Richieste in volo
  • Contabilità
  • Parent

Nota: è importante sapere quale di questi cinque interruttori automatici ha sollevato l'eccezione perché ogni interruttore ha le proprie esigenze di regolazione. Per ulteriori informazioni sui tipi di interruttori automatici, consulta Impostazioni degli interruttori automatici sul sito Web Elasticsearch.

Per ottenere l'utilizzo corrente della memoria per nodo e per interruttore, utilizza il seguente comando:

GET _nodes/stats/breaker

Inoltre, ricorda che gli interruttori automatici sono solo un meccanismo di migliore sforzo. Mentre gli interruttori automatici forniscono una certa resilienza contro il sovraccarico di un nodo, potresti comunque ricevere un errore OutOfMemoryError. Gli interruttori automatici possono tenere traccia della memoria solo se è esplicitamente riservata, quindi non è sempre possibile stimare l'utilizzo esatto della memoria in anticipo. Ad esempio, se si dispone di una piccola quantità di heap di memoria, il sovraccarico relativo della memoria non tracciata è maggiore. Per ulteriori informazioni sugli interruttori automatici e sulla resilienza dei nodi, consulta Miglioramento della resilienza dei nodi con l'interruttore automatico di memoria reale sul sito Web Elasticsearch.

Per evitare di sovraccaricare i nodi dati, segui i suggerimenti forniti nella sezione Risoluzione dei problemi relativi alla pressione elevata della memoria JVM.

Risoluzione

Eccezione dell'interruttore automatico

Se utilizzi Elasticsearch versione 7.x e successive con 16 GB di heap, viene visualizzato il seguente errore quando viene raggiunto il limite dell'interruttore automatico:

"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]",
               }
      ]
}

Questo output di esempio indica che i dati da elaborare sono troppo grandi per essere gestiti dall'interruttore di circuito parent. L'interruttore automatico parent (un tipo di interruttore automatico) è responsabile dell'utilizzo complessivo della memoria del cluster. Quando si verifica un'eccezione dell'interruttore automatico parent, la memoria totale utilizzata per tutti gli interruttori automatici ha superato il limite impostato. Un interruttore parent genera un'eccezione quando il cluster supera il 95% di 16 GB, ovvero 15,2 GB di heap.

È possibile verificare questa logica calcolando la differenza tra l'utilizzo della memoria e il limite impostato dell'interruttore automatico. Usa i valori dal nostro output di esempio e sottrai "utilizzo reale: [15283269136/14.2gb]" da "limite di [16213167308/15gb]". Questo calcolo mostra che per elaborare correttamente la richiesta, questa richiesta richiede circa 1,02 GB di memoria riservata di nuovi byte. Tuttavia, in questo esempio, il cluster aveva meno di 0,8 GB di heap di memoria libera disponibile quando è arrivata la richiesta di dati. Di conseguenza, l'interruttore automatico viene interrotto.

Il messaggio di eccezione dell'interruttore automatico può essere interpretato in questo modo:

  • data for [<http_request>]: il client invia richieste HTTP a un nodo del cluster. OpenSearch Service elabora la richiesta in locale o la passa a un altro nodo per un'ulteriore elaborazione.
  • would be [#]: come appare la dimensione dell'heap quando viene elaborata la richiesta.
  • limit of [#]: il limite dell'interruttore automatico corrente.
  • utilizzo reale: utilizzo effettivo dell'heap JVM.
  • nuovi byte riservati: la memoria effettiva necessaria per elaborare la richiesta.

Pressione della memoria JVM

Un'eccezione di interruzione di circuito è spesso causata dall'elevata pressione della memoria JVM. La pressione della memoria JVM si riferisce alla percentuale di heap Java utilizzata per tutti i nodi di dati nel cluster. Controlla il parametro JVMMemoryPressure in Amazon CloudWatch per determinare l'utilizzo corrente.

Nota: la dimensione dell'heap JVM di un nodo di dati è impostata sulla metà della dimensione della memoria fisica (RAM), fino a 32 GB. Ad esempio, se la memoria fisica (RAM) è di 128 GB per nodo, la dimensione dell'heap sarà comunque di 32 GB (la dimensione massima dell'heap). In caso contrario, la dimensione dell'heap viene calcolata come la metà della dimensione della memoria fisica.

L'elevata pressione della memoria JVM può essere causata da quanto segue:

  • Aumento del numero di richieste al cluster. Controlla i parametri IndexRate e SearchRate in Amazon CloudWatch per determinare il carico corrente.
  • Aggregazione, caratteri jolly e utilizzo di ampi intervalli di tempo nelle query.
  • Allocazione di partizioni sbilanciata tra i nodi o troppi frammenti in un cluster.
  • Esplosioni di mappatura dell'indice.
  • Utilizzo della struttura dati fielddata per eseguire query sui dati. Fieldata può occupare una grande quantità di spazio heap e rimanere nell'heap per tutta la durata di un segmento. Di conseguenza, la pressione della memoria JVM rimane elevata sul cluster quando viene utilizzato fielddata. Per ulteriori informazioni, consulta Fielddata sul sito Web di Elasticsearch.

Risoluzione dei problemi relativi all'elevata pressione della memoria JVM

Per risolvere l'elevata pressione della memoria JVM, provare i seguenti suggerimenti:

  • Riduci il traffico in entrata verso il cluster, soprattutto se hai un carico di lavoro elevato.
  • Prendi in considerazione la possibilità di ridimensionare il cluster per ottenere più memoria JVM per supportare il tuo carico di lavoro.
  • Se il ridimensionamento del cluster non è possibile, provare a ridurre il numero di partizioni eliminando indici vecchi o inutilizzati. Poiché i metadati delle partizioni sono memorizzati in memoria, la riduzione del numero di partizioni può ridurre l'utilizzo complessivo della memoria.
  • Abilita i registri lenti per identificare le richieste difettose.
    Nota: prima di abilitare le modifiche alla configurazione, verifica che la pressione della memoria JVM sia inferiore all'85%. In questo modo è possibile evitare costi aggiuntivi per le risorse esistenti.
  • Ottimizza le richieste di ricerca e indicizzazione e scegli il numero corretto di partizioni. Per ulteriori informazioni sull'indicizzazione e sul conteggio delle partizioni, consulta Introduzione ad Amazon OpenSearch Service: quante partizioni sono necessari?
  • Disabilita ed evita di utilizzare fielddata. Per impostazione predefinita, fielddata è impostato su "false" in un campo di testo, a meno che non sia esplicitamente definito diversamente nelle mappature di indice.
  • Modifica il tipo di mappatura dell'indice in una parola chiave, utilizzando l'API di reindicizzazione o crea o aggiorna l'API del modello di indice. È possibile utilizzare il tipo di parola chiave come alternativa per l'esecuzione di aggregazioni e l'ordinamento sui campi di testo.
  • Evita l'aggregazione sui campi di testo per evitare un aumento dei dati del campo. Quando si utilizzano più dati di campo, viene consumato più spazio nell'heap. Utilizza l'operazione API cluster stats per controllare i dati del campo.
  • Cancella la cache di fielddata con la seguente chiamata API:
POST /index_name/_cache/clear?fielddata=true (index-level cache)
POST */_cache/clear?fielddata=true (cluster-level cache)

Attenzione: se si svuota la cache di fielddata, eventuali query in corso potrebbero essere interrotte.

Per maggiori informazioni, consulta In che modo è possibile risolvere i problemi di utilizzo elevato di memoria JVM nel mio cluster Amazon OpenSearch Service?

Amazon OpenSearch Service è il successore di Amazon Elasticsearch Service.