asyncprofiler malloc неопределенная категория
Я настроил и использую https://github.com/jvm-profiling-tools/async-profiler , что чрезвычайно полезно, но у меня есть странная вещь, которую я не могу объяснить.
Моя настройка именно там, где несколько презентаций показали, что это может помочь:
Кластер AKS kubernetes с пулом узлов
Под, развернутый на одном узле
В контейнере я установил openjdk-11 с отладочной информацией
Настройка профилирования проста: ./profiler start -e malloc PID
Поскольку я работаю в виртуализированной среде, профилирование работает, единственное предупреждение, которое я получаю, это
[WARN] Kernel symbols are unavailable due to restrictions. Try sysctl kernel.kptr_restrict=0 sysctl kernel.perf_event_paranoid=1
Я думаю, что в отношении захвата вызовов malloc это, вероятно, не нужно.
И вопрос в том, что после некоторого времени профилирования я захватил части для распределения, где граф пламени говорит: «неизвестно» для трассировки стека (см. Прикрепленный рисунок). Может быть, у меня все еще нет полной настройки в контейнере, или мне действительно нужны эти sysctl?
Проблема в том, что с виртуализацией не так просто установить их, поскольку, как я понял, это практически влияет на базовый узел, на котором мы работаем.
Графики пламени для распределений
ОБНОВИТЬ
Теперь, когда я перезапустил профилирование после того, как все основные функции сработали хотя бы один раз для моего микросервиса, кажется, что неизвестного распределения нет. Глупый вопрос, но может ли случиться так, что я начал профилировать непосредственно перед тем, как произошла загрузка всех классов (поскольку bean-компоненты создаются лениво), и поэтому он был так классифицирован?
ОБНОВЛЕНИЕ 2
На самом деле моя гипотеза неверна, я сделал один хороший дамп
Вскоре после этого снова произошло то же явление, что, как сообщается, огромное количество захваченных событий malloc неизвестно, top не показывает резкого увеличения. Может ли это быть связано с виртуализацией, и я на самом деле перехватываю события из других контейнеров на том же узле? В моем контейнере больше нет процессов java и я также указываю напрямую PID
1 ответ
Среда контейнера здесь не при чем.
Это выглядит как
libc
(где находится реализация) в вашей системе компилируется без указателей фреймов. Таким образом, стандартный механизм обхода стека в ядре не может найти родителя фрейма.
Недавно я реализовал альтернативный алгоритм обхода стека, основанный на информации о раскручивании DWARF . Новая версия еще не выпущена, но вы можете попробовать собрать ее из исходников. Или для вашего удобства я подготовил новый билд здесь: async-profiler-2.6-dwarf-linux-x64.tar.gz
Затем добавьте
--cstack dwarf
вариант и все
malloc
трассировка стека должна быть на месте.