跳至內容

如何對 EC2 Linux 執行個體上的高記憶體使用率問題進行疑難排解?

3 分的閱讀內容
0

我想對 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體中的高記憶體使用率問題進行疑難排解。

簡短描述

當 EC2 Linux 執行個體的記憶體使用率過高時,可能會導致系統效能下降或凍結。這些效能問題通常是由於記憶體洩漏、資源密集型程序或記憶體分配不足而發生的。若要解決這些問題,請先使用 Linux 系統工具來找出問題的根本原因。然後,請依照問題原因的疑難排解步驟進行操作。

解決方法

找出問題的根本原因

若要找出問題的原因,請確定 EC2 執行個體的記憶體使用模式。若要檢查目前的記憶體使用情況,請執行以下命令:

free -h

輸出範例:

 total        used        free      shared  buff/cache   availableMem:           15Gi       7.2Gi       2.1Gi       1.2Gi       5.7Gi       
 6.3GiSwap:           8Gi       6.5Gi       1.5Gi

若要尋找 EC2 Linux 執行個體上佔用大量記憶體的程序,請執行 top 命令:

top

輸出範例:

    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

若要尋找執行個體中消耗最多記憶體的程序,請執行以下命令:

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

輸出範例:

USER       PID  %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDmysql     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

高交換活動會顯著降低系統的速度。如需詳細資訊,請參閱為 M1 和 C1 EC2 執行個體儲存體交換磁碟區

若要檢查交換活動,請執行以下命令:

vmstat 1 5

輸出範例:

    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

根據記憶體使用模式對問題進行疑難排解

您執行個體的交換使用率偏高

請完成下列步驟:

  1. 若要減少交換量,請執行以下命令:

    sudo sysctl vm.swappiness=10
  2. 若要清除交換,請執行以下命令:

    # 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

    重要:如果執行個體的實體記憶體不足以支援交換命令,則可能會出現記憶體不足 (OOM) 錯誤。

  3. 如果您的執行個體需要更多空間,請執行以下命令:

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

存在系統範圍的記憶體問題

請完成下列步驟:

  1. 若要檢查 OOM 錯誤,請執行以下命令:

    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. 若要監控執行個體的記憶體使用情況,請執行以下命令:

    watch -n 1 free -m
  3. 若要檢查可用的記憶體頁面,請執行以下命令:

    cat /proc/buddyinfo

如需資訊,請參閱 Amazon EC2 執行個體類型

您的 Java 應用程式存在記憶體洩漏

請完成下列步驟:

  1. 若要調整堆積大小,請執行以下命令:
    java -Xms2g -Xmx4g -jar application.jar
    **注意:**將 2g4g 替換為您應用程式的最小和最大堆積大小。
  2. 若要開啟垃圾回收 (GC) 記錄,請執行以下命令:
    java -Xlog:gc*=debug:file=gc.log -jar application.jar
    **注意:**將 gc.log 替換為您的日誌檔案名稱和路徑。
  3. 若要使用 G1 垃圾回收器更好地管理執行個體記憶體,請執行以下命令:
    java -XX:+UseG1GC -jar application.jar
    **注意:**將 -XX:+UseG1GC 替換為您首選的垃圾收集演算法。

您的資料庫伺服器存在問題

請完成下列步驟:

  1. 若要監視特定的資料庫伺服器程序,請執行下列命令:

    ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql
  2. 若要檢查 InnoDB 緩衝集區使用情況,請執行下列命令:

    mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool"
  3. 若要分析每個連線的記憶體使用情況,請執行以下命令:

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

如需如何最佳化資料庫伺服器效能的資訊,請參閱使用 MySQL 的最佳做法

相關資訊

使用 CloudWatch 代理程式收集指標、日誌和追蹤記錄

AWS 官方已更新 5 個月前