среда, 2 ноября 2016 г.

Профилируем Java приложения используя Java Mission Control

В этой статье я расскажу о том, что такое Java Mission Control и чем он может помочь.

Начиная с 7u40 в составе Oracle JDK появился GUI инструмент для реалтайм мониторинга и профилирования JVM. Он позволяет собрать очень много информации о JVM процессе, найти узкие места и проблемы, которые влияют на производительность.




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



Mission Control включает в себя JMX консоль и Java Flight Recorder (JFR). С помощью JMX осуществяется взаимодействие с удаленным Java процессом, а JFR собирает данные о событиях.

По умолчанию JMX и JFR выключены в Oracle JVM. Для их включения при запуске вашего Java приложения добавьте следущие параметры:

-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
 
Пример запуска JAR файла с этими параметрами:

$ java -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=8888 \
-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false \
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -jar application.jar

После запуска приложения попробуем подключиться к нему с помощью JMC.

Запускаем GUI (набрать в консоле jmc), создаем новое подкючение к JVM, указываем настройки подключения к удаленному серверу:



Включаем запись событий, указываем сколько времени будем собирать данные, одной минуты вполне дотаточно:


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

$ siege -b -c10 -t1m "http://138.102.22.11:9999 POST < request.txt"


Ждем минуту и смотрим информацию о событиях в приложении.


Стартовый экран


Память


Сборщик мусора


 Дерево вызова методов


Более подробнее о том, как мне с помощью Java Mission Control удалось найти проблемные места одного сервиса, увеличить его производительность и сократить количество серверов приложения в 2 раза я постараюсь написать в следущих постах.

Важно! Не используйте JMC без авторизации на продакшен серверах. Кроме того лицензия Oracle разрешает бесплатное использование утилитой только для разработки.

Полезные ссылки:

Комментариев нет:

Отправить комментарий