Home » Профилирование ядра с perf — от основ до экспертов
Профилирование ядра с perf — от основ до экспертов

Профилирование ядра с perf — от основ до экспертов

В этом посте разберёмся, что такое профилирование ядра с помощью perf, как оно реально может помочь в жизни любого админа, девопса или просто энтузиаста серверных технологий. Я расскажу, почему perf — это не только инструмент для гуру, но и отличная палка-выручалочка для тех, кто хочет быстро и по делу разобраться, что тормозит сервер, почему контейнеры вдруг едят больше CPU, или как найти узкое место в продакшн-сервисе. Всё будет на реальных примерах, с лайфхаками, ошибками, сравнениями и даже с парой неочевидных приёмов.

О чём этот пост и зачем он тебе?

Если ты когда-нибудь сталкивался с ситуацией, когда сервер “тормозит”, нагрузка на ядро растёт, а top или htop показывают только загадочный system или softirq — этот пост для тебя. perf — инструмент, который позволяет не просто посмотреть, кто ест CPU, а реально “просветить” ядро Linux и увидеть, где именно тратится процессорное время: в каком системном вызове, драйвере, модуле, или даже конкретной строке кода.

Всё это — must-have для тех, кто арендует VPS, держит облачные инстансы, занимается контейнерами на Docker или Kubernetes, или просто хочет оптимизировать свой выделенный сервер (кстати, если нужен сервер — VPS или dedicated).

Почему профилирование ядра важно?

  • Помогает находить узкие места, которые не видны обычными мониторингами
  • Позволяет понять, почему сервис медленно работает (а не просто “где-то тормозит”)
  • Даёт возможность оптимизировать приложение или систему без угадываний
  • Позволяет быстро реагировать на инциденты, особенно если сервер в облаке и ресурсы стоят денег

Как это работает? Алгоритмы и структура perf

perf — это инструмент из ядра Linux, который работает на уровне hardware performance counters (аппаратных счётчиков производительности) и software events. Он умеет снимать статистику не только по приложениям, но и по всему ядру, включая модули, драйверы, system calls, soft/hard IRQs и т.д.

В основе работы — механизм sampling: perf периодически делает “снимки” состояния процессора, чтобы понять, где сейчас выполняется код (в ядре, в юзерспейсе, в драйвере и т.д.). Всё это можно собрать в отчёт, который покажет, какие функции или участки кода чаще всего “забивают” CPU.

  • Sampling — снимает сэмплы по таймеру или по событиям (например, каждые N инструкций)
  • Tracing — позволяет отследить последовательность вызовов, но это тяжелее и реже нужно
  • Stack unwinding — можно получить стек вызовов, чтобы видеть не только “где”, но и “как туда попали”

Краткая архитектура perf:

  • perf_events — подсистема ядра, которая собирает события
  • perf tool — утилита командной строки для сбора и анализа профилей
  • perf.data — бинарные файлы со сэмплами, которые можно анализировать оффлайн
  • perf report — просмотр собранных данных в виде “плоского” списка или call-graph

Как быстро и просто всё настроить? Практические советы

Самое классное в perf — он уже встроен почти во все современные дистрибутивы Linux. Но есть нюансы:

  • На VPS и облаках иногда ядро собрано без поддержки perf, либо стоит ограничение на чтение hardware counters (security reason)
  • Для глубокого анализа ядра нужны отладочные символы (debuginfo пакеты)
  • Для stack traces желательно собирать perf с поддержкой libunwind

1. Установка perf


# Debian/Ubuntu:
sudo apt install linux-tools-common linux-tools-$(uname -r)

# CentOS/RHEL:
sudo yum install perf

# Альтернатива — собрать из исходников:
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux/tools/perf
make && sudo make install

2. Проверка поддержки и прав


# Проверяем, что perf работает:
perf list

# Проверяем ограничения ядра:
cat /proc/sys/kernel/perf_event_paranoid
# 0 — полный доступ, 2 — только свои процессы, 3 — почти ничего
# Для профилирования ядра лучше временно выставить 1 или 0:
sudo sysctl kernel.perf_event_paranoid=1

3. Быстрое профилирование ядра

Самая простая команда, чтобы понять, что грузит ядро:


sudo perf top

Это как top, только для ядра: в реальном времени показывает функции, которые чаще всего вызываются.

4. Сбор профиля для анализа


# Снимем 10 секунд профиля по всему ядру:
sudo perf record -a -g -- sleep 10

# Анализируем:
sudo perf report

Ключи:

  • -a — по всем CPU
  • -g — с call-graph (стек вызовов)

Для профилирования только одного процесса:


sudo perf record -p <PID> -g -- sleep 10

5. Установка отладочных символов

Чтобы видеть не только адреса, но и имена функций:


# Ubuntu/Debian:
sudo apt install linux-image-$(uname -r)-dbgsym

# CentOS/RHEL:
sudo debuginfo-install kernel

Примеры, кейсы: что может показать perf

Ситуация Что показал perf Рекомендации
Высокая нагрузка на CPU, system time > 40% Почти все сэмплы в tcp_recvmsg и skb_copy_datagram_iter Проблема в сетевом стеке, возможно, DDoS или неэффективный polling. Проверь настройки net.core, firewall, лимиты.
Медленные дисковые операции Много времени в ext4_find_entry и do_get_write_access Возможно, фрагментация, плохой SSD/HDD, устаревший драйвер. Проверь iotop, smartctl.
Просадки в контейнере Docker Основная нагрузка в cgroup_rstat_updated Баги/особенности cgroups v2, попробуй обновить ядро или оптимизировать лимиты контейнеров.
Тормозит база данных Большая часть времени в mutex_spin_on_owner Внутренняя блокировка, стоит пересмотреть настройки параллелизма или обновить версию базы.

Положительные кейсы

  • Один раз perf помог найти баг в драйвере сетевой карты, который жрал 30% CPU — обновление драйвера решило проблему
  • На VPS с OpenVZ perf показал, что ядро тратит кучу времени на page faults из-за нехватки RAM — апгрейд помог

Отрицательные кейсы

  • На некоторых облаках perf не работает из-за ограничений hypervisor — приходится использовать другие методы
  • Без debuginfo отчёты perf выглядят как набор адресов — бесполезно для анализа

Ошибки новичков и мифы

  • Миф: perf нужен только для программистов ядра. Факт: для админов и девопсов это must-have, чтобы понять, где реально тормозит сервер.
  • Ошибка: Запускать perf без sudo — часть событий не будет видна.
  • Ошибка: Не ставить debuginfo — профили будут бесполезны.
  • Ошибка: Пытаться профилировать ядро на облачных VPS без поддержки perf — ничего не получится, ищи альтернативы (например, bcc или eBPF).
  • Миф: perf сильно грузит систему. Факт: В режиме sampling overhead обычно 1-5%, можно использовать даже на проде (но аккуратно).

Похожие решения и альтернативы

  • ftrace — встроенный трейсинг, мощнее, но сложнее для новичков
  • eBPF/bpftrace — новый тренд, можно писать свои скрипты для профилирования, но требует современного ядра
  • systemtap — старый, мощный, но сложный и требует модулей ядра
  • oprofile — альтернатива perf, но менее дружелюбен

Официальные ссылки:

Статистика и сравнения

Утилита Overhead Глубина анализа Поддержка ядра Простота
perf 1-5% user/kernel, callgraph 3.0+ Высокая
ftrace 2-10% Очень глубокий 2.6.27+ Средняя
systemtap 5-15% Максимальная Требует модулей Сложная
eBPF/bpftrace <1% user/kernel, динамика 4.9+ Средняя

Интересные факты и лайфхаки

  • perf можно запускать даже внутри Docker-контейнера, если выставить --privileged и пробросить /proc
  • perf умеет профилировать не только CPU, но и кеши, branch mispredicts, page faults, context switches
  • Можно визуализировать call-graph с помощью FlameGraph от Brendan Gregg (github.com/brendangregg/Flamegraph)
  • perf отлично интегрируется с CI/CD: можно автоматически собирать профили после деплоя и сравнивать их между релизами
  • perf поддерживает экспорт данных в текстовый и CSV-формат для автоматизированного анализа

Автоматизация и скрипты: новые возможности

  • Можно автоматизировать сбор профилей по расписанию (cron) и отправлять отчёты в Slack/Telegram
  • Использовать perf для автотюнинга: скрипт анализирует, где bottleneck, и автоматически предлагает оптимизации
  • Интеграция с Prometheus/Grafana через perf_exporter — мониторинг в реальном времени
  • Собирать профили на тестовом окружении и сравнивать их с продом для поиска регрессий

Выводы и рекомендации

  • Если ты занимаешься настройкой, обслуживанием или оптимизацией серверов — perf должен быть в твоём арсенале.
  • Он прост в освоении, но при этом даёт информацию, которую не покажет ни один поверхностный мониторинг.
  • Используй perf для быстрой диагностики проблем в ядре, драйверах, контейнерах, БД и сетевых сервисах.
  • Не забывай про отладочные символы — без них профили бесполезны.
  • Для облаков и VPS — заранее проверь, поддерживается ли perf, иначе ищи альтернативы (eBPF, ftrace, bcc).
  • Автоматизируй сбор и анализ профилей — это даст тебе конкурентное преимущество и спокойствие на дежурстве.

Если нужен сервер для экспериментов — VPS или dedicated — и вперёд, к новым вершинам профилирования!


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked