Tomcat oomParachute: как правильно настроить

Моя система страдает от 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) говорит очень мало:

(int) Разъем NIO реализует стратегию OutOfMemoryError, называемую парашютом. Он содержит кусок данных в виде байтового массива. В случае OOM этот фрагмент данных освобождается и сообщается об ошибке. Это даст VM достаточно места для очистки. OomParachute представляет размер в байтах парашюта (массив байтов). Значение по умолчанию - 1024 * 1024 (1 МБ). Обратите внимание, что это работает только для ошибок OOM в отношении пространства Java Heap, и нет абсолютно никакой гарантии, что вы сможете вообще восстановиться. Если у вас есть OOM вне Java-кучи, то этот парашютный трюк не поможет.

Итак, я пытаюсь понять: Действительно ли дефолт, как говорит док? Если да, то почему я получаю "парашют не существует"?
Должен ли я определить парашют? Какую ценность мне стоит положить? Какие параметры играют роль в определении значения этого параметра? (количество параллельных соединений? ожидаемый размер запроса? общая куча?)

Что делает этот парашют действительно?

Спасибо!

Ответ 1

Как говорится в документах, этот парашют - это просто 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 вы можете видеть, как он используется, и некоторый юмор разработчика)

Возможно, это означает "эй, я просто использовал парашют, ты сейчас один!" хе-хе.

Что касается установки его на разумное значение, это во многом зависит от того, сколько оперативной памяти у вас есть, сколько оперативной памяти обычно используется вашей системой, сколько оперативной памяти она обычно использует в пиковые времена и некоторые другие факторы. Сказав это, этот "парашют" не должен вас спасать, просто немного смягчите ошибку OutOfMemory, чтобы он мог быть зарегистрирован и все такое.

Я лично рекомендую JavaMelody для отслеживания использования вашей памяти и общего "что происходит" с вашим сервером. Он может показать использование памяти, использование ЦП, все потоки, выполняемые и что они делают, SQL-ы, которые вы запускали, и многое другое: https://github.com/javamelody/javamelody/wiki - Это очень легко установить и использовать.