2014-05-22 89 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 - 安裝和使用起來非常簡單。