Amazon-Web-Services
EC2、Tomcat、Amazon Linux 和記憶體不足
我使用 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
這是否意味著 t3.small 不足以在沒有記憶體問題的情況下執行我的伺服器,或者我的 java 應用程序中有記憶體洩漏?我可以通過更改配置以某種方式修復它嗎?
你想在 2GB 的機器上執行一個需要 1.5GB 的應用程序——這是一個相當大的範圍,因為系統、磁碟記憶體、其他程序等不會有太多剩餘空間。即使它有很好的性能,我也不指望它沒有崩潰。
執行它
t3.medium
,看看它是否仍然崩潰。如果是這樣,您可能有記憶體洩漏。如果不是,則意味著您的應用程序只需要比t3.small
可以提供的更多 RAM。如果你仍然堅持使用,
t3.small
即使它沒有提供足夠的記憶體大小,你可以嘗試添加一個交換空間(例如 2GB)——這將增加應用程序能夠分配的記憶體量,但其中一些會非常慢,因為它在磁碟上。這可能重要也可能不重要,取決於應用程序如何使用分配的記憶體。另請注意 T2/T3 實例使用的CPU 積分- 在經過一段時間的快速處理後,您可能會遇到速度變慢的情況。這裡有描述:關於澄清 t2 和 t3 工作條件?
底線是:使用大小合適的實例。您不想耗盡 CPU 能力的記憶體,尤其是在生產中。
希望有幫助:)