2011-01-14 4 views
6

У меня есть веб-приложение java, работающее на сервере Tomcat (Linux). В производственной среде я столкнулся с проблемой производительности. В произвольные интервалы процесс jsvc, на котором работает tomcat, начинает работать на 90-100% CPU. Я не могу найти триггер для этого события. Сервер представляет собой четырехъядерную систему. Потребление памяти не указывает на какие-либо отклонения.Инструменты для контроля выполнения java-потока

Как я могу контролировать, какой поток (трассировка стека приложений) в приложении вызывает проблему?

Я проверяю jconsole и PSI Probe, но обе не дают подробной информации о том, какая нить внутри приложения вызывает аномалию использования ЦП.

+0

Что с '[Javascript производительности]' тег? – skaffman

+0

@skaffman, Извините java-performance, я исправил его. –

+0

У нас были проблемы с производительностью на наших производственных серверах, а также с момента установки профайлера на производственный сервер. Мы дали NewRelic попробовать. Это отличный инструмент для ваших исследований эффективности. – eSniff

ответ

5

Один относительно простой способ сделать это (который может или не может работать для вашего случая - зависит от того, как долго происходит поведение):

Когда ваше приложение демонстрирует поведение, которое вы хотите отлаживать (в данном случае , 90-100% использование ЦП) использовать jstack на идентификатор процесса:

http://download.oracle.com/javase/6/docs/technotes/tools/share/jstack.html

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

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

+3

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

+0

Vista спасибо за ответ. Я собираюсь попробовать jstack. –

2

Вы можете получить дамп stacktrace для всех потоков в любом приложении Java, отправив ему сигнал QUIT.

kill -QUIT [processId] 

Это будет отображаться в процессе 'stdout.

1

Только мои 2 цента, но мне интересно, если вы не экспериментируете с проблемой памяти, пики CPU могут быть активностью GC. Поэтому, пока вы контролируете свой tomcat с помощью jconsole, посмотрите на вкладку памяти и проверьте, не будет ли использование кучи высоким.

4

VisualVM - это то, что вы ищете. Он поставляется с новыми JDK и позволяет отслеживать thread usage.

2

Еще один инструмент для демонстрации лучших CPU-потребляя темы является jvmtop

Смежные вопросы