Служба Java, как быстро найти проблему CPU100%?

Java база данных

Последняя статья "Служба Java, как быстро найти проблему OOM с памятью? «После релиза некоторые друзья оставляли комментарии и спрашивали о 100% проблемах с производительностью процессора, как найти сопутствующие сервисы и как найти код проблемы, что также проверяло навыки техников. Сегодня я кратко расскажу об идее.

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

Краткие шаги заключаются в следующем:

(1) Найдите процесс, который потребляет больше всего ресурсов ЦП;

(2) Найдите поток, который потребляет больше всего ресурсов ЦП;

(3) просмотреть стек, определить, что делает поток, и найти соответствующий код;

Шаг 1. Найдите процесс, который потребляет больше всего ресурсов ЦП

инструмент:верхняя

метод:

  • Выполните top -c, чтобы отобразить список информации о запущенных процессах.

  • Тип P (p в верхнем регистре), процессы сортируются по загрузке ЦП.

Значок:

Как показано выше, PID процесса, потребляющего больше всего ЦП, равен 10765.

Шаг 2. Найдите поток, потребляющий больше всего ресурсов ЦП

инструмент:верхняя

метод:

  • top -Hp 10765 , отображает список потоков, выполняющих информацию о процессе.

  • Тип P (верхний регистр p), потоки сортируются по загрузке ЦП.

Значок:

Как показано на рисунке выше, в процессе 10765 PID потока, потребляющего больше всего ЦП, равен 10804.

**Шаг 3. Просмотрите стек, определите, что делает поток, найдите соответствующий код
**Сначала преобразуйте PID потока в шестнадцатеричный формат.

инструмент:принтф

метод: printf "%x\n" 10804

Значок:

Как показано на рисунке выше, шестнадцатеричное число, соответствующее 10804, равно 0x2a34.Конечно, вы можете использовать калькулятор для этого шага.

Причина преобразования в шестнадцатеричный формат заключается в том, что в стеке идентификатор потока представлен в шестнадцатеричном формате.

Затем посмотрите на стек, чтобы узнать, что делает поток.

инструмент:jstack

метод: jstack 10765 | grep '0x2a34' -C5 --color

  • стек процесса печати

  • Отфильтруйте по идентификатору потока, чтобы получить стек потока

Значок:

Как показано на рисунке выше, найдено имя потока «AsyncLogger-1», соответствующее потоку с высокой загрузкой ЦП, и виден стек кода, выполняемого потоком.
Наконец, по информации в стеке найдите соответствующий код, получите!

Я надеюсь, что это будет полезно для студентов, которые часто решают проблемы с процессором в Интернете.Если есть лучшая практика, пожалуйста, поделитесь.
Статьи по Теме:
"Служба Java, как быстро найти проблему памяти OOM?
Исследование: Вы когда-нибудь сталкивались со странной проблемой CPU100%?