Введение
perf — это инструмент анализа производительности, предоставляемый в системе Linux.Он основан на подсистеме ядра, называемой «счетчики производительности», и поддерживает как аппаратный (ЦП, PMU (блок мониторинга производительности)) так и программный (программные счетчики, точки трассировки) уровни анализа производительности. .
События в перформансе
Как и другие инструменты настройки производительности, perf производит выборку отслеживаемых объектов и делает вывод о поведении всей программы на основе распределения точек выборки. С помощью команды perf list мы видим, что perf поддерживает множество событий выборки, таких как промахи ветвления, часы процессора и так далее. Предопределенные события в perf бывают разных типов, например события, генерируемые оборудованием (попадание в кэш/промах ветвления), и события, генерируемые программным обеспечением (переключение контекста/ошибка страницы) и т. д.
tracepoint
Точки трассировки – это некоторые ловушки, определенные в ядре Linux. Если они включены, они будут запускаться при выполнении определенной логики, чтобы другие инструменты могли получать информацию, например, о внутреннем рабочем состоянии системы. Perf использует точки трассировки, которые будут записывать и подсчитывать точки трассировки.Создавать аналитические отчеты для каждого события.
Как пользоваться
Конкретное использование инструмента perf выглядит следующим образом:
perf [--version] [--help] COMMAND [ARGS]
Список КОМАНД можно просмотреть, выполнив perf --help, и несколько часто используемых команд перечислены ниже.
perf stat
Роль perf stat заключается в выполнении команды и сборе различных данных во время ее работы, которые могут дать общее представление о работе программы. Например:
user@localhost:~$ perf stat hostname
localhost
Performance counter stats for 'hostname':
0.313464 task-clock (msec) # 0.481 CPUs utilized
2 context-switches # 0.006 M/sec
0 cpu-migrations # 0.000 K/sec
153 page-faults # 0.488 M/sec
896,723 cycles # 2.861 GHz
620,709 instructions # 0.69 insn per cycle
121,143 branches # 386.465 M/sec
6,247 branch-misses # 5.16% of all branches
0.000651441 seconds time elapsed
В приведенном выше примере команда hostname запускается через perf stat, и некоторые индикаторы во время ее работы суммируются и отображаются, например, ожидание Task-Clock и Context-Switches. По умолчанию perf stat выводит статистику для нескольких часто используемых событий, таких как:
- задача-часы-мсек: использование процессора
- context-switches: количество переключений процесса
- page-faults: количество произошедших ошибок страницы
- cpu-migrations: Указывает, сколько миграций ЦП произошло в процессе работы, то есть перенесено планировщиком с одного ЦП на другой для выполнения.
- циклы: такт процессора, машинная инструкция может потребовать несколько циклов
- инструкции: количество машинных инструкций
- ветки: количество встреченных инструкций ветвления
- промахи ветвления — это количество неверно предсказанных инструкций ветвления.
В дополнение к этому мы можем использовать параметр -e для указания интересующих нас событий, например:
user@localhost:~$ perf stat -e cache-misses hostname
localhost
Performance counter stats for 'hostname':
682 cache-misses
0.000646676 seconds time elapsed
perf top
Роль perf top заключается в отображении текущей статистики производительности системы в режиме реального времени. Предыдущая статистика производительности используется для анализа конкретной программы, и иногда мы можем не знать, какая программа влияет на производительность системы.В настоящее время мы можем использовать perf top для поиска подозрительных программ. Например:
Samples: 775 of event 'cpu-clock', Event count (approx.): 92931021
Overhead Shared Object Symbol
8.93% [kernel] [k] vsnprintf
7.73% perf [.] rb_next
5.92% [kernel] [k] kallsyms_expand_symbol.clone.0
5.07% [kernel] [k] format_decode
4.59% [kernel] [k] number
3.40% perf [.] symbols__insert
3.03% libslang.so.2.2.1 [.] SLtt_smart_puts
В приведенном выше примере показано, что perf подсчитывает данные о событиях тактовой частоты процессора, отсортированные по масштабу. Как и в perf stat, мы можем указать другие события для подсчета с помощью параметра -e.Например, perf top -e context-switches может просматривать первые N процессов с наибольшим переключением процессов.
perf record & perf report
Роль perf record аналогична perf stat, она может запускать команду и генерировать статистику, но perf record не отображает результаты, а выводит результаты в файл. Файлы, сгенерированные записью о производительности, можно проанализировать с помощью отчета о производительности.
Запись Perf также может передавать параметр -g для создания графа вызовов во время анализа, чтобы помочь найти логическое распределение верхнего уровня.
разное
В примере мы можем обнаружить, что столбец Symbol в результатах анализа perf показывает имя функции языка C. Для java функция, сгенерированная jit-компиляцией, будет отображаться непосредственно в символе вместо имени функции java. В настоящее время найти проблему не так просто. Нам нужно использовать дополнительные средства для объединения символа и имени. таблица символов java-программы Соответственно, подробности будут рассмотрены позже.