Команда Linux perf
perf — это набор инструментов для анализа производительности системы Linux, полное название которого — Performance Event Counters. Он основан на подсистеме perf_events ядра Linux и может предоставлять возможности анализа производительности как на аппаратном, так и на программном уровне.
Основные функции perf включают:
- Анализ производительности CPU
- Трассировка вызовов функций
- Статистика аппаратных событий
- Мониторинг программных событий
- Трассировка системных вызовов
Базовый синтаксис perf
Базовый формат синтаксиса команды perf:
perf [--version] [--help] COMMAND [ARGS]
Обычные подкоманды включают:
stat: Статистика счётчиков производительностиrecord: Запись данных о производительностиreport: Анализ записанных данныхtop: Мониторинг производительности в реальном времениlist: Вывести список доступных событийannotate: Анализ на уровне исходного кода
Подробное объяснение распространённых подкоманд perf
perf stat
Подсчитывать различные аппаратные и программные события во время выполнения команды.
perf stat [options] command [command-options]
Общие параметры:
-e: Указать событие для мониторинга-p: Мониторить указанный идентификатор процесса-a: Мониторить все процессоры-r: Повторять запуск и отображать среднее значение-d: Отображать более подробные события
Пример:
Пример
perf stat ls
# Мониторинг указанного процесса
perf stat -p 1234
# Мониторинг определённых событий
perf stat -e cycles,instructions,cache-misses ls
perf record
Запись данных производительности в файл (по умолчанию: perf.data).
perf record [options] command [command-options]
Общие параметры:
-g: Записывать граф вызовов-F: Частота сэмплирования (Hz)-p: Запись для указанного процесса-o: Указать выходной файл-e: Указать события для записи
Пример:
Пример
perf record ls
# Запись процесса 1234 с частотой 99Hz
perf record -F 99 -p 1234 -g
perf report
Проанализировать данные, записанные perf record.
perf report [options]
Общие параметры:
-i: Указать входной файл-n: Показать количество выборок--stdio: Вывод в текстовом режиме-g: Показать граф вызовов-s: Сортировать по указанному полю
Пример:
Пример
perf report
# Проанализировать указанный файл и вывести в текстовом режиме
perf report -i perf.data.old --stdio
perf top
Отображать наиболее ресурсоёмкие функции в системе в реальном времени.
perf top [options]
Общие параметры:
-e: Указать событие мониторинга-p: Отслеживать указанный процесс-K: Скрыть символы ядра-U: Скрыть символы пользовательского пространства-g: Показать граф вызовов
Пример:
Пример
perf top
# Отслеживать определённое событие
perf top -e cache-misses
perf list
Вывести список всех отслеживаемых событий.
perf list [hw|sw|cache|tracepoint|pmu|event_glob]
Пример:
Пример
perf list
# Вывести список аппаратных событий кэша
perf list cache
Типы событий perf
perf может отслеживать несколько типов событий:
| Тип события | Описание | Пример |
|---|---|---|
| Аппаратные | Аппаратные события CPU | cycles, instructions |
| Программные | Программные события ядра | context-switches, page-faults |
| Кэширование | События, связанные с кэшем | cache-references, cache-misses |
| Точки трассировки | Статические точки трассировки ядра | syscalls, block, sched |
| PMU | События, специфичные для процессора | (зависит от производителя) |
| Точки останова | События точек останова | mem:[:access] |
Практические примеры применения perf
1. Анализ узких мест производительности программы
Пример
perf record -g ./my_program
# Анализ результатов
perf report -g
2. Поиск функций с горячими точками ЦП
perf top -p $(pidof my_program)
3. Сравнение различий производительности между двумя запусками
Пример
perf record -o perf.data.1 ./my_program input1
# Второй запуск
perf record -o perf.data.2 ./my_program input2
# Сравнение различий
perf diff perf.data.1 perf.data.2
4. Анализ системных вызовов
Пример
perf list 'syscalls:*'
# Трассировка системного вызова open
perf stat -e 'syscalls:sys_enter_open' -a sleep 10
Советы по использованию perf
-
Снижение накладных расходов: Для длительного анализа производительности соответствующим образом уменьшите частоту сэмплирования (например, -F 99)
-
Разрешение символов: Убедитесь, что отладочные символы доступны; можно установить пакеты отладки или скомпилировать программу с -g
-
Генерация пламенных графов: Используйте вместе с инструментом FlameGraph для создания наглядных графиков анализа производительности
-
Многоядерный анализ: Используйте опцию -a для мониторинга всех CPU или -C для указания конкретных CPU
-
Разделение пространства пользователя и ядра: Используйте опции -k и -u для анализа пространства ядра и пользователя соответственно
Устранение неполадок
-
Проблемы с правами доступа:
echo -1 > /proc/sys/kernel/perf_event_paranoid
или запустите perf с sudo
-
Отсутствие информации о символах:
- Убедитесь, что программа скомпилирована с опцией -g
- Установите пакеты с отладочными символами
-
Слишком большой объём данных сэмплирования:
- Уменьшите частоту сэмплирования
- Сократите время сэмплирования
- Используйте --no-call-graph, чтобы уменьшить объём информации о графе вызовов
-
Не удаётся разобрать высокоуровневые языки, такие как Java/Python:
- Требуется поддержка perf для конкретного языка
- Попробуйте использовать инструменты анализа для конкретного языка
Дополнительные учебные ресурсы
-
Официальная документация: каталог tools/perf/Documentation в исходном коде ядра Linux
-
Рекомендации по книгам:
- 《Systems Performance: Enterprise and the Cloud》
- "Производительность систем: предприятие и облако"
-
Онлайн-ресурсы:
- Блог и набор инструментов Брендана Грегга
- Набор инструментов perf-tools
-
Связанные инструменты:
- FlameGraph: визуализация данных о производительности
- bpftrace: более гибкая динамическая трассировка
Освоив команду perf, вы сможете глубоко анализировать характеристики производительности систем Linux, быстро находить узкие места производительности и оптимизировать приложения и конфигурации системы.
Другие расширения
Справочник команд Linux