Многие инструменты для визуализации производительности под Linux типа FlameGraph интенсивно используют профайлер perf из ядра Linux. В частности, такие «пламеграфы» наглядно показывают, сколько времени программа тратит на выполнение различных подпрограмм.
Для записи логов нужно или обернуть программу в вызов
Проблема только в том, что
Дело в том, что программа
Так что мейнтейнеры Debian не имеют права собирать
В результате
Тони Гарнок-Джонс — один из тех, кому нужна быстрый
Это сработало.
Было:
Стало:
Ускорение примерно в 68 раз. То есть выполнение
Скачать патч можно здесь.
Довольно иронично, что RMS задумал копилефт именно для повторного использования кода, а здесь как раз свободная лицензия этому «помешала». Но это ни в коему случае не аргумент против свободных лицензий, а скорее наоборот — позитивная демонстрация их вирусной эффективности.
Для записи логов нужно или обернуть программу в вызов
perf record
, или инструмент просто подключается к текущему процессу. В любом случае затем мы прогоняем записанные данные через perf script
, а несколько перловых скриптов генерируют «пламеграфы» из этих данных.Проблема только в том, что
perf record
очень медленно работает под Debian по юридическим причинам. Всем разработчикам Linux это известно, но они ничего не могут сделать. Поэтому независимый программист Тони Гарнок-Джонс (Tony Garnock-Jones) выпустил патч, который ускоряет perf
примерно в 60 раз.Дело в том, что программа
perf
лицензирована только под GPL v2 (не 2+, а конкретно 2), а необходимая для её работы библиотека libbfd
— инструмент GNU, выпущенный под GPL v3+.Так что мейнтейнеры Debian не имеют права собирать
perf
с библиотекой libbfd
для публичного дистрибутива. В результате
perf
запускает новый процесс для каждого поиска адреса (функция addr2line
) вместо того, чтобы вызвать библиотеку, что приводит к очень медленной работе. Баг задокументирован.Тони Гарнок-Джонс — один из тех, кому нужна быстрый
perf
под Debian. Видя бессилие мейнтейнеров, он реализовал идею Стейнара Гундерсона из списка рассылки @bugs.debian.org, который предложил написать для addr2line
долгоживущий процесс типа talk-through-a-pipe, примерно так: scnprintf(cmd, sizeof(cmd), "addr2line -e %s %016"PRIx64,
dso_name, addr);
fp = popen(cmd, "r");
Это сработало.
Было:
$ time /usr/bin/perf_5.10 script -i perf.data >/dev/null
real 12m51.499s
user 11m57.455s
sys 0m53.821s
Стало:
$ time perf script -i perf.data >/dev/null
real 0m11.335s
user 0m11.047s
sys 0m0.309s
Ускорение примерно в 68 раз. То есть выполнение
perf script
вместо нескольких минут теперь занимает несколько секунд. Скачать патч можно здесь.
Довольно иронично, что RMS задумал копилефт именно для повторного использования кода, а здесь как раз свободная лицензия этому «помешала». Но это ни в коему случае не аргумент против свободных лицензий, а скорее наоборот — позитивная демонстрация их вирусной эффективности.