Профилирование производительности в Linux с perf и flamegraph
Когда сервер начинает «тормозить», первая реакция — увеличить CPU или добавить RAM. Но без понимания, где именно тратится время, это просто стрельба в темноту.
В Linux для глубокого анализа производительности есть мощный инструмент — perf. А для визуализации результатов — flamegraph. Вместе они позволяют буквально увидеть, куда уходит CPU.
Разберёмся, как это работает и как применять в production.
Что такое perf
perf — это утилита из набора Linux perf_events, работающая напрямую с ядром и аппаратными счётчиками процессора.
Она умеет:
- измерять загрузку CPU;
- собирать stack traces;
- анализировать системные вызовы;
- искать cache misses;
- находить горячие функции (hot spots);
- профилировать как user-space, так и kernel-space.
В отличие от strace или top, perf показывает не симптомы, а реальное распределение времени выполнения.
Базовая модель: sampling profiling
perf по умолчанию работает методом sampling.
Идея простая:
- каждые N миллисекунд ядро делает сэмпл;
- фиксирует текущий стек вызовов;
- сохраняет данные в буфер;
- после завершения формирует отчёт.
Если функция часто появляется в сэмплах — она «горячая».
Это статистический метод, но в реальности он даёт очень точную картину.
Быстрый старт
Профилирование процесса по PID:
perf record -F 99 -p <PID> -g -- sleep 30Где:
-F 99— частота сэмплов (99 Гц);-p— процесс;-g— сбор stack trace;sleep 30— длительность профилирования.
После этого появится файл perf.data.
Просмотр отчёта:
perf reportВы увидите список функций и процент CPU.
Почему обычный perf report не всегда удобен
Текстовый отчёт полезен, но плохо показывает:
- глубину стека;
- вложенность вызовов;
- распределение времени по call chain.
Здесь появляется flamegraph.
Что такое flamegraph
Flamegraph — это способ визуализации профиля, где:
- по оси X — суммарное время выполнения;
- по оси Y — глубина стека;
- каждый прямоугольник — функция;
- ширина блока — доля CPU.
Чем шире блок — тем больше времени он занимает.
Важно: высота не означает время, только глубину вызова.
Генерация flamegraph
- Сначала собираем данные:
perf record -F 99 -p <PID> -g -- sleep 30- Преобразуем данные:
perf script > out.perf- Используем stackcollapse и flamegraph scripts:
stackcollapse-perf.pl out.perf > out.folded
flamegraph.pl out.folded > flamegraph.svgВ результате получаем SVG-файл, который можно открыть в браузере.
SVG интерактивен — можно кликать и зумить функции.
Что искать в flamegraph
1) Широкие блоки внизу
Это фундаментальные hot spots. Например:
- JSON-парсинг;
- шифрование;
- сериализация;
- регулярные выражения.
2) Частые syscalls
Если много времени уходит в:
- read
- write
- futex
- epoll_wait
Это может указывать на:
- I/O bottleneck;
- блокировки;
- contention.
3) Lock contention
Если видите стек с futex и pthread_mutex — значит есть блокировки, которые тормозят параллелизм.
Kernel vs User space
perf позволяет профилировать:
- только user space;
- только kernel;
- оба вместе.
Для highload-серверов важно понимать, где проблема:
- в приложении;
- в файловой системе;
- в сетевом стеке;
- в драйверах.
Production-советы
Не профилируйте слишком долго
Высокая частота sampling увеличивает overhead.
99–199 Гц обычно достаточно.
Включайте debug symbols
Без символов вы увидите только адреса.
Для нормального анализа нужны:
- debuginfo пакеты;
- не strip-нутые бинарники.
Профилируйте под нагрузкой
Idle-профиль ничего не покажет. Нужно воспроизводить реальную нагрузку.
Когда perf особенно полезен
- CPU 100%, но непонятно почему;
- latency растёт без явной причины;
- сервис «ест» процессор;
- нужно понять, стоит ли оптимизировать код.
perf отвечает на главный вопрос:
Где именно тратится процессорное время?
Ограничения
- Sampling — статистика, не точная трассировка;
- Нужны права root или соответствующие perf permissions;
- В контейнерах может требовать дополнительных настроек.
Итог
perf + flamegraph — это не просто инструменты, а способ мышления.
Вместо предположений — измерения.
Вместо «кажется, тут медленно» — точные цифры.
Если вы работаете с highload-сервисами, микросервисами или базами данных — умение читать flamegraph экономит часы дебага и тысячи долларов на лишнем железе.
И самое главное — позволяет оптимизировать именно то, что действительно тормозит систему.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний