3.9.24.6 perf - анализ производительности ПО
Скачать документ Установка
Синтаксис
Опции
Команда bench
Команда stat
Команда top
Команда record
Команда report
Окружение
- Версия РЕД ОС: 8
- Конфигурация: Рабочая станция
- Версия ПО: perf 3.3.1-4
Perf - инструмент для анализа производительности программного обеспечения.
Через данную утилиту приложения могут использовать блок мониторинга производительности (PMU), точки трассировки и специальные счетчики в ядре для сбора статистики производительности.
Perf может не только анализировать проблемы производительности указанного приложения (для каждого потока), но и анализировать проблемы производительности ядра. Он также может анализировать код приложения и ядро одновременно, чтобы полностью понять узкие места производительности в приложении.
Установка
Для установки утилиты выполните команду:
sudo dnf install perf
Синтаксис
Утилита доступна для запуска через терминал при помощи команды следующего вида:
perf [--version] [--help] [<опции>] <команда> [<аргументы>]
Опции
Основные опции утилиты:
--debug — устанавливает для отладочных переменных значения от 0 до 10, позволяя устанавливать следующие переменные:
- verbose – базовые отладочные сообщения;
- ordered-events – отладочные сообщения упорядоченных событий;
- data-convert – отладочные сообщения команд преобразования данных;
- stderr – запись отладочных сообщений (опция -v) на stderr в режиме браузера.
Большее значение задает более подробный вывод.
--buildid-dir — задает каталог кэширования идентификаторов сборки (эта опция имеет более высокий приоритет по сравнению с переменной buildid.dir в файле конфигурации);
-v, --version — выводит версию программы perf;
-h, --help — выводит справку о команде perf.
Команды утилиты
Команда bench
bench — общая база для тестов производительности.
Синтаксис
perf bench [<опции_общего_назначения>] <подсистемы> <тесты> [<опции_тестов>]
Опции общего назначения
-r, --repeat=<число> - задаёт число повторения тестов (по умолчанию 10);
-f, --format=<значение> - задаёт стиль форматирования вывода:
default - принятый по умолчанию стиль, удобный для восприятия человеком;
simple - упрощённый стиль, удобный для обработки в программных сценариях.
Подсистемы
sched - механизмы планировщиков и коммуникации между процессами (IPC);
mem - производительность доступа к памяти;
numa - планирование NUMA и производительность MM;
futex -стрессовые тесты Futex;
epoll - стрессовые тесты опроса событий (epoll);
all - все подсистемы тестирования.
Тесты
Тесты для sched
messaging - набор тестов для оценки производительности механизмов планирования и IPC.
Опции messaging:
-p, --pipe - использовать
pipe()
вместоsocketpair()
.-t, --thread - использовать множество потоков (
thread
) вместо множества процессов.-g, --group=<число> - задаёт число групп.
-l, --nr_loops=<число> - задаёт число циклов.
pipe - тесты для системных вызовов pipe()
.
Опции pipe:
- -l, --loop=<число> - задаёт число циклов.
Пример работы
perf bench sched messaging # Running 'sched/messaging' benchmark: # 20 sender and receiver processes per group # 10 groups == 400 processes run Total time: 2.886 [sec] perf bench sched messaging -t -g 20 # Running 'sched/messaging' benchmark: # 20 sender and receiver threads per group # 20 groups == 800 threads run Total time: 4.028 [sec] perf bench sched pipe # Running 'sched/pipe' benchmark: # Executed 1000000 pipe operations between two processes Total time: 9.023 [sec] 9.023075 usecs/op 110826 ops/sec perf bench sched pipe -l 1000 # Running 'sched/pipe' benchmark: # Executed 1000 pipe operations between two processes Total time: 0.010 [sec] 10.278000 usecs/op 97295 ops/sec
Тесты для mem
memcpy - набор тестов для оценки скорости простых операций копирования в памяти различными способами.
Опции memcpy:
-s, --size - размер копируемого блока (по умолчанию 1 Мбайт). Задаётся числом с суффиксом B, KB, MB, GB или TB (без учёта регистра символов).
-f, --function - задаёт функцию копирования (по умолчанию default).
-l, --nr_loops - задаёт повтор вызова memcpy указанное число раз.
-c, --cycles - задаёт использование perf события
cpu-cycles
вместо системного вызоваgettimeofday
.
memset - набор тестов для оценки скорости простых операций установки памяти различными способами.
Опции для memset:
-s, --size - размер копируемого блока (по умолчанию 1 Мбайт). Задаётся числом с суффиксом B, KB, MB, GB или TB (без учёта регистра символов).
-f, --function - задаёт функцию копирования (по умолчанию default).
-l, --nr_loops - задаёт повтор вызова memset указанное число раз.
-c, --cycles - задаёт использование perf события
cpu-cycles
вместо системного вызоваgettimeofday
.
Пример работы
perf bench mem memcpy # Running 'mem/memcpy' benchmark: # function 'default' (Default memcpy() provided by glibc) # Copying 1MB bytes ... 13.020833 GB/sec # function 'x86-64-unrolled' (unrolled memcpy() in arch/x86/lib/memcpy_64.S) # Copying 1MB bytes ... 9.765625 GB/sec # function 'x86-64-movsq' (movsq-based memcpy() in arch/x86/lib/memcpy_64.S) # Copying 1MB bytes ... 9.668936 GB/sec # function 'x86-64-movsb' (movsb-based memcpy() in arch/x86/lib/memcpy_64.S) # Copying 1MB bytes ... 9.964923 GB/sec perf bench mem memcpy -s 10MB -l 3 # Running 'mem/memcpy' benchmark: # function 'default' (Default memcpy() provided by glibc) # Copying 10MB bytes ... 10.236504 GB/sec # function 'x86-64-unrolled' (unrolled memcpy() in arch/x86/lib/memcpy_64.S) # Copying 10MB bytes ... 3.372496 GB/sec # function 'x86-64-movsq' (movsq-based memcpy() in arch/x86/lib/memcpy_64.S) # Copying 10MB bytes ... 5.617809 GB/sec # function 'x86-64-movsb' (movsb-based memcpy() in arch/x86/lib/memcpy_64.S) # Copying 10MB bytes ... 5.426352 GB/sec
Тесты для numa
mem - набор тестов для оценки выполнения заданий NUMA.
Тесты для futex
hash - тесты для оценки хэш-таблиц;
wake - тесты для оценки вызовов wake;
wake-parallel - тесты для оценки параллельных вызовов wake;
requeue - тесты для оценки вызовов requeue;
lock-pi - тесты для оценки вызовов futex lock_pi.
Опции, применимые для всех тестов:
-S, --shared - использовать вызовы общих futex вместо приватных;
-s, --silent - без вывода данных и деталей;
-t, --threads <число> - задаёт число потоков (thread).
Опции для отдельных тестов:
-f, --futexes <число> - задаёт число вызовов futex на поток (только hash);
-r, --runtime <число> - задаёт время работы в секундах (hash и lock-pi);
-w, --nwakes <число> - задаёт число потоков для разового пробуждения (wake и wake-parallel);
-q, --nrequeue <число> - задаёт число потоков для разового изменения очерёдности (только requeue);
-M, --multi - использовать множество futex (только lock-pi).
Тесты для epoll
wait - тесты для оценки одновременных вызовов epoll_wait.
Опции для wait:
-B, --nonblocking - неблокируемое поведение epoll_wait;
-E, --edge - использовать интерфейс Edge-triggered (по умолчанию LT);
-m, --multiq - использовать множество экземпляров epoll (по одному на поток);
-S, --oneshot - использовать семантику EPOLLONESHOT.
ctl - тесты для оценки множества вызовов epoll_ctl.
Опции, применимые для всех тестов:
-f, --nfds <число> - задаёт число файловых дескрипторов для отслеживания каждым потоком;
-N, --nested <число> - задаёт уровень вложенности для иерархии epoll (по умолчанию без вложенности - 0);
-n, --noaffinity - отключает близость CPU (affinity);
-R, --randomize - задаёт выполнение случайных операций на случайных дескрипторах файлов;
-r, --runtime <число> - задаёт время работы в секундах;
-t, --threads <число> - задаёт число потоков (thread).;
-v, --verbose - расширенный вывод.
Команда stat
stat - выполняет указанную параметром команду, собирая статистику работы.
Синтаксис
perf stat [-e <EVENT> | --event=EVENT] [-a] <команда> perf stat [-e <EVENT> | --event=EVENT] [-a] - <команда> [<опции>] perf stat [-e <EVENT> | --event=EVENT] [-a] record [-o <файл>] - <команда> [<опции>] perf stat report [-i <файл>]
Опции команды
<command>… - любая команда, которая может быть выполнена в консоли;
-e, --event=<значение> - задаёт событие PMU;
-i, --no-inherit - дочерние задачи не наследуют счётчики;
-p, --pid=<pid> - события для процесса с заданными идентификаторами (список разделённых запятыми значений);
-t, --tid=<tid> - события для потоков (thread) с заданными идентификаторами (список разделённых запятыми значений);
-a, --all-cpus - сбор в масштабе системы от всех CPU (используется по умолчанию, если цель не задана);
--no-scale - отключает масштабирование и нормализацию значений счётчиков;
-d, --detailed - задаёт уровень детализации вывода;
-r, --repeat=<значение> - повтор команды заданное число раз (не более 100) с усреднением и указанием стандартного отклонения. 0 - означает бесконечный повтор;
-B, --big-num - задаёт вывод больших чисел с отделением тысяч в соответствии с установками locale;
-C, --cpu=<значение> - задаёт учёт лишь указанных CPU, которые можно задать номерами через запятые без пробелов (0,1) или как диапазон (0-2). В режиме учёта по потокам эта опция игнорируется. Для мониторинга в масштабе системы сохраняется актуальность опции -a. По умолчанию учитываются все процессоры;
-A, --no-aggr - отключает агрегирование счётчиков для отслеживаемых CPU;
-n, --null - пустой прогон без запуска счётчиков;
-v, --verbose - задаёт подробный вывод (показывает ошибки открытия счётчиков и т. п.);
--table - задаёт вывод времени для каждого запуска (опция -r) в форме таблицы.
Пример работы
perf stat --null -r 5 --table perf bench sched pipe # Running 'sched/pipe' benchmark: # Executed 1000000 pipe operations between two processes Total time: 8.769 [sec] 8.769539 usecs/op 114031 ops/sec # Running 'sched/pipe' benchmark: # Executed 1000000 pipe operations between two processes Total time: 8.799 [sec] 8.799256 usecs/op 113645 ops/sec # Running 'sched/pipe' benchmark: # Executed 1000000 pipe operations between two processes Total time: 8.958 [sec] 8.958335 usecs/op 111627 ops/sec # Running 'sched/pipe' benchmark: # Executed 1000000 pipe operations between two processes Total time: 9.020 [sec] 9.020829 usecs/op 110854 ops/sec # Running 'sched/pipe' benchmark: # Executed 1000000 pipe operations between two processes Total time: 9.080 [sec] 9.080392 usecs/op 110127 ops/sec Performance counter stats for 'perf bench sched pipe' (5 runs): # Table of individual measurements: 8,7822 (-0,1613) # 8,8164 (-0,1271) # 8,9726 (+0,0291) # 9,0432 (+0,0997) # 9,1030 (+0,1595) # # Final result: 8,9435 +- 0,0626 seconds time elapsed ( +- 0,70% )
stat record - запись статистики в файл (по умолчанию perf.data).
Опции:
- -i <файл> - запись в выбранный файл.
stat raport - считывает файл данных perf.data, созданный командой perf record
, и выводит профиль производительности, построенный по собранным ранее данным.
Опции:
-i <файл>, --input <файл> - имя входного файла данных;
--per-socket - объединение счётчиков по физическим процессорам для измерений в масштабе системы;
--per-core - объединение счётчиков по ядрам одного физического процессора для измерений в масштабе системы;
-A, --no-aggr - отключает объединение данных для всех отслеживаемых CPU.
Команда top
top - создание и вывод профиля производительности в реальном масштабе времени.
Синтаксис
perf top [-e <EVENT> | --event=EVENT] [<опции>]
Опции
-a, --all-cpus - сбор данных на уровне системы в целом (используется по умолчанию);
-c <число>, --count=<число> - период выборки событий;
-d <сек>, --delay=<сек> - задает интервал обновления в секундах;
-v, --verbose - задает подробный вывод (ошибки открытия счетчиков и т. п.).
Команда record
record - выполняет пользовательскую команду и записывает профиль работы в файл perf.data. Полученный файл можно затем использовать для подготовки отчёта с помощью perf report
.
Синтаксис
perf record [-e <EVENT> | --event=EVENT] [-a] <команда> perf record [-e <EVENT> | --event=EVENT] [-a] - <команда> [<опции>]
Опции
<command>… - любая команда, которую можно выполнить в командном процессоре;
-c, --count=<число> - период событий для выборки;
-o, --output=<файл> - имя выходного файла;
-v, --verbose - задаёт более подробный вывод (ошибки открытия счётчиков и т. п.);
-s, --stat - задаёт запись счётчиков событий по потокам (thread). Для просмотра значений применяется команда
perf report -T
;-d, --data - запись виртуальных адресов выборок.
Команда report
report - считывает файл данных perf.data, созданный командой perf record
, и выводит профиль производительности, построенный по собранным ранее данным.
Синтаксис
perf report [-i <файл> | --input=<файл>]
Опции
-i, --input=<файл> - имя входного файла (по умолчанию perf.data, если stdin не является fifo);
-v, --verbose - задаёт подробный вывод (адреса символов и т. п.);
-q, --quiet - отменяет вывод сообщения, отменяя опцию -v;
-s, --sort=<ключ> - задаёт сортировку гистограммы по указанным ключам.
Дата последнего изменения: 23.09.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.