Профилирование производительности в Linux с perf и flamegraph

7 минут чтения
Средний рейтинг статьи — 4.9

Когда сервер начинает «тормозить», первая реакция — увеличить 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

  1. Сначала собираем данные:
perf record -F 99 -p <PID> -g -- sleep 30
  1. Преобразуем данные:
perf script > out.perf
  1. Используем 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 экономит часы дебага и тысячи долларов на лишнем железе.

И самое главное — позволяет оптимизировать именно то, что действительно тормозит систему.

7 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний