Come posso risolvere gli errori OutOfMemory in Amazon ECS?

6 minuti di lettura
0

Le mie attività Amazon Elastic Container Service (Amazon ECS) presentano problemi di utilizzo della memoria. Oppure i miei container si chiudono a causa di un errore OutOfMemory.

Breve descrizione

Se si verificano problemi di memoria insufficiente, Amazon ECS arresta l'attività e viene visualizzato il seguente messaggio di errore:

"OutOfMemoryError: Container killed due to memory usage".

Il problema si verifica quando i processi del container utilizzano più memoria rispetto alla quantità allocata nella definizione dell'attività. Per risolvere gli errori OutofMemory, intraprendi le seguenti azioni.

Risoluzione

Identifica le attività terminate da Amazon ECS a causa dell'esaurimento della memoria

Per identificare le attività terminate da Amazon ECS a causa dell'esaurimento della memoria, completa i seguenti passaggi:

  1. Controlla le attività arrestate sulla console Amazon ECS.
  2. Cerca le attività con codici di uscita 137 o 139, che in genere si verificano quando Amazon ECS presenta errori legati alla memoria.
  3. Se riscontri problemi di memoria, controlla i log dell'agente container per individuare eventuali problemi di memoria esaurita che hanno causato l'arresto dell'attività.

Monitora e analizza l'utilizzo della memoria del container

Per risolvere i problemi delle applicazioni relativi alla memoria, utilizza Amazon CloudWatch Logs per analizzare le attività. Utilizza la console Amazon ECS o CloudWatch per monitorare l'utilizzo della memoria del servizio. Per le metriche di memoria specifiche del container, configura CloudWatch Container Insights con osservabilità migliorata.

Per analizzare l'utilizzo della memoria di un container nel tempo, esegui una query personalizzata in CloudWatch Logs Insights.

Esempio di query:

stats max(MemoryUtilized) as mem, max(MemoryReserved ) as memreserved by bin (5m) as period, TaskId, ContainerName
| sort period desc
| filter ContainerName like "example-container-name"
| filter TaskId = "example-task-id"

Nota: sostituisci example-container-name con il nome del tuo container e example-task-id con l'ID della tua attività.

Imposta le quote di memoria nell'attività e nel container Amazon ECS

A livello di attività, puoi impostare una quota di memoria rigida per l'intera attività. A livello di container, puoi utilizzare i parametri memoryReservation (limiti di memoria flessibili) e memory (limiti di memoria rigidi) per allocare la memoria.

Prima di distribuire l'applicazione, assicurati che l'host disponga di memoria disponibile sufficiente. Quindi aggiorna la definizione dell'attività con quote di memoria flessibile e rigida.

Nota: puoi utilizzare il parametro memoryReservation solo nei container Linux.

Esempio di definizione dell'attività:

"containerDefinitions": [
    {
        "name": "example-container-name",
        "memory": 1024,
        "memoryReservation": 512
        // ... other container properties
    }
]

Configura lo swap per container con esigenze di memoria transitoria elevate

Nota: per utilizzare i parametri maxSwap e sharedMemorySize, le attività devono utilizzare il tipo di avvio Amazon Elastic Compute Cloud (Amazon EC2).

Se i container presentano picchi temporanei elevati di utilizzo della memoria, aggiorna la definizione dell'attività per utilizzare la configurazione swap. Lo swap riduce gli errori OutofMemory che si verificano durante i periodi di carico elevato. Tuttavia, lo swap può anche rallentare l'applicazione. Dopo aver attivato lo swap, monitora le prestazioni dell'applicazione.

Modifica le impostazioni di memoria dell'applicazione in base al framework di runtime

Le applicazioni potrebbero arrestarsi quando raggiungono le quote di memoria predefinite del framework o del runtime, anche con memoria di sistema disponibile o quote del container aumentate. Per risolvere il problema, monitora i modelli di utilizzo della memoria dell'applicazione. Identifica le impostazioni di memoria predefinite del framework o del runtime, quindi regola i parametri della memoria delle attività per allinearli ai requisiti dell'applicazione.

Applicazioni Java

La Java Virtual Machine (JVM) richiede un'allocazione di memoria iniziale dal sistema operativo all'avvio e ha una quota massima di utilizzo della memoria. Per ulteriori informazioni, consulta The java.lang.OutOfMemoryError error (L'errore java.lang.OutOfMemoryError) sul sito web di Oracle. Per regolare i valori della memoria, utilizza i flag JVM. Ad esempio, esegui questo comando per utilizzare -Xms per impostare la dimensione dell'heap iniziale e -Xmx per impostare la dimensione dell'heap massima:

java -Xms512m -Xmx2048m -jar your-app.jar

Per attivare la registrazione dettagliata della garbage collection (GC), aggiungi il seguente argomento JVM al comando Java:

-verbose:gc -Xlog:gc*:file=log_filename:time,uptime:filecount=num_files,filesize=file_sizem

Per ulteriori informazioni, consulta Garbage Collection logs (Log della garbage collection) sul sito web di Oracle.

Per una diagnostica avanzata della memoria, utilizza jcmd o jmap per generare heap dump e strumenti di analisi come JDK Mission Control o VisualVM. Per ulteriori informazioni, consulta Diagnostic data (Dati diagnostici) e Analysis tools (Strumenti di analisi) sul sito web di Oracle.

Applicazioni Node.js

Utilizza il seguente modulo v8.getHeapStatistics() per controllare la quota di memoria heap predefinita:

const v8 = require('v8');
console.log(v8.getHeapStatistics());

Per ulteriori informazioni, consulta v8.getHeapStatistics() sul sito web di Node.js.

Per aumentare la quota della dimensione dell'heap, utilzza il parametro --max-old-space-size quando esegui l'applicazione:

node --max-old-space-size=4096 app.js

Nota: il comando precedente imposta una quota heap di 4 gigabyte (GB). La dimensione della memoria heap predefinita può variare tra le diverse versioni di Node.js. Per ulteriori informazioni, consulta --max-old-space-size=SIZE (in MiB) sul sito web di Node.js.

Per monitorare la garbage collection, aggiungi il seguente flag al processo del nodo:

node --trace-gc server.js

Per ulteriori informazioni, consulta Tracing garbage collection (Monitoraggio della gargabe collection) sul sito web di Node.js.

Per una diagnostica approfondita della memoria, utilizza i profiler V8 integrati di Node.js, come --heap-prof, per creare snapshot dell'heap. Oppure utilizza --heapsnapshot-signal per creare snapshot dell'heap con i segnali di Linux. Per ulteriori informazioni, consulta --heap-prof e Using heap snapshot (Utilizzo dello snapshot dell'heap) sul sito web di Node.js.

Scala il servizio per ottimizzare l'utilizzo della memoria a livello di servizio

Per ottimizzare l'utilizzo della memoria a livello di servizio, monitora e regola l'allocazione delle risorse per scalare le attività in base ai modelli di utilizzo della memoria. Calcola la memoria totale utilizzata dalle attività del servizio. Quindi regola manualmente il valore dell'attività desiderato nel servizio in base alle esigenze di memoria.

Oppure utilizza policy di dimensionamento del servizio basate sulle metriche di utilizzo della memoria. Configura le policy di dimensionamento con soglie di aumento orizzontale e riduzione orizzontale.

Evita futuri errori OutofMemory

Per evitare futuri errori OutOfMemory, esegui un test di carico sul container all'interno di un host o server per determinare le esigenze di memoria dell'applicazione. Utilizza le statistiche dei container docker per monitorare l'utilizzo della memoria dei container durante i test. Per ulteriori informazioni, consulta docker container stats (Statistiche dei container docker) sul sito web di Docker.

Per aggiornare la configurazione del container, intraprendi le seguenti azioni:

  • Gestisci le strutture di dati.
  • Evita la creazione di oggetti non necessari.
  • Implementa il caching.
  • Utilizza algoritmi efficienti per ridurre l'ingombro di memoria.

Informazioni correlate

Come posso risolvere il problema relativo ad attività Amazon ECS che si interrompono o non vengono avviate quando il mio container si chiude?

AWS UFFICIALE
AWS UFFICIALEAggiornata 2 mesi fa