Это скрипт Python для преобразования выходных данных многих профилировщиков в точечный график.
Он может:
Если вам нужен интерактивный просмотрщик графиков, созданных gprof2dot , проверьте xdot.py.
gprof2dot в настоящее время удовлетворяет мои потребности, и у меня мало или совсем нет времени на его обслуживание. Поэтому я боюсь, что какие-либо запрошенные функции вряд ли будут реализованы, и я могу медленно обрабатывать отчеты о проблемах или запросы на включение.
Это результат примера данных в статье Linux Gazette с настройками по умолчанию:
В Debian/Ubuntu запустите:
apt-get install python3 graphviz
При запуске RedHat/Fedora
yum install python3 graphviz
ПиПИ
pip install gprof2dot
Автономный скрипт
Git-репозиторий
Usage:
gprof2dot.py [options] [file] ...
Options:
-h, --help show this help message and exit
-o FILE, --output=FILE
output filename [stdout]
-n PERCENTAGE, --node-thres=PERCENTAGE
eliminate nodes below this threshold [default: 0.5]
-e PERCENTAGE, --edge-thres=PERCENTAGE
eliminate edges below this threshold [default: 0.1]
-f FORMAT, --format=FORMAT
profile format: axe, callgrind, collapse, dtrace,
hprof, json, oprofile, perf, prof, pstats, sleepy,
sysprof or xperf [default: prof]
--total=TOTALMETHOD preferred method of calculating total time: callratios
or callstacks (currently affects only perf format)
[default: callratios]
-c THEME, --colormap=THEME
color map: bw, color, gray, pink or print [default:
color]
-s, --strip strip function parameters, template parameters, and
const modifiers from demangled C++ function names
--color-nodes-by-selftime
color nodes by self time, rather than by total time
(sum of self and descendants)
-w, --wrap wrap function names
--show-samples show function samples
--node-label=MEASURE measurements to on show the node (can be specified
multiple times): self-time, self-time-percentage,
total-time or total-time-percentage [default: total-
time-percentage, self-time-percentage]
--list-functions=LIST_FUNCTIONS
list functions available for selection in -z or -l,
requires selector argument ( use '+' to select all).
Recall that the selector argument is used with
Unix/Bash globbing/pattern matching, and that entries
are formatted '::'. When
argument starts with '%', a dump of all available
information is performed for selected entries, after
removal of leading '%'.
-z ROOT, --root=ROOT prune call graph to show only descendants of specified
root function
-l LEAF, --leaf=LEAF prune call graph to show only ancestors of specified
leaf function
--depth=DEPTH prune call graph to show only descendants or ancestors
until specified depth
--skew=THEME_SKEW skew the colorization curve. Values < 1.0 give more
variety to lower percentages. Values > 1.0 give less
variety to lower percentages
-p FILTER_PATHS, --path=FILTER_PATHS
Filter all modules not in a specified path
--compare Compare two graphs with almost identical structure. With this
option two files should be provided.gprof2dot.py
[options] --compare [file1] [file2] ...
--compare-tolerance=TOLERANCE
Tolerance threshold for node difference
(default=0.001%).If the difference is below this value
the nodes are considered identical.
--compare-only-slower
Display comparison only for function which are slower
in second graph.
--compare-only-faster
Display comparison only for function which are faster
in second graph.
--compare-color-by-difference
Color nodes based on the value of the difference.
Nodes with the largest differences represent the hot
spots.
perf record -g -- /path/to/your/executable
perf script | c++filt | gprof2dot.py -f perf | dot -Tpng -o output.png
opcontrol --callgraph=16
opcontrol --start
/path/to/your/executable arg1 arg2
opcontrol --stop
opcontrol --dump
opreport -cgf | gprof2dot.py -f oprofile | dot -Tpng -o output.png
Если вы не знакомы с xperf, сначала прочитайте эту замечательную статью. Затем выполните:
Запустите xperf как
xperf -on Latency -stackwalk profile
Запустите ваше приложение.
Сохраните данные. ` xperf -d вывод.etl
Запустите визуализатор:
xperf output.etl
В меню «Трассировка» выберите «Загрузить символы» . При необходимости настройте пути к символам .
Выберите интересующую область на графике выборки ЦП , щелкните правой кнопкой мыши и выберите «Сводная таблица» .
В меню «Столбцы» убедитесь, что столбец «Стек» включен и виден.
Щелкните правой кнопкой мыши строку, выберите «Экспортировать полную таблицу» и сохраните ее в файл output.csv .
Затем вызовите gprof2dot как
gprof2dot.py -f xperf output.csv | dot -Tpng -o output.png
Собирайте данные профиля следующим образом (также можно сделать из графического интерфейса):
amplxe-cl -collect hotspots -result-dir output -- your-app
Визуализируйте данные профиля как:
amplxe-cl -report gprof-cc -result-dir output -format text -report-output output.txt
gprof2dot.py -f axe output.txt | dot -Tpng -o output.png
См. также запись в блоге Кирилла Рогожина.
/path/to/your/executable arg1 arg2
gprof path/to/your/executable | gprof2dot.py | dot -Tpng -o output.png
python -m profile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
python -m cProfile -o output.pstats path/to/your/script arg1 arg2
gprof2dot.py -f pstats output.pstats | dot -Tpng -o output.png
java -agentlib:hprof=cpu=samples ...
gprof2dot.py -f hprof java.hprof.txt | dot -Tpng -o output.png
Подробности смотрите в блоге Рассела Пауэра.
dtrace -x ustackframes=100 -n 'profile-97 /pid == 12345/ { @[ustack()] = count(); } tick-60s { exit(0); }' -o out.user_stacks
gprof2dot.py -f dtrace out.user_stacks | dot -Tpng -o output.png
# Notice: sometimes, the dtrace outputs format may be latin-1, and gprof2dot will fail to parse it.
# To solve this problem, you should use iconv to convert to UTF-8 explicitly.
# TODO: add an encoding flag to tell gprof2dot how to decode the profile file.
iconv -f ISO-8859-1 -t UTF-8 out.user_stacks | gprof2dot.py -f dtrace
Инструмент FlameGraph Брендана Грегга принимает на вход текстовый файл, содержащий одну строку на образец. Этот формат можно сгенерировать из различных других входных данных с помощью сценариев stackcollapse
в репозитории FlameGraph. Его также можно создать с помощью таких инструментов, как py-spy.
Пример использования:
Перф
perf record -g -- /path/to/your/executable
perf script | FlameGraph/stackcollapse-perf.pl > out.collapse
gprof2dot.py -f collapse out.collapse | dot -Tpng -o output.png
Пи-шпион
py-spy record -p -f raw -o out.collapse
gprof2dot.py -f collapse out.collapse | dot -Tpng -o output.png
На этом изображении показан пример использования параметров --compare
и --compare-color-by-difference
.
Стрелка, указывающая вправо, указывает узел, где функция выполнялась быстрее в профиле, представленном как второй (второй профиль), а стрелка, указывающая влево, указывает узел, где функция выполнялась быстрее в профиле, предоставленном как первый (первый профиль). .
+-----------------------------+
| function name
| total time % -/+ total_diff
| ( self time % ) -/+ self_diff /
| total calls1 / total calls2 /
+-----------------------------+
Где
total time %
и self time %
взяты из первого профиля.diff
рассчитывается как абсолютное значение time in the first profile - time in the second profile
.Примечание. Опция сравнения была протестирована для профилей pstats, axe и callgrind.
Узел выходного графика представляет функцию и имеет следующую структуру:
+------------------------------+
| function name |
| total time % ( self time % ) |
| total calls |
+------------------------------+
где:
Ребро представляет собой вызовы между двумя функциями и имеет следующую структуру:
total time %
calls
parent --------------------> children
Где:
Обратите внимание, что в рекурсивных циклах общее время % в узле одинаково для всех функций в цикле, и в ребрах внутри цикла нет показателя общего времени % в рёбрах, поскольку такое число не имело бы смысла.
Цвет узлов и ребер варьируется в зависимости от значения общего времени в % . На цветовой карте температуры по умолчанию функции, на которые тратится больше всего времени (горячие точки), отмечены насыщенным красным, а функции, на которые тратится мало времени, отмечены темно-синим. Обратите внимание, что функции, на выполнение которых тратится незначительное время или вообще не тратится совсем, по умолчанию не отображаются на графике.
Флаг --list-functions
позволяет вывести список записей функций, найденных во входных данных gprof
. Это предназначено как инструмент для подготовки к использованию с флагами --leaf
( -l
) или --root
( -z
).
prof2dot.py -f pstats /tmp/myLog.profile --list-functions "test_segments:*:*"
test_segments:5:,
test_segments:206:TestSegments,
test_segments:46:
Аргумент селектора используется с подстановкой/сопоставлением шаблонов Unix/Bash таким же образом, как это делается с помощью флагов -l
и -z
.
Записи имеют формат «
Когда аргумент селектора начинается с «%», для выбранных записей выполняется дамп всей доступной информации после удаления начального «%» селектора. Если селектор «+» или «*», печатается полный список функций.
По умолчанию gprof2dot.py
генерирует частичный граф вызовов, исключая узлы и ребра, практически не влияя на общее время вычислений. Если вам нужен полный граф вызовов, установите нулевой порог для узлов и ребер с помощью опций -n
/ --node-thres
и -e
/ --edge-thres
, как:
gprof2dot.py -n0 -e0
Метки узлов могут стать очень широкими при профилировании кода C++ из-за включения области видимости, аргументов функции и аргументов шаблона в имена функций C++.
Если вам не нужна информация об аргументах функции и шаблона, передайте опцию -s
/ --strip
чтобы удалить их.
Если вы хотите сохранить всю эту информацию или метки все еще слишком широки, вы можете передать -w
/ --wrap
, чтобы обернуть метки. Обратите внимание: поскольку dot
не переносит метки автоматически, поля меток не будут идеально выровнены.
Вероятно, общее время выполнения слишком мало, поэтому в профиле недостаточно точности, чтобы определить, на что тратится время.
Вы все равно можете принудительно отобразить весь граф, установив нулевой порог для узлов и ребер с помощью опций -n
/ --node-thres
и -e
/ --edge-thres
, как:
gprof2dot.py -n0 -e0
Но чтобы получить значимые результаты, вам нужно будет найти способ запускать программу в течение более длительного периода времени (агрегированные результаты нескольких запусков).
Вероятно, у вас слишком короткое время выполнения, что приводит к большим ошибкам округления.
См. вопрос выше, чтобы узнать о способах увеличения времени выполнения.
Варианты, которые необходимы для получения подходящих результатов:
-g
: создать отладочную информацию-fno-omit-frame-pointer
: использовать указатель кадра (использование указателя кадра отключено по умолчанию в некоторых архитектурах, таких как x86_64, и на некоторых уровнях оптимизации; без него невозможно пройти по стеку вызовов) Если вы используете gprof, вам также понадобится опция -pg
, но в настоящее время вы можете получить гораздо лучшие результаты с другими инструментами профилирования, большинство из которых не требуют специального инструментария кода при компиляции.
Вы хотите, чтобы код, который вы профилируете, был как можно ближе к коду, который вы будете выпускать. Поэтому вам следует включить в код выпуска все параметры, которые вы используете, обычно:
-O2
: оптимизации, не требующие компромисса с космической скоростью.-DNDEBUG
: отключить код отладки в стандартной библиотеке (например, макрос Assert)Однако многие оптимизации, выполняемые gcc, влияют на точность/детализация результатов профилирования. Вы должны передать эти параметры, чтобы отключить эти конкретные оптимизации:
-fno-inline-functions
: не встраивать функции в их родительские функции (иначе время, затраченное на эти функции, будет приписано вызывающей стороне)-fno-inline-functions-called-once
: аналогично приведенному выше-fno-optimize-sibling-calls
: не оптимизировать одноуровневые и хвостовые рекурсивные вызовы (в противном случае хвостовые вызовы могут быть отнесены к родительской функции)Если степень детализации все еще слишком низкая, вы можете указать эти параметры для достижения более высокой детализации:
-fno-default-inline
: не делайте функции-члены встроенными по умолчанию только потому, что они определены внутри области действия класса.-fno-inline
: не обращайте внимания на ключевое слово inline. Однако обратите внимание, что с этими последними опциями тайминги функций, вызываемых много раз, будут искажены из-за накладных расходов на вызов функции. Это особенно верно для типичного кода C++, который ожидает , что эти оптимизации будут выполнены для достижения достойной производительности.Для получения дополнительной информации см. полный список параметров оптимизации gcc.
См. вики для внешних ресурсов, включая дополнительные/альтернативные инструменты.