【问题标题】:Linux Ubuntu Tomcat Best Config to avoid insufficient memoryLinux Ubuntu Tomcat 最佳配置避免内存不足
【发布时间】:2016-10-15 07:15:52
【问题描述】:

我的生产环境 webapp 出现内存问题。

我有一个在 AWS EC2 t2.medium 实例中运行的 Tomcat(2 核 cpu 64 位 + 4gb ram)。

这是来自 javamelody 的一些信息:

OS: OS Linux, 3.13.0-87-generic , amd64/64 (2 cores)
Java:   Java(TM) SE Runtime Environment, 1.8.0_91-b14
JVM:    Java HotSpot(TM) 64-Bit Server VM, 25.91-b14, mixed mode

Tomcat "http-nio-8080": Busy threads = 4 / 200     ++++++++++++ 
Bytes received = 8.051
Bytes sent = 206.411.053
Request count = 3.204 
Error count = 70 
Sum of processing times (ms) = 540.398 
Max processing time (ms) = 12.319
Memory: Non heap memory = 130 Mb (Perm Gen, Code Cache),
Buffered memory = 0 Mb,
Loaded classes = 12,258,
Garbage collection time = 1,394 ms,
Process cpu time = 108,100 ms,
Committed virtual memory = 5,743 Mb,
Free physical memory = 142 Mb,
Total physical memory = 3,952 Mb,
Free swap space = 0 Mb,
Total swap space = 0 Mb
Free disk space:    27.457 Mb

我的申请进入:

内存不足,Java 运行时环境无法继续。 本机内存分配 (mmap) 未能映射 12288 字节以提交保留内存。

我已经应用了以下配置选项,但似乎又失败了。

导出 JAVA_OPTS="-Dfile.encoding=UTF-8 -Xms1024m -Xmx3072m -XX:PermSize=128m -XX:MaxPermSize=256m"

这个配置适合我的 linux 配置吗?

更多信息:我的数据库和文件系统正在另一个 t2.medium 实例中运行(Windows 2 cores cpu + 4gb ram)。

谢谢,对不起我的英语。

已编辑:

问题仍然存在。最奇怪的是,在日志中没有大进程在运行,而且时间已经过去了(所以很少有人连接到应用程序)。

过去,我在 Windows 环境中使用了该应用程序,但没有发生这种情况。我认为 Linux 实例会更好,但我快疯了。

日志:

Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000f2d80000, 43515904, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 43515904 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /home/ubuntu/hs_err_pid20233.log

现在我的配置是 setenv.sh

export CATALINA_OPTS="-Dfile.encoding=Cp1252 -Xms2048m -Xmx2048m -server"

我不知道是否有意义,但 hs_err 文件有这一行:

内存:4k 页面,物理 4046856k(102712k 空闲),交换 0k(0k 空闲)

【问题讨论】:

    标签: linux performance tomcat memory amazon-ec2


    【解决方案1】:

    这个配置适合你的 linux 配置吗?好吧,我们不知道机器上还运行着什么,以及其他进程将使用多少内存。因此,答案是“视情况而定”。但是,您可以通过以下方式自行找出正确的设置:

    如果您想提前知道服务器有足够的内存,请将-Xmx-Xms 设置为相同的值。这样,当您启动服务器时,您就会遇到 OutOfMemory 条件,而不是在将来的某个随机时间。也许您的操作系统只能分配 2.8G 而不是 3。(与 permsize 参数相同,以防您仍在 Java7 上运行,否则将其删除)

    您可能还想将-XX:+AlwaysPreTouch 添加到参数列表中,这样您就可以确保从一开始就已经分配了内存。

    最后,你不想设置JAVA_OPTS(这将用于JVM的任何启动,包括关闭命令),而是使用CATALINA_OPTS(仅用于启动tomcat)

    【讨论】:

    • 唯一运行的大进程是带有应用程序的tomcat。我已经删除了 PermGen,因为 Java 8 删除了它(感谢您的建议)。但是,我认为有些地方出了问题..因为使用“top”命令我正在观察内存和进程,而“空闲”内存从一个很大的数字开始,然后开始减少和减少......我不知道为什么,但就像用过的内存永远不会被重用。
    • 您明确允许它增长到 3072m。在达到这一点之前,不需要重用。这就是为什么你应该一次分配所有内存:如果你有足够的可用内存,你会立即得到反馈
    • 所以我将明确添加相同的 xms 和 xmx。那么,你说Tomcat永远不会释放分配的内存?就算不使用呢?
    • 在调整系统时,您的部分责任是弄清楚 tomcat 需要多少内存。如果它暂时需要更少,多余的内存就不会交还给操作系统,不。而且你不想要它:一旦tomcat下次需要更多内存,你就会遇到你在问题中描述的问题:当操作系统没有足够的内存时,你会用完内存。或者更糟糕的是,使用虚拟内存 - 这通常会影响您的性能。
    • 我从今天的错误中添加了额外的信息。我仍然收到错误消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多