Как собрать стэк-трейсы конкретных тредов с sample interval ± 100ms

96
31 марта 2022, 22:10

Есть OpenJDK8.
Есть пул потоков ExecutorService к примеру размером 40.
Принцип работы такой:
1)пришел запрос, для его обработки берется поток из пула.
2)во взятом потоке обрабатываем запрос
3)поток возвращается в пул потоков.
И так "по кругу".

Потоки на протяжении жизни JVM остаются одни и те же(имена потоков не меняется, уникальны).

Необходимо как-то понять, чем занимался каждый из этих потоков, с частотой сэмплирования к примеру 100ms. Фактически просто записать в файл все стектрейсы потоков.

Различные профайлеры измеряют cpu, allocation и т.п., агрегируют потоки, убирают простаивающие. Но как просто записать стек-трейсы я не нашел.(Смотрел в том числе async-profiler Андрея Паньгина).

За исключением SJK от Алексея Рогозина, но несмотря на то, что я указывал частоту обновления -i 100ms, снятие происходило приблизительно раз в секунду и RMI тред потреблял одно ядро CPU на 90%.

Answer 1

async-profiler в режиме wall clock делает ровно то, что нужно.

profiler.sh -e wall -i 100ms -d 60 -f out.jfr PID
  • -e wall выбирает режим wall clock (сэмплирование всех тредов)
  • -i 100ms задаёт интервал
  • -d 60 продолжительность профилирования в секундах
  • -f out.jfr записывать неагрегированные данные в JFR формате, который потом можно открыть в Java Mission Control

Недавно в ветку thread-filter закоммитил фикс, который динамически подбирает частоту сэмплирования, чтобы максимально точно выдерживать указанный интервал, независимо от количества тредов.

READ ALSO
Как вывести результат через пробел

Как вывести результат через пробел

Задача: перевернуть строку

99
try catch на каждую строчку или общий

try catch на каждую строчку или общий

Предположим у нас есть код:

63
Строка imap_body php

Строка imap_body php

Подскажите пожалуйста, есть такой код, которым вывожу письма с gmail

92