Tomcat oomParachute:如何正确配置

2022-09-04 23:03:24

我的系统遭受OOM(可能是由于DOS攻击)。我正在使用Tomcat 7,NIO。我正在寻找使我的系统对这些攻击更加健壮的方法(尽管我不期望使Tomcat完全免疫 - 我想尽可能地提高健壮性)。

我的日志显示:

Exception in thread "http-nio-8080-exec-285" Exception in thread "http-nio-8080-exec-82" SEVERE:Memory usage is low, parachute is non existent, your system may start failing.
Exception in thread "PoolCleaner[216942577:1400676008859]" SEVERE:Memory usage is low, parachute is non existent, your system may start failing.

所以我开始研究oomParachute。
文档(http://tomcat.apache.org/tomcat-7.0-doc/config/http.html)很少说:

(整型)NIO连接器实现了一种称为降落伞的OutOfMemorerror策略。它以字节数组的形式保存一个数据块。如果是 OOM,则会释放此数据块并报告错误。这将为 VM 提供足够的清理空间。oomParachute 表示降落伞(字节数组)的大小(以字节为单位)。默认值为 1024*1024(1MB)。请注意,这仅适用于有关 Java 堆空间的 OOM 错误,并且绝对不能保证您能够恢复。如果你在Java堆之外有一个OOM,那么这个降落伞技巧将无济于事。

所以我试图弄清楚:真的有像文档所说的那样的默认值吗?如果是这样,为什么我会得到“降落伞不存在”?
我应该定义降落伞吗?我应该在那里放什么值?哪些参数在确定此参数的值中起作用?(并发连接数?请求的预期大小?总堆?)

这个降落伞到底做了什么?

谢谢!


答案 1

正如文档所说,这个降落伞只是一个分配的,以便在发生错误时可以释放它,以便可以执行报告所述的操作。由于系统已经用完了可用内存,因此您似乎不太可能从问题中恢复过来。byte[]OutOfMemoryOutOfMemory

该错误消息在NioEndpoint类中是硬编码的:http://grepcode.com/file/repository.springsource.com/org.apache.coyote/com.springsource.org.apache.coyote/6.0.24/org/apache/tomcat/util/net/NioEndpoint.java#NioEndpoint.0oomParachuteData(向下滚动一点,你会看到它,就在oomParachute的正下方 - 它定期设置在checkParachute(),第694行和第1331行,你可以看到它是如何被使用的,以及一些开发人员的幽默)

可能意味着“嘿,我刚刚用了降落伞,你现在独自一人!”嘿嘿。

至于将其设置为合理的值,这在很大程度上取决于您有多少可用RAM,您的系统通常使用多少RAM,它在高峰时段通常使用多少RAM以及其他一些因素。话虽如此,这个“降落伞”不应该拯救你,只是稍微软化了OutOfMemory错误,以便可以记录它等等。

我个人推荐JavaMelody来跟踪您的内存使用情况,并对您的服务器有一个整体的“正在发生的事情”。它可以显示内存使用情况,CPU使用情况,所有正在运行的线程以及它们正在做什么,您运行的SQL等等:https://github.com/javamelody/javamelody/wiki - 它真的很容易安装和使用。


答案 2

推荐