как определить поток, из-за которого загрузка ЦП JVM достигает от 90 до 100% в Java-приложении Jboss?

Наше java-приложение (ухо) было развернуто в J Boss + Linux, и мы используем кластеры модов и имеем всего 8 экземпляров JV M или j Boss.

Мы могли видеть, что один или два раза в день загрузка ЦП JV M достигает 100%, а выполнение приложений происходит очень медленно.

Я попытался получить дамп потока с помощью стека j и команд kill Linux, чтобы определить вызывающий поток. Но, к сожалению, JV M не отвечает, если загрузка ЦП для этих команд превышает 60%.

Есть ли самый простой способ определить имя потока/метода/класса, из-за которого возникают проблемы с увеличением загрузки ЦП?

Может ли кто-нибудь предоставить решение как можно скорее, пожалуйста?


person suresh    schedule 15.03.2016    source источник


Ответы (2)


Чтобы получить стек из зависшего процесса, используйте jstack -F <PID>, см. документы Oracle

Другие решения можно найти здесь

person gustf    schedule 15.03.2016
comment
jstack: целевой процесс не отвечает Тема 13700: (состояние = ЗАБЛОКИРОВАНО) - java.lang.Thread.sleep(long) @bci=0 (скомпилированный кадр; информация может быть неточной) - org.jboss.console.plugins.AOPLister$RefreshPoller .run() @bci=41, строка=898 (интерпретируемый фрейм) Thread 13699: (state = BLOCKED) - java.lang.Thread.sleep(long) @bci=0 (скомпилированный фрейм; информация может быть неточной) - org .apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run() @bci=22, строка=1590 (интерпретируемый фрейм) — java.lang.Thread.run() @bci=11, li - person suresh; 17.03.2016
comment
Привет. Я получаю дамп потока, как указано выше, если использую Jstack -F ‹PID›. Как определить, какой поток вызывает проблему? - person suresh; 17.03.2016
comment
Я мог видеть, что большинство ответов заменяют openJDK на Sun. Но мы не можем измениться в производстве. Не могли бы вы предложить лучший вариант, как получить дамп потока и определить, какой поток на самом деле вызывает проблему? - person suresh; 17.03.2016
comment
Я бы создал несколько дампов потоков и сравнил их, обычно вы можете увидеть шаблон для определения вызывающего потока. Вы увидите много потоков в ожидании, чтения сокетов и т. д., это не проблема. Поток, вызвавший это, вероятно, будет иметь более длинный стек вызовов. - person gustf; 17.03.2016
comment
Не могли бы вы посоветовать, как определить, какой поток вызывает проблему, и как искать в дампе потока? - person suresh; 18.03.2016
comment
Есть ли другой способ получить дамп потока в производственном приложении, кроме jstack, поскольку в большинстве случаев точка доступа не отвечает? - person suresh; 18.03.2016
comment
Не то, о чем я знаю. А насчет советов у меня не больше, чем я уже дал вам. Надеюсь, вы сможете их использовать, и надеюсь, что вы найдете проблему - person gustf; 18.03.2016

Как вы написали, JVM не отвечает, и поэтому нет возможности получить подробную информацию о выполняемых классах/методах. Таким образом, ответ на вопрос «есть ли самый простой способ» будет «НЕТ». ;-)

Но, может быть, это может помочь вам или кому-либо еще (вопросы были заданы 2,5 года назад), что я сделал бы в этом случае:

  1. Определите поток Linux (для этого я использую небольшой инструмент Linux «threadcpu»).
  2. Сделайте трассировку найденного PID - возможно, с более длинными строками ("-s 1024").

Это может дать вам подсказку, какой класс/метод выполняется в данный момент. Если вы видите, например. многие сотни SQL-запросов используются только в одном классе, тогда это может вам очень помочь.

"threadcpu" можно скачать отсюда: tuxad .com

person reichhart    schedule 15.10.2018