2014-05-22 18 views
12

Il mio sistema soffre di OOM (presumibilmente a causa di un attacco DOS). Sto usando Tomcat 7, NIO. Sto cercando modi per rendere il mio sistema più robusto a questi attacchi (anche se non mi aspetto di rendere Tomcat completamente immune - voglio migliorare la robustezza il più possibile).Tomcat oomParachute: come configurare correttamente

miei log mostrano:

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. 

così ho iniziato a indagare l'oomParachute.
La documentazione (http://tomcat.apache.org/tomcat-7.0-doc/config/http.html) dice molto poco:

(int) Il connettore NIO implementa una strategia OutOfMemoryError chiamato paracadute. Tiene un blocco di dati come una matrice di byte. In caso di una OOM, questa porzione di dati viene rilasciata e viene segnalato l'errore. Questo darà alla VM spazio sufficiente per ripulire. OomParachute rappresenta la dimensione in byte del paracadute (l'array di byte). Il valore predefinito è 1024 * 1024 (1 MB). Si noti che questo funziona solo per gli errori OOM relativi allo spazio Java Heap e non è assolutamente possibile garantire che sarà possibile eseguire il ripristino. Se hai una OOM al di fuori del Java Heap, allora questo trucco con il paracadute non ti aiuterà.

Quindi sto cercando di capire: C'è davvero un valore predefinito come dice il documento? In tal caso, perché ricevo "il paracadute non esiste"?
Devo definire un paracadute? Che valore dovrei mettere lì? Quali parametri svolgono un ruolo nel determinare il valore di questo parametro? (numero di connessioni simultanee? dimensione prevista della richiesta? heap totale?)

Cosa fa veramente questo paracadute?

Grazie!

risposta

4

Come documenti dice, questo è semplicemente un paracadute byte[] assegnata in modo che in caso di un errore OutOfMemory può essere liberato quindi l'azione di segnalazione detto OutOfMemory può essere eseguito. Poiché il sistema è già fuori dalla memoria disponibile, sembra improbabile che tu possa recuperare il problema.

Questo messaggio di errore è codificato nella classe 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 (scorrere verso il basso solo un po 'e lo vedrete, proprio sotto il oomParachute - viene periodicamente impostato a checkParachute(), riga 694 e alla riga 1331 puoi vedere come è usato, e alcuni umorismo dello sviluppatore)

Probabilmente significa "hey, ho appena usato il paracadute, sei da solo ora!" hehe.

Per quanto riguarda l'impostazione di un valore ragionevole, dipende in gran parte dalla quantità di RAM disponibile, dalla quantità di RAM utilizzata dal sistema, dalla quantità di RAM utilizzata normalmente durante le ore di punta e da altri fattori. Detto questo, questo "paracadute" non dovrebbe salvarti, basta ammorbidire un po 'l'errore OutOfMemory in modo che possa essere registrato e tutto il resto.

Personalmente raccomando JavaMelody per monitorare l'utilizzo della memoria e avere un "tutto ciò che sta succedendo" con il server. Può mostrare l'utilizzo della memoria, l'utilizzo della CPU, tutti i thread in esecuzione e cosa stanno facendo, le SQL che hai eseguito e molto altro: https://github.com/javamelody/javamelody/wiki - È davvero facile da installare e utilizzare.

Problemi correlati