Для анализа производительности программного обеспечения часто необходимо проверить процессорное время и понять, где находится узкое место.
график пламени(график пламени) — это инструмент для анализа производительности. В этой статье описывается его основное использование.
1. выполнить команду
Начнем с команды perf (сокращение от производительности), которая представляет собой инструмент анализа производительности, изначально предоставляемый системой Linux, который возвращает имя функции, выполняемой ЦП, и стек вызовов (стек).
Обычно частота ее выполнения составляет 99 Гц (99 раз в секунду).Если одно и то же имя функции возвращается 99 раз, это означает, что ЦП выполняет одну и ту же функцию каждую секунду, и могут быть проблемы с производительностью.
$ sudo perf record -F 99 -p 13204 -g -- sleep 30
В приведенном выше кодеperf record
означает запись,-F 99
означает 99 раз в секунду,-p 13204
Это номер процесса, то есть процесс, который нужно проанализировать,-g
Представляет стек вызовов записи,sleep 30
Он длится 30 секунд.
После запуска он создаст огромный текстовый файл. Если сервер имеет 16 ЦП, выборки 99 раз в секунду в течение 30 секунд, вы получите 47 520 стеков вызовов, сотни тысяч или даже миллионы строк.
Для удобства чтения,perf record
Команда может подсчитать процент каждого стека вызовов, а затем ранжировать их от высокого к низкому.
$ sudo perf report -n --stdio
Этот результат по-прежнему нелегко прочитать, отсюда и график пламени.
Значение графика пламени
График пламени создается на основе результатов производительностиSVG-изображения, используемый для отображения стека вызовов ЦП.
Ось Y представляет стек вызовов, где каждый уровень представляет собой функцию. Чем глубже стек вызовов, тем выше пламя с исполняющей функцией наверху и ее родительской функцией внизу.
Ось X представляет количество выборок.Если функция занимает большую ширину по оси X, это означает, что она была выбрана больше раз, то есть время выполнения велико. Обратите внимание, что ось X представляет не время, а все стеки вызовов вместе взятые в алфавитном порядке.
Фигура - это функция пламени, которая занимает верхний этаж, чтобы увидеть максимальную ширину. Пока есть «плоский топ» (плато), он указывает на то, что функция может быть проблемой производительности.
Цвет не имеет особого значения, потому что график пламени показывает загруженность процессора, поэтому обычно выбирайте теплые цвета.
3. Интерактивность
График пламениSVG-изображения, может взаимодействовать с пользователем.
(1) Наведите курсор мыши
Каждый слой пламени будет отмечен именем функции, функция будет отображать полное имя, если мышь была подвешена во время извлечения образца, процент от общего количества образцов занимает. Ниже приведен пример.
mysqld'JOIN::exec (272,959 samples, 78.34 percent)
(2) Нажмите, чтобы увеличить
Нажмите на слой, график пламени увеличится по горизонтали, слой займет всю ширину, и отобразится подробная информация.
В левом верхнем углу также отобразится «Сбросить масштаб», нажмите на ссылку, и картинка восстановится до исходного состояния.
(3) Поиск
Нажатие Ctrl + F отобразит окно поиска, в котором пользователь может ввести ключевые слова или регулярные выражения, и все имена функций, соответствующие критериям, будут выделены.
В-четвертых, пример графа пламени
Ниже приведен упрощенный пример графа пламени.
Сначала ЦП отбирает три стека вызовов.
func_c func_b func_a start_thread func_d func_a start_thread func_d func_a start_thread
В приведенном выше кодеstart_thread
Является ли начать поток, звонитеfunc_a
. Последний называетfunc_b
иfunc_d
,иfunc_b
позвонил сноваfunc_c
.
После процесса слияния получается следующий результат, то есть есть два стека вызовов, первый стек вызовов отрисовывается один раз, а второй стек вызовов отрисовывается дважды.
start_thread;func_a;func_b;func_c 1 start_thread;func_a;func_d 2
С этой статистикой стека вызововинструмент графа пламениМожно создавать изображения SVG.
На картинке выше функция верхнего уровняg()
Самое время CPU-время.d()
имеет наибольшую ширину, но напрямую потребляет очень мало ресурсов ЦП.b()
иc()
Нет прямого потребления процессора. Поэтому, если вы хотите исследовать проблемы с производительностью, вы должны сначала исследоватьg()
,С последующимi()
.
Кроме того, из рисунка видно, чтоa()
имеет две ветвиb()
иh()
, Это указываетa()
Внутри может быть условный оператор, иb()
Ветки потребляют значительно больше процессора, чемh()
.
5. Ограничения
В обоих случаях пламя не может быть нарисована, и поведение системы необходимо исправить.
(1) Стек вызовов неполный
Когда стек вызовов слишком глубокий, некоторые системы возвращают только первую часть (например, первые 10 слоев).
(2) Имя функции отсутствует
Некоторые функции не имеют имен, и компилятор использует только адреса памяти для их представления (например, анонимные функции).
6. Flame-граф Node-приложения
Пламенный график приложения Node предназначен для демонстрации производительности процесса Node, и операция такая же, как и у других приложений.
$ perf record -F 99 -p `pgrep -n node` -g -- sleep 30
Подробную операцию можно увидетьэта статья.
Семь, график пламени браузера
Браузер Chrome может генерировать пламенные графики скриптов страниц для анализа ЦП.
Откройте инструменты разработчика и переключитесь на панель «Производительность». Затем нажмите кнопку «Запись», чтобы начать запись данных. В это время вы можете выполнять различные операции на странице, а затем останавливать «запись».
На этом этапе инструменты разработчика отобразят временную шкалу. Под ним график пламени.
График пламени браузера отличается от стандартного графа пламени двумя способами: он перевернут (то есть функция в верхней части стека вызовов находится внизу); ось X - это ось времени, а не количество образцов Отказ
8. Справочная ссылка
- Вводный документ по пламенным графикам
- Официальная домашняя страница Flame Graph
- генератор графов пламени
(Заканчивать)