Tomcat oomParachute:如何正确配置

JRu*_*Run 13 java configuration tomcat out-of-memory

我的系统遭受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.
Run Code Online (Sandbox Code Playgroud)

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

(int)NIO连接器实现了一个名为parachute的OutOfMemoryError策略.它将一大块数据保存为字节数组.如果是OOM,则会释放此数据块并报告错误.这将为VM提供足够的清理空间.oomParachute表示降落伞的字节大小(字节数组).默认值为1024*1024(1MB).请注意,这仅适用于有关Java堆空间的OOM错误,并且绝对不能保证您根本无法恢复.如果你有一个超出Java堆的OOM,那么这个降落伞技巧将无济于事.

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

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

谢谢!

g0d*_*kar 5

如文档所述,该降落伞只是一个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-安装和使用起来非常容易。