Слишком много основных сборок мусора: добавить пространство кучи или добавить еще одну виртуальную машину?

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

У нас есть приложение, работающее на WebLogic / JRockit в управляемом кластере.

У нас есть AppDynamics, отслеживающая это приложение, и оно показывает, что основная сборка мусора происходит часто (в среднем каждые 1-2 минуты !!!). Когда выполняется крупная сборка мусора, она восстанавливает пространство, и нижний диапазон использования кучи является достаточно низким, даже после того, как система проработала некоторое время (недели / месяцы). Кроме того, мы запустили обнаружение утечек коллекций AppDynamics в производственной среде и не обнаружили утечек. (Мы не смогли запустить пользовательский мониторинг, потому что он не поддерживается JRockit.) Но в целом кажется очевидным, что серьезных утечек нет, просто система требует больше ресурсов, чем имеет в настоящее время.

У нас есть два непроизводственных среды, также использующие это приложение, с уменьшенными ресурсами и уменьшенной нагрузкой (разработка и тестирование). В тестовой среде 2/3 количества виртуальных машин и 1/2 кучи на виртуальную машину. Мы провели несколько нагрузочных тестов в этой среде, но результаты не очень помогли. Хотя мы можем воссоздать количество пользователей с помощью автоматических сценариев, данные в нашей тестовой среде сильно отличаются - запросы возвращают на порядок меньше данных и т. Д. (Создание лучшей среды нагрузочного тестирования, безусловно, входит в список дел, но маловероятно на самом деле произойдет в ближайшее время по причинам бюрократии.) Даже со всем, что мы могли бросить на это, тестовая среда не вспотела.

Два варианта, А) Добавьте больше кучи. Кажется, что это наверняка поможет, но для этого потребуется много документов (потребуется добавить больше памяти к физическим серверам, что означает перезапуск сервера с участием множества других приложений и т. Д.). Кроме того, я понятия не имею, сколько еще памяти нужно добавить, и мы не можем просто «протестировать в продукте». Б) Добавьте еще одну виртуальную машину (или две) для этого приложения. Это было бы довольно просто, у нас есть место на другом физическом сервере, поэтому мы можем сделать это довольно быстро. Но я не уверен, что это сильно поможет, и если это не поможет, вернуться к варианту А позже будет еще сложнее.

Конкретные вопросы: 1) Очевидно ли, что один из вышеперечисленных вариантов лучше (и почему) ? 2) Если ни один из них явно не лучше, какие тесты и т. Д. что бы я сделал, чтобы решить, что лучше? 3) Как мне решить и обосновать, сколько еще ресурсов нужно добавить (кучу или виртуальные машины)? (Бонусные баллы здесь, если это включает инструменты, которые у нас уже есть.)

Обновления:

  • 3 JVM в кластере, каждая JVM находится на отдельной виртуальной машине.
  • Они находятся за балансировщиком нагрузки Apache, каждый сервер получает примерно одинаковую нагрузку.
  • Каждая JVM имеет кучу размером 1 ГБ.
  • Нет FMW.
1
задан 30 December 2016 в 21:43
2 ответа

В итоге мы сделали и то, и другое (добавили больше места в куче с 1 ГБ до 1,5 ГБ и добавили больше управляемых узлов с 3 до 5).

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

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

0
ответ дан 4 December 2019 в 05:26

Предполагая, что приложение было тщательно профилировано и утечек памяти не происходит (как кажется), вы должны работать с предположением, что создаваемые объекты в куче связаны с нормальной работой приложения.

Исключая оптимизацию кода и/или еще более тонкую настройку кучи памяти, основанную на размере и жизненном цикле создаваемых объектов (что, в свою очередь, зависит от конкретного JVM, который вы используете), не так уж много места для улучшений, кроме добавления большего количества управляемых узлов в ваш домен.

Этого можно легко достичь, используя инструмент, уже присутствующий в каждой установке WebLogic, а именно WLST.

Хорошо документировано, как создавать управляемые узлы и их соответствующие менеджеры узлов в существующем кластере с помощью WLST.

.
0
ответ дан 4 December 2019 в 05:26

Теги

Похожие вопросы