2014-05-22 87 views
12

我的系统遭受OOM(可能是由于DOS攻击)。 我正在使用Tomcat 7,NIO。 我正在寻找让我的系统对这些攻击更加强大的方法(尽管我不希望Tomcat完全免疫 - 我想尽可能提高鲁棒性)。Tomcat oomParachute:如何正确配置

我的日志显示:

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)说非常少:

(INT)的NIO连接器实现名为降落伞一个OutOfMemoryError策略。它将一大块数据保存为一个字节数组。如果是OOM,这部分数据将被释放并报告错误。这将给虚拟机足够的空间来清理。 oomParachute表示降落伞(字节数组)的大小(以字节为单位)。默认值是1024 * 1024(1MB)。请注意,这仅适用于与Java堆空间有关的OOM错误,并且绝对不能保证您将能够恢复。如果你在Java堆外部有一个OOM,那么这个降落伞技巧将无济于事。

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

这个降落伞真的有什么用?

谢谢!

回答

4

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

该错误信息是硬编码在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 - 安装和使用起来非常简单。