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 - Это очень легко установить и использовать.