Производительность Стоимость профилирования веб-приложения в производстве - PullRequest
14 голосов
/ 30 июля 2009

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

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

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

Вопросы:

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

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

Ответы [ 5 ]

13 голосов
/ 30 июля 2009

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

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

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

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

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

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

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

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

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

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

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

3 голосов
/ 30 июля 2009

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

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

1 голос
/ 30 апреля 2014

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

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

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

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

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

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

1 голос
/ 27 апреля 2014

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

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

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

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

0 голосов
/ 03 мая 2014

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

...