Затраты на производительность профилирования веб-приложения в рабочей среде

StackOverflow https://stackoverflow.com/questions/1207802

Вопрос

Я пытаюсь решить проблемы с производительностью с помощью большого и сложного веб-приложения tomcat java.Самая большая проблема на данный момент заключается в том, что время от времени использование памяти резко возрастает, и приложение перестает отвечать.Я исправил все, что мог, с помощью профилировщиков журналов и байесовского анализа файлов журналов.Я рассматриваю возможность запуска профилировщика на производственном сервере tomcat.

Примечание для читателя с Нежной чувствительностью:

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

Вопросы:

Я ищу ответы, которые работают либо для веб-приложения Java, работающего на tomcat, либо отвечают на этот вопрос независимо от языка.

  • Каковы затраты на производительность профилирования?
  • Есть ли другие причины, по которым удаленное подключение и профилирование веб-приложения в рабочей среде - плохая идея (странные режимы сбоев, проблемы с безопасностью и т.д.)?
  • Насколько профилирование влияет на память отпечатка стопы?
  • В частности, существуют ли инструменты профилирования Java, которые имеют очень низкие затраты на производительность?
  • Какие-нибудь инструменты профилирования Java, предназначенные для профилирования веб-приложений?
  • Есть ли у кого-нибудь контрольные показатели затрат на производительность профилирования с помощью VisualVM?
  • До какого размера приложения и наборы данных могут масштабироваться VisualVM?
Это было полезно?

Решение

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

Чтобы ответить на ваши вопросы:

  1. Накладные расходы: Это отобранный профилировщики, то есть они генерируют таймер или счетчик производительности прерывается через некоторый регулярный интервал, и они смотрят на то, какой код выполняется в данный момент.Они используют это для построения гистограммы того, где вы проводите свое время, и накладные расходы очень невелики (1-8% - это то, что они утверждают) для разумных интервалов отбора проб.

    Взгляните на этот график частоты дискретизации по сравнениюнакладные расходы для OProfile.Вы можете настроить частоту дискретизации для снижения накладных расходов, если значения по умолчанию вам не нравятся.

  2. Использование в производстве: Единственное предостережение при использовании OProfile заключается в том, что вам нужно будет установить его на свой рабочий компьютер.Я полагаю, что в Red Hat есть поддержка ядра начиная с RHEL3, и я почти уверен, что другие дистрибутивы поддерживают ее.

  3. Память: Я не уверен, каков точный объем памяти OProfile, но я полагаю, что он хранит относительно небольшие буферы и время от времени сбрасывает их в файлы журнала.

  4. Java - Язык: OProfile включает агенты профилирования, которые поддерживают Java и которые осведомлены о коде, выполняемом в JITs.Таким образом, вы сможете видеть вызовы Java, а не только вызовы C в интерпретаторе и JIT.

  5. Веб- приложения: OProfile - это профилировщик системного уровня, поэтому он не знает о таких вещах, как сеансы, транзакции и т.д.что было бы у веб-приложения.

    Тем не менее, это полносистемный профилировщик, поэтому, если ваша проблема с производительностью вызвана плохим взаимодействием между ОС и JIT или если она находится в какой-либо сторонней библиотеке, вы сможете это увидеть, потому что OProfile профилирует ядро и библиотеки.Это преимущество для производственных систем, поскольку вы можете обнаружить проблемы, вызванные неправильными настройками или особенностями производственной среды, которые могут отсутствовать в вашей тестовой среде.

  6. ВизуалVM: Не уверен насчет этого, так как у меня нет опыта работы с VisualVM

Вот учебное пособие об использовании OProfile для поиска узких мест в производительности.

Другие советы

Я использовал YourKit для профилирования приложений в рабочей среде с высокой нагрузкой, и, хотя эффект, безусловно, был, он был вполне приемлемым.Ваш Комплект это имеет большое значение о возможности сделать это неинвазивным способом, например, выборочно отключить определенные функции профилирования, которые стоят дороже (на самом деле это скользящая шкала).

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

Нет ничего плохого в профилировании производственных приложений.Если вы работаете с распределенными приложениями, бывают случаи, когда исключение outofmemory возникает в очень уникальном вероятностном сценарии, который очень трудно воспроизвести в среде dev / stage / uat.

Вы можете попробовать использовать пользовательские профилировщики, но если вы спешите и подключение / настройка профилировщика в рабочей среде потребует времени, вы также можете использовать jvm для создания дампа памяти (дамп памяти jvms также дает вам дамп потока)

  1. Вы можете активировать автоматическую генерацию в командной строке JVM, используя следующую опцию :-XX:+Ошибка HeapDumpOnOutOfMemoryError

  2. проект Eclipse Memory Analyzer имеет очень мощную функцию под названием “группировать по значению”, которая позволяет создавать объектный запрос и перегруппировать экземпляры по значению поля.Это полезно в том случае, когда у вас есть много экземпляров, содержащих меньший набор возможных значений, и вы можете увидеть, какие значения используются чаще всего.Это действительно помогло мне разобраться в некоторых сложных дампах памяти, поэтому я рекомендую вам попробовать это.

Вы также можете рассмотреть возможность использования одной из современных JVM HotSpot - Java Flight Recorder и Управление полетами Java.Это набор инструментов, которые позволяют вам собирать низкоуровневую информацию о времени выполнения с нагрузкой на процессор около 5% (в любом случае, я не могу доказать последнее утверждение, это утверждение инженера Oracle, который представил функцию и живую демонстрацию).

Вы можете использовать этот инструмент до тех пор, пока ваше приложение запущено 1_7u40 JVM или выше.Чтобы включить сбор информации о времени выполнения, вам необходимо запустить JVM с определенными флагами:

По умолчанию JFR отключен в JVM.Чтобы включить JFR, вы должны запустить свое Java-приложение с -XX:+ Бортовой самописец вариант.Поскольку JFR является коммерческой функцией, доступной только в коммерческих пакетах, основанных на платформе Java Standard Edition (Oracle Java SE Advanced и Oracle Java SE Suite), вам также необходимо включить коммерческие функции с помощью -XX:+Разблокируйте коммерческие функции Опции.

(Цитируется http://docs.oracle.com/javase/8/docs/technotes/guides/jfr/about.html#sthref7)

Я добавил этот ответ, поскольку это жизнеспособный вариант для профилирования в производственной IMO.

Также существует Плагин Eclipse который поддерживает JFR и JMC и способен отображать информацию в удобном для пользователя виде.

С годами инструменты значительно улучшились.В наши дни большинство людей, у которых есть подобные потребности, используют инструмент, который подключается к Java instrumentation API вместо profiling API.Конечно, есть и другие примеры, но Новый реликварий и Динамика приложений приходите на ум.Решения на основе инструментария обычно запускаются как агент в JVM и постоянно собирают данные.Они сообщают данные на более высоком уровне (бизнес-транзакция, веб-транзакция, транзакция базы данных), чем старый подход к профилированию, и позволяют вам копать глубже (вплоть до метода или строки), если это необходимо.Вы даже можете настроить мониторинг и оповещения, чтобы отслеживать такие показатели, как время загрузки страницы и производительность в соответствии с условиями SLA.С этими замечательными инструментами у вас действительно больше не должно быть причин запускать профилировщик в рабочей среде.Затраты на их запуск незначительны.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top