Amazon-Web-Services

EC2、Tomcat、Amazon Linux 和記憶體不足

  • January 25, 2019

我使用 AWS Elastic Beanstalk 在Tomcat 8.5上執行我的應用程序,Java 8在 64 位Amazon Linux上執行。我使用t3.small根據規範有 2vCPI 和 2.0 GB 的記憶體。我的配置如下所示:

在此處輸入圖像描述

一段時間後(2 天),我的應用程序記憶體不足。系統日誌顯示:

[ 4627.110117] [ pid ]   uid  tgid total_vm      rss nr_ptes nr_pmds swapents oom_score_adj name

[ 4627.204880] [ 8096]     0  8096   191163    10071     105       4        0             0 aws

[ 4627.209125] [ 8466]    91  8466  1132802   432642     998       8        0             0 java

[ 4627.217630] [ 8540]    48  8540   328251      999      98       4        0             0 httpd

[ 4627.221861] [ 8541]    48  8541   328285     1158      98       4        0             0 httpd

[ 4627.226172] [ 8542]    48  8542   328280     1265      98       4        0             0 httpd

[ 4627.234663] [ 8655]     0  8655   134228     5330      81       3        0             0 cfn-hup

[ 4627.273722] [ 8738]    48  8738   328280     1297      98       4        0             0 httpd
.......

[ 4627.299082] Out of memory: Kill process 8466 (java) score 865 or sacrifice child
[ 4627.303727] Killed process 8466 (java) total-vm:4531208kB, anon-rss:1730568kB, file-rss:0kB, shmem-rss:0kB

Cloud Watch 日誌顯示: 在此處輸入圖像描述

這是否意味著 t3.small 不足以在沒有記憶體問題的情況下執行我的伺服器,或者我的 java 應用程序中有記憶體洩漏?我可以通過更改配置以某種方式修復它嗎?

你想在 2GB 的機器上執行一個需要 1.5GB 的應用程序——這是一個相當大的範圍,因為系統、磁碟記憶體、其他程序等不會有太多剩餘空間。即使它有很好的性能,我也不指望它沒有崩潰。

執行它t3.medium,看看它是否仍然崩潰。如果是這樣,您可能有記憶體洩漏。如果不是,則意味著您的應用程序只需要比t3.small可以提供的更多 RAM。

如果你仍然堅持使用,t3.small即使它沒有提供足夠的記憶體大小,你可以嘗試添加一個交換空間(例如 2GB)——這將增加應用程序能夠分配的記憶體量,但其中一些會非常慢,因為它在磁碟上。這可能重要也可能不重要,取決於應用程序如何使用分配的記憶體。

另請注意 T2/T3 實例使用的CPU 積分- 在經過一段時間的快速處理後,您可能會遇到速度變慢的情況。這裡有描述:關於澄清 t2 和 t3 工作條件?

底線是:使用大小合適的實例。您不想耗盡 CPU 能力的記憶體,尤其是在生產中。

希望有幫助:)

引用自:https://serverfault.com/questions/950724