Comment puis-je résoudre les erreurs OutOfMemory dans Amazon ECS ?
Mes tâches Amazon Elastic Container Service (Amazon ECS) présentent des problèmes d'utilisation de la mémoire. Ou bien, mes conteneurs se ferment en raison d'une erreur OutOfMemory.
Brève description
Si vous rencontrez des problèmes de mémoire insuffisante, Amazon ECS arrête la tâche et le message d'erreur suivant s'affiche :
« OutOfMemoryError: Container killed due to memory usage » (OutOfMemoryError : Conteneur désactivé en raison de l'utilisation de la mémoire).
Ce problème se produit lorsque les processus du conteneur utilisent plus de mémoire que la quantité que vous avez allouée dans la définition de tâche. Pour résoudre les problèmes OutofMemory, effectuez les actions de dépannage suivantes.
Résolution
Identifier les tâches qu'Amazon ECS a interrompues en raison de l'épuisement de la mémoire
Pour identifier les tâches qu'Amazon ECS a interrompues en raison de l'épuisement de la mémoire, procédez comme suit :
- Vérifiez les tâches interrompues sur la console Amazon ECS.
- Recherchez les tâches comportant les codes de sortie 137 ou 139 qui se produisent généralement lorsqu'Amazon ECS rencontre des défaillances liées à la mémoire.
- Si vous rencontrez des problèmes de mémoire, consultez les journaux de l'agent de conteneur pour détecter les problèmes de mémoire qui ont entraîné l'arrêt de la tâche.
Surveiller et analyser l'utilisation de la mémoire de conteneur
Pour résoudre les problèmes d'application liés à la mémoire, utilisez Amazon CloudWatch Logs pour analyser vos tâches. Utilisez la console Amazon ECS ou CloudWatch pour surveiller l'utilisation de la mémoire de service. Pour les métriques de mémoire spécifique au conteneur, configurez CloudWatch Container Insights avec une observabilité accrue.
Pour analyser l'utilisation de la mémoire d'un conteneur au fil du temps, utilisez une requête personnalisée dans CloudWatch Logs Insights.
Exemple de requête :
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"
Remarque : Remplacez example-container-name par le nom de votre conteneur et example-task-id par votre ID de tâche.
Définir des quotas de mémoire dans la tâche et le conteneur Amazon ECS
Au niveau de la tâche, vous pouvez définir un quota de mémoire pour l'intégralité de la tâche. Au niveau du conteneur, vous pouvez utiliser les paramètres memoryReservation (limites flexibles de mémoire) et memory (limites strictes de mémoire) pour allouer de la mémoire.
Avant de déployer votre application, assurez-vous que votre hôte dispose d’une mémoire disponible suffisante. Puis, mettez à jour la définition de votre tâche avec des quotas de mémoire logicielle et matérielle.
Remarque : Vous ne pouvez utiliser le paramètre memoryReservation que dans les conteneurs Linux.
Exemple de définition de tâche :
"containerDefinitions": [ { "name": "example-container-name", "memory": 1024, "memoryReservation": 512 // ... other container properties } ]
Configurer l’échange pour les conteneurs qui ont des besoins de mémoire transitoires élevés
Remarque : Pour utiliser les paramètres maxSwap et sharedMemorySize, vos tâches doivent utiliser le type de lancement Amazon Elastic Compute Cloud (Amazon EC2).
Si vos conteneurs connaissent des pics d'utilisation de la mémoire temporaires élevés, mettez à jour la définition de la tâche pour utiliser la configuration d'échange. La fonctionnalité d’échange réduit les erreurs OutofMemory qui se produisent pendant les périodes de charge élevée. Cependant, l’échange peut également ralentir votre application. Après avoir activé l’échange, surveillez les performances de votre application.
Ajuster les paramètres de mémoire de votre application en fonction de votre environnement d'exécution
Les applications peuvent s'arrêter lorsqu'elles atteignent les quotas de mémoire par défaut du cadre ou de l'exécution, même avec de la mémoire système disponible ou des quotas de conteneurs augmentés. Pour résoudre ce problème, surveillez les modèles d'utilisation de la mémoire de votre application. Identifiez les paramètres de mémoire par défaut de votre cadre ou de votre environnement d'exécution, puis ajustez les paramètres de mémoire de vos tâches en fonction des exigences de votre application.
Applications Java
La machine virtuelle Java (JVM) nécessite une allocation de mémoire initiale du système d'exploitation (OS) au démarrage et dispose d'un quota d'utilisation de mémoire maximal. Pour plus d'informations, consultez la page Erreur java.lang.OutOfMemoryError sur le site Web d'Oracle. Pour ajuster les valeurs de mémoire, utilisez les indicateurs JVM. Par exemple, exécutez la commande suivante pour utiliser -Xms pour définir la taille initiale du segment et -Xmx pour définir la taille maximale du segment :
java -Xms512m -Xmx2048m -jar your-app.jar
Pour activer la journalisation détaillée du récupérateur de mémoire (GC), ajoutez l'argument JVM suivant à votre commande Java :
-verbose:gc -Xlog:gc*:file=log_filename:time,uptime:filecount=num_files,filesize=file_sizem
Pour plus d'informations, consultez la page Journaux du récupérateur de mémoire sur le site Web d'Oracle.
Pour des diagnostics avancés de la mémoire, utilisez jcmd ou jmap pour générer des segments de mémoire et des outils d'analyse tels que JDK Mission Control ou VisualVM. Pour plus d'informations, consultez la section Données de diagnostic et Outils d'analyse sur le site Web d'Oracle.
Applications Node.js
Utilisez le module v8.getHeapStatistics() suivant pour vérifier le quota de mémoire par défaut du segment :
const v8 = require('v8'); console.log(v8.getHeapStatistics());
Pour plus d'informations, consultez la page v8.getHeapStatistics() sur le site Web de Node.js.
Pour augmenter le quota de taille de tas, utilisez le paramètre --max-old-space-size lorsque vous exécutez votre application :
node --max-old-space-size=4096 app.js
Remarque : La commande précédente définit un quota de segment de 4 Go. La taille de mémoire du segment par défaut peut varier selon les différentes versions de Node.js. Pour plus d'informations, consultez la page --max-old-space-size=SIZE (en MiB) sur le site Web de Node.js.
Pour suivre le récupérateur de mémoire, ajoutez l'indicateur suivant au processus du nœud :
node --trace-gc server.js
Pour plus d'informations, consultez la page Suivi du récupérateur de mémoire sur le site Web de Node.js.
Pour des diagnostics de mémoire approfondis, utilisez les profileurs intégrés à Node.js V8, tels que --heap-prof, pour créer des instantanés de segment. Ou utilisez --heapsnapshot-signal pour utiliser les signaux Linux afin de créer des instantanés de segment. Pour plus d'informations, consultez les pages --heap-prof et Utilisation de l’instantané de segment sur le site Web de Node.js.
Mettre votre service à l’échelle pour optimiser votre utilisation de la mémoire de niveau service
Pour optimiser l'utilisation de la mémoire de niveau service, surveillez et ajustez votre allocation de ressources afin de mettre à l’échelle les tâches en fonction des modèles d'utilisation de la mémoire. Calculer la mémoire totale utilisée par les tâches de service. Puis, ajustez manuellement la valeur de tâche souhaitée dans votre service en fonction de vos besoins en mémoire.
Vous pouvez également utiliser des politiques de mise à l’échelle des services basées sur des métriques d'utilisation de la mémoire. Configurez les politiques de mise à l’échelle avec des seuils pour effectuer une mise à l'échelle horizontale ascendante et une mise à l'échelle horizontale descendante
Éviter de futures erreurs OutOfMemory
Pour éviter de futures erreurs OutofMemory, effectuez un test de charge sur le conteneur d'un hôte ou d'un serveur afin de déterminer les besoins en mémoire de l'application. Utilisez les statistiques du conteneur Docker pour surveiller l'utilisation de la mémoire des conteneurs lorsque vous effectuez des tests. Pour plus d'informations, consultez les statistiques du conteneur Docker sur le site Web de Docker.
Pour mettre à jour la configuration de votre conteneur, effectuez les actions suivantes :
- Gérez les structures de données.
- Évitez de créer des objets inutiles.
- Implémentez la mise en cache.
- Utilisez des algorithmes efficaces pour réduire l'empreinte mémoire.
Informations connexes
- Sujets
- Containers
- Langue
- Français

Contenus pertinents
demandé il y a un an
demandé il y a un an
AWS OFFICIELA mis à jour il y a 2 ans
AWS OFFICIELA mis à jour il y a un an
AWS OFFICIELA mis à jour il y a 8 mois