Direkt zum Inhalt

Wie behebe ich Probleme mit hoher Speicherauslastung auf meiner EC2-Linux-Instance?

Lesedauer: 5 Minute
0

Ich möchte Probleme mit hoher Speicherauslastung in meiner Amazon Elastic Compute Cloud (Amazon EC2) Linux-Instance beheben.

Kurzbeschreibung

Wenn EC2 Linux-Instances eine hohe Speicherauslastung erfahren, kann dies zu einer Verschlechterung der Systemleistung oder zum Einfrieren führen. Diese Leistungsprobleme treten in der Regel aufgrund von Speicherlecks, ressourcenintensiven Prozessen oder unzureichender Speicherzuweisung auf. Um diese Probleme zu beheben, verwende zunächst die Linux-Systemtools, um die Ursache des Problems zu ermitteln. Befolge dann die Schritte zur Fehlerbehebung für die Ursache des Problems.

Lösung

Identifiziere die Ursache des Problems

Identifiziere die Speichernutzungsmuster für die EC2-Instance, um die Ursache des Problems zu ermitteln. Führe den folgenden Befehl aus, um die aktuelle Speichernutzung zu überprüfen:

free -h

Beispielausgabe:

      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

Führe den Befehl top aus, um speicherintensive Prozesse auf der EC2-Linux-Instance zu finden:

top

Beispielausgabe:

    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

Führe den folgenden Befehl aus, um Prozesse zu finden, die den meisten Speicher in der Instance verbrauchen:

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

Beispielausgabe:

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

Eine hohe Swap-Aktivität kann das System erheblich verlangsamen. Weitere Informationen findest du unter Aktivieren des Instance-Speicher-Swap-Volumes für M1- und C1-EC2-Instances.

Führe den folgenden Befehl aus, um nach Swap-Fehlern zu suchen:

vmstat 1 5

Beispielausgabe:

    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

Behebe das Problem anhand der Speichernutzungsmuster

Die Instance hat eine hohe Swap-Nutzungsrate

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um Swappiness zu reduzieren:

    sudo sysctl vm.swappiness=10
  2. Führe den folgenden Befehl aus, um den Swap zu löschen:

    # 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

    Wichtig: Wenn der physische Speicher der Instance für den Befehl Swap nicht ausreicht, erhältst du möglicherweise Out-of-Memory(OOM)-Fehler.

  3. Wenn die Instance mehr Speicherplatz benötigt, führe den folgenden Befehl aus:

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

Es gibt systemweite Speicherprobleme

Führe die folgenden Schritte aus:

  1. Führe die folgenden Befehle aus, um nach OOM-Fehler zu suchen:

    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. Um die Speicherauslastung für die Instance zu überwachen, führe den folgenden Befehl aus:

    watch -n 1 free -m
  3. Führe den folgenden Befehl aus, um nach verfügbaren Speicherseiten zu suchen:

    cat /proc/buddyinfo

Informationen findest du unter Amazon EC2-Instance-Typen.

**In den Java-Anwendungen gibt es Speicherlecks **

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um die Heap-Größe anzupassen:
    java -Xms2g -Xmx4g -jar application.jar
    **Hinweis:**Ersetze 2 g und 4 g durch die minimalen und maximalen Heap-Größen für die Anwendung.
  2. Führe den folgenden Befehl aus, um die Garbage Collection (GC)-Protokollierung zu aktivieren:
    java -Xlog:gc*=debug:file=gc.log -jar application.jar
    **Hinweis:**Ersetze gc.log durch den Protokolldateinamen und Pfad.
  3. Führe den folgenden Befehl aus, um den G1-Garbage Collector zur besseren Verwaltung des Instance-Speichers zu verwenden:
    java -XX:+UseG1GC -jar application.jar
    Hinweis: Ersetze -XX:+UseG1GC durch den bevorzugten Garbage Collection-Algorithmus.

Es gibt Probleme mit den Datenbankservern

Führe die folgenden Schritte aus:

  1. Führe den folgenden Befehl aus, um bestimmte Datenbankserverprozesse zu überwachen:

    ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
  2. Führe den folgenden Befehl aus, um die Nutzung des InnoDB-Pufferpools zu überprüfen:

    mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
  3. Führe den folgenden Befehl aus, um den Speicherverbrauch für jede Verbindung zu analysieren:

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

Informationen zur Optimierung der Datenbankserverleistung findest du unter Bewährte Methoden für die Arbeit mit MySQL.

Ähnliche Informationen

Metriken, Protokolle und Traces mit dem CloudWatch-Agenten erfassen

AWS OFFICIALAktualisiert vor einem Jahr