Java один поток медленно - PullRequest
       19

Java один поток медленно

0 голосов
/ 07 сентября 2011

У меня есть Java-приложение J2EE, которое обрабатывает запросы SOAP. В нашей производственной среде (HPUX, OC4J, Java 5) для этого процесса запущено около 20 потоков, и иногда мы видим, что 1 поток останавливается на ~ 15 секунд. До сих пор мне не удавалось воспроизвести проблему в нашей среде подготовки производства, и я боюсь ломать вещи и нарушать SLA, если я использую jconsole и связанные инструменты на нашем производственном сервере.

У кого есть вдохновение? Я знаю о http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf, но мне не хватает опыта осмелиться использовать его прямо в производстве (плюс, ребята из HPUX выбросили некоторые из этих инструментов из набора инструментов, заменив их на HPJMeter)

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

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Есть несколько вещей, которые вы можете сделать в HP-UX, чтобы получить дополнительную информацию о работающем процессе Java.Если вы отправите сигнал PROF в JVM, он переключит генерацию журнала GC (как если бы вы использовали опцию командной строки -Xverbosegc).Создание журнала GC очень недорого, поэтому вы можете включить его в производственной среде, не влияя на производительность.

Если вы отправите сигнал USR2 в JVM, он начнет профилирование (аналогично -Xeprof).Если вы отправите сигнал во второй раз, он отключит профилирование.Это окажет заметное влияние на производительность, хотя оно будет меньше, чем то, что вы видели бы из внешнего стороннего профилировщика.

Вы можете анализировать полученные файлы данных с помощью HPjmeter.HPjmeter также может подключаться к работающей JVM для мониторинга в реальном времени.В Java 5 вам нужно запустить JVM с опцией -agentlib.Если бы вы использовали Java 6, вы могли бы подключиться к работающей JVM без дополнительных параметров командной строки.

1 голос
/ 07 сентября 2011

Мы регулярно подключаем jconsole (и другие инструменты) прямо к производству.Для нас нет значительных накладных расходов, инструментарий уже работает в JVM, поэтому вы просто подключаете удаленный процесс для чтения опубликованных значений.Я говорю, дерзай!

В любом случае, тебе действительно нужно посмотреть, что происходит на коробке.Дампы потока могут или делать некоторые внутренние инструменты.Под внутренним инструментарием я подразумеваю запись ключевых мер в коде и их раскрытие каким-либо образом.По сути, это то, что делает JVM (демонстрируя их с помощью JMX), но использование собственного дает вам больше специфичности.Например, я часто записываю время запроса / ответа или другие критические временные характеристики производительности пути.

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

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

С научной точки зрения в этой статье есть некоторые комментарии.Это предполагает до 7% накладных расходов (что противоречит моему предыдущему пункту), предыдущая статья от 2006 года предлагает 3-4%, но оба они являются контекстуальными результатами.Например, приложения, интенсивно использующие процессор, могут или не могут быть затронуты больше, чем те, которые связаны с IO.

Так что более правильный ответ от меня (а не просто "пойти на это") будет понять, какое влияние это окажетдля вашего приложения в вашей среде путем измерения.Запустите репрезентативные тесты в среде, аналогичной производственной, с подключенным и отключенным jconsole, и убедитесь сами.

См. Также этот вопрос stackoverflow .

...