我使用 AWS Elastic Beanstalk 来运行我的应用程序Tomcat 8.5和Java 8运行于 64 位亚马逊 Linux。 我用t3.小根据规格,它有 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 应用程序存在内存泄漏?我可以通过更改配置来修复它吗?
答案1
您想在 2GB 的机器上运行需要 1.5GB 的应用程序 - 这是相当困难的,因为不会剩下太多空间给系统、磁盘缓存、其他进程等。即使它没有崩溃,我也不会指望它有很好的性能。
运行它t3.medium
,看看它是否仍然崩溃。如果崩溃了,则可能是内存泄漏。如果没有崩溃,则意味着您的应用程序需要的 RAM 超出了t3.small
可以提供的容量。
如果您仍然坚持使用,t3.small
即使它没有提供足够的内存大小,您可以尝试添加交换空间(例如 2GB) - 这将增加应用程序能够分配的内存量,但有些会非常慢,因为它在磁盘上。这可能重要也可能不重要,取决于应用程序如何使用分配的内存。
还要注意CPU 积分T2/T3 实例使用的 - 在快速处理一段时间后,您可能会遇到速度变慢的情况。描述如下:关于澄清 t2 和 t3 的工作条件?
底线是:使用合适大小的实例. 你肯定不希望耗尽内存或 CPU 能力,尤其是在生产过程中。
希望有帮助:)