Passer au contenu

Comment résoudre les problèmes d'utilisation élevée de la mémoire sur mon instance Linux EC2 ?

Lecture de 5 minute(s)
0

Je souhaite résoudre les problèmes d'utilisation élevée de la mémoire dans mon instance Linux Amazon Elastic Compute Cloud (Amazon EC2).

Brève description

Lorsque les instances Linux EC2 connaissent une utilisation élevée de la mémoire, il peut s’ensuivre une dégradation des performances du système ou un blocage. Ces problèmes de performance sont généralement dus à des fuites de mémoire, à des processus gourmands en ressources ou à une allocation de mémoire insuffisante. Pour résoudre ces problèmes, utilisez d'abord les outils du système Linux pour identifier la cause première du problème. Puis, suivez les étapes de dépannage pour déterminer la cause du problème.

Résolution

Identifier la cause racine du problème

Pour identifier la cause du problème, identifiez les modèles d'utilisation de la mémoire pour votre instance EC2. Pour vérifier l'utilisation actuelle de la mémoire, exécutez la commande suivante :

free -h

Exemple de sortie :

      total       used        free        shared      buff/cache   available
Mem:  15Gi        7.2Gi       2.1Gi       1.2Gi       5.7Gi        6.3Gi
Swap: 8Gi         6.5Gi       1.5Gi

Pour rechercher des processus gourmands en mémoire sur votre instance Linux EC2, exécutez la commande top :

top

Exemple de sortie :

    top - 14:23:45 up 15 days, 3:42, 1 user, load average: 2.15, 1.98, 1.75
Tasks: 256 total,   2 running, 254 sleeping,   0 stopped,   0 zombie
%Cpu(s): 24.8 us, 12.3 sy,  0.0 ni, 62.1 id,  0.8 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  32768.0 total,   2453.2 free,  24156.4 used,   6158.4 buff/cache
MiB Swap:   4096.0 total,   3012.5 free,   1083.5 used.   2537.2 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  1234 mysql     20   0   18.2g  15.1g   5.1g S  45.0  47.2   220:31 mysqld
  5678 tomcat    20   0   12.8g  11.2g   124m S  85.2  70.1   445:22 java

Pour identifier les processus qui consomment le plus de mémoire dans votre instance, exécutez la commande suivante :

ps aux --sort=-%mem | head -n 5

Exemple de sortie :

USER   PID   %CPU %MEM  VSZ    RSS   TTY  STAT  START TIME    COMMAND
mysql  1234  45.0 47.2  18.2g  15.1g ?    Ssl   Jan10 220:31  mysqldjava
       5678  85.2 70.1  12.8g  11.2g ?    Ssl   Jan12 445:22  javaapache
       9012  25.3 23.8  4.2g   3.8g  ?    Ss    Jan12 178:44  httpd

Une activité d’échange élevée peut considérablement ralentir votre système. Pour plus d'informations, consultez la section Activer le volume d'échange du stockage d'instances pour les instances EC2 M1 et C1.

Pour vérifier l'activité d’échange, exécutez la commande suivante :

vmstat 1 5

Exemple de sortie :

    procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 6650880  2150012 189408 5678024 45  67   234   567 300 450 65 15 10 10  0

Résoudre votre problème en fonction de vos habitudes d'utilisation de la mémoire

Votre instance présente un taux élevé d'utilisation des échanges

Procédez comme suit :

  1. Pour réduire la fréquence d’utilisation de l’espace d’échange, exécutez la commande suivante :

    sudo sysctl vm.swappiness=10
  2. Pour effacer la mémoire swap, exécutez la commande suivante :

    # Find processes using most swap
    $ smem -s swap -r
    
    # For specific process, check its swap usage
    $ grep VmSwap /proc/[PID]/status
    
    # Restart specific high-swap-usage processes during low-traffic periods
    $ systemctl restart [service-name]
    
    # Use Extreme caution when running this command - can cause OOM kills if physical memory is insufficient:
    $ sudo swapoff -a && sudo swapon -a

    Important : Si la mémoire physique de l'instance n'est pas suffisante pour la commande swap, vous pouvez recevoir des erreurs de mémoire insuffisante (OOM).

  3. Si votre instance a besoin d'espace supplémentaire, exécutez la commande suivante :

    sudo dd if=/dev/zero of=/swapfile bs=1G count=8

Il existe des problèmes de mémoire à l'échelle du système

Procédez comme suit :

  1. Pour vérifier la présence d'erreurs OOM, exécutez les commandes suivantes :

    sudo grep -i 'out of memory' /var/log/syslog
    sudo dmesg | grep -i 'out of memory'
    sudo journalctl -k | grep -i 'oom'
    sudo grep -i 'killed process' /var/log/messages
  2. Pour surveiller l'utilisation de la mémoire pour votre instance, exécutez la commande suivante :

    watch -n 1 free -m
  3. Pour vérifier les pages de mémoire disponibles, exécutez la commande suivante :

    cat /proc/buddyinfo

Pour plus d’informations, consultez la section Types d'instances EC2 d'Amazon.

Il existe des fuites de mémoire dans vos applications Java

Procédez comme suit :

  1. Pour ajuster la taille du tas, exécutez la commande suivante :
    java -Xms2g -Xmx4g -jar application.jar
    Remarque : Remplacez 2g et 4g par les tailles de tas minimale et maximale pour votre application.
  2. Pour activer la journalisation du récupérateur de mémoire (GC), exécutez la commande suivante :
    java -Xlog:gc*=debug:file=gc.log -jar application.jar
    Remarque : Remplacez gc.log par le nom et le chemin de votre fichier journal.
  3. Pour utiliser le récupérateur de mémoire G1 afin de mieux gérer la mémoire de votre instance, exécutez la commande suivante :
    java -XX:+UseG1GC -jar application.jar
    Remarque : Remplacez -XX:+UseG1GC par votre algorithme de récupérateur de mémoire préféré.

Il y a des problèmes avec vos serveurs de base de données

Procédez comme suit :

  1. Pour surveiller les processus spécifiques du serveur de base de données, exécutez la commande suivante :

    ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
  2. Pour vérifier l'utilisation du pool de mémoires tampons InnoDB, exécutez la commande suivante :

    mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
  3. Pour analyser l'utilisation de la mémoire pour chaque connexion, exécutez la commande suivante :

    mysql -e "SHOW VARIABLES LIKE '%buffer%';"

Pour plus d'informations sur l'optimisation des performances des serveurs de base de données, consultez la section Bonnes pratiques d’utilisation de MySQL.

Informations connexes

Collecter des métriques, des journaux et des suivis avec l'agent CloudWatch

AWS OFFICIELA mis à jour il y a un an