如何對 EC2 Linux 執行個體上的高記憶體使用率問題進行疑難排解?
我想對 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
根據記憶體使用模式對問題進行疑難排解
您執行個體的交換使用率偏高
請完成下列步驟:
-
若要減少交換量,請執行以下命令:
sudo sysctl vm.swappiness=10 -
若要清除交換,請執行以下命令:
# 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) 錯誤。
-
如果您的執行個體需要更多空間,請執行以下命令:
sudo dd if=/dev/zero of=/swapfile bs=1G count=8
存在系統範圍的記憶體問題
請完成下列步驟:
-
若要檢查 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 -
若要監控執行個體的記憶體使用情況,請執行以下命令:
watch -n 1 free -m -
若要檢查可用的記憶體頁面,請執行以下命令:
cat /proc/buddyinfo
如需資訊,請參閱 Amazon EC2 執行個體類型。
您的 Java 應用程式存在記憶體洩漏
請完成下列步驟:
- 若要調整堆積大小,請執行以下命令:
**注意:**將 2g 和 4g 替換為您應用程式的最小和最大堆積大小。java -Xms2g -Xmx4g -jar application.jar - 若要開啟垃圾回收 (GC) 記錄,請執行以下命令:
**注意:**將 gc.log 替換為您的日誌檔案名稱和路徑。java -Xlog:gc*=debug:file=gc.log -jar application.jar - 若要使用 G1 垃圾回收器更好地管理執行個體記憶體,請執行以下命令:
**注意:**將 -XX:+UseG1GC 替換為您首選的垃圾收集演算法。java -XX:+UseG1GC -jar application.jar
您的資料庫伺服器存在問題
請完成下列步驟:
-
若要監視特定的資料庫伺服器程序,請執行下列命令:
ps -eo pid,ppid,cmd,%mem,%cpu,rss,vsz | grep mysql -
若要檢查 InnoDB 緩衝集區使用情況,請執行下列命令:
mysql -e "SHOW ENGINE INNODB STATUS\G" | grep "Buffer pool" -
若要分析每個連線的記憶體使用情況,請執行以下命令:
mysql -e "SHOW VARIABLES LIKE '%buffer%';"
如需如何最佳化資料庫伺服器效能的資訊,請參閱使用 MySQL 的最佳做法。
相關資訊
相關內容
- 已提問 2 年前
- 已提問 1 年前
- 已提問 1 年前
