Как правильно контролировать память JVM?

9

Я думаю о том, как мы выполняем мониторинг памяти JVM с минимальными накладными расходами в производственной среде, даже в напряженный час.

Предположим, у меня есть два сервера приложений tomcat в производстве, за ними настроен баланс нагрузки. Если я могу видеть статистику памяти jvm, я могу сказать балансировке нагрузки прекратить отправку запроса на сервер, который столкнется с проблемой OOM. Это имеет смысл? Jconsole или VisualVM потребляют больше ресурсов, но это не мой выбор.

Vance
источник
Платформа Java Simon может быть достойной внимания.
Хмарбайз
возможный дубликат - stackoverflow.com/questions/242958/best-tools-to-monitor-tomcat
jasonk

Ответы:

1

Другие предоставили предложения о том, как контролировать использование памяти ...

Предположим, у меня есть два сервера приложений tomcat в производстве, за ними настроен баланс нагрузки. Если я могу видеть статистику памяти jvm, я могу сказать балансировке нагрузки прекратить отправку запроса на сервер, который столкнется с проблемой OOM. Это имеет смысл?

Вроде. Но это не обязательно лучший способ решить вашу проблему.

Давайте вернемся к корню проблемы ... OOMEs. В контексте Tomcat OOME могут быть вызваны одной из следующих причин:

  • утечки памяти в вашем приложении (или, возможно, в самом Tomcat),
  • попытки обработать слишком много запросов параллельно на каждом Tomcat, или
  • отдельные запросы, которые требуют слишком много памяти во время обработки.

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

1) Чтобы проверить, не является ли это утечкой памяти, вам нужно использовать инструмент анализа памяти, чтобы изучить долговременные схемы использования памяти. Это, вероятно, покажет пилообразный рисунок ... что нормально. То, что вам нужно искать, это уровень дна «зубов», растущих со временем вверх. Это указывает на то, что что-то создает мусор, который невозможно собрать; то есть утечка памяти.

Если у вас утечка памяти, лучшее решение - выяснить, какая часть вашего кода ответственна, и исправить ее. Все остальное ... в том числе распределение нагрузки ... является решением проблемы и может привести к ухудшению проблем в будущем.

2) Устранив утечки памяти, вы должны выяснить, заключается ли проблема в том, что вы обрабатываете слишком много запросов одновременно. Я не уверен в лучшем способе сделать это, но если это проблема (или вы подозреваете, что это так), то есть несколько возможных решений:

  • Настройте конфигурацию сервера Tomcat, чтобы уменьшить количество рабочих потоков.

  • Если ваши запросы связаны с вводом / выводом, то другой возможностью было бы посмотреть на поддержку асинхронной обработки запросов, доступную в последних версиях спецификации сервлета - см. Http://docs.oracle.com/javaee/7/tutorial/doc/ servlets012.htm . Но это будет больше работы.

3) Если проблема заключается в том, что определенные запросы используют слишком много памяти, вам нужно выяснить, как обнаружить эти запросы заранее и «справиться с ними». Обнаружение и обработка этих запросов может быть затруднено ... и трудно сообщить без подробностей вашего заявления. Но пара прагматических решений:

  • Направляйте аномальные запросы на другой сервер с большой кучей ... где OOME не будут мешать "нормальным" запросам.

  • Увеличьте размер кучи. Если у вас достаточно физической памяти, работа с большей кучей может сделать ваши серверы Tomcat более эффективными ... а также избежать OOMEs.


Таким образом, вместо того, чтобы пытаться сбалансировать нагрузку, чтобы избежать OOME, я предлагаю вам выяснить, почему вы получаете OOMEs ... и попытаться разобраться с причиной OOMEs напрямую.

Стивен С
источник
0

Может быть, стоит посмотреть на jvmtop .

Он показывает вам "топ-подобный" способ мониторинга показателей на основе jvm, таких как потребление памяти, загрузка ЦП, подсчет потоков и т. Д.

MRalwasser
источник