Как читать флейм-графики? - Веб-журнал Руан Ифэн

Node.js задняя часть SVG регулярное выражение

Для анализа производительности программного обеспечения часто необходимо проверить процессорное время и понять, где находится узкое место.

график пламени(график пламени) — это инструмент для анализа производительности. В этой статье описывается его основное использование.

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_dfunc_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. Справочная ссылка

(Заканчивать)