EC2、Tomcat、Amazon Linux 和内存不足

EC2、Tomcat、Amazon Linux 和内存不足

我使用 AWS Elastic Beanstalk 来运行我的应用程序Tomcat 8.5Java 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

Cloud Watch 日志显示: 在此处输入图片描述

这是否意味着 t3.small 不足以运行我的服务器而不会出现内存问题,或者我的 Java 应用程序存在内存泄漏?我可以通过更改配置来修复它吗?

答案1

您想在 2GB 的机器上运行需要 1.5GB 的应用程序 - 这是相当困难的,因为不会剩下太多空间给系统、磁盘缓存、其他进程等。即使它没有崩溃,我也不会指望它有很好的性能。

运行它t3.medium,看看它是否仍然崩溃。如果崩溃了,则可能是内存泄漏。如果没有崩溃,则意味着您的应用程序需要的 RAM 超出了t3.small可以提供的容量。

如果您仍然坚持使用,t3.small即使它没有提供足够的内存大小,您可以尝试添加交换空间(例如 2GB) - 这将增加应用程序能够分配的内存量,但有些会非常慢,因为它在磁盘上。这可能重要也可能不重要,取决于应用程序如何使用分配的内存。

还要注意CPU 积分T2/T3 实例使用的 - 在快速处理一段时间后,您可能会遇到速度变慢的情况。描述如下:关于澄清 t2 和 t3 的工作条件?

底线是:使用合适大小的实例. 你肯定不希望耗尽内存或 CPU 能力,尤其是在生产过程中。

希望有帮助:)

相关内容