Home » Повышайте уровень с bpftrace: удобная трассировка eBPF в 2025
Повышайте уровень с bpftrace: удобная трассировка eBPF в 2025

Повышайте уровень с bpftrace: удобная трассировка eBPF в 2025

Если вы когда-нибудь ловили баги на проде, пытались понять, почему сервер тормозит, или просто хотели заглянуть под капот ядра Linux — добро пожаловать в мир eBPF и bpftrace. Эта статья — не очередная академическая лекция, а живой гайд, как быстро и удобно использовать bpftrace для реальной диагностики, мониторинга и дебага серверов в 2025 году. Разберёмся, зачем это нужно, как оно работает, как не наломать дров, и почему это must-have в арсенале современного админа или девопса.

О чём эта статья и зачем она нужна

Всё чаще на форумах мелькают вопросы: как понять, что жрёт CPU? Почему контейнеры внезапно тормозят? Чем отличается поведение на VPS и bare metal? Если вы сталкивались с этим, наверняка знаете, что стандартные средства вроде top, htop, strace, tcpdump — это только верхушка айсберга. Они не видят глубже, не показывают, что происходит внутри ядра или в системных вызовах.

Вот тут-то и появляется eBPF с его суперспособностью внедряться в ядро без пересборки и рестартов. А bpftrace — это как bash для eBPF: мощно, гибко, удобно. В 2025 году bpftrace стал ещё круче: больше готовых скриптов, поддержка новых ядер, удобные шаблоны для Docker и Kubernetes, интеграция с CI/CD. Эта статья — как раз о том, как быстро прокачать свои скиллы с bpftrace и реально использовать его на своих серверах.

Почему это важно? Проблема и значимость

  • Сервера становятся сложнее, а SLA строже — нужно быстро находить и чинить узкие места.
  • Традиционные инструменты часто не видят проблем на уровне ядра, сетевого стека или контейнеров.
  • Безопасность: хочется мониторить подозрительные процессы, не открывая дыру в системе.
  • Автоматизация: надо собирать логи и метрики для алертов и отчётов — без лишнего оверхеда.

bpftrace даёт возможность неинвазивно и гибко собирать нужную информацию: от “кто жрёт диск” до “какой контейнер лезет в сеть чаще всех”. Это не просто мониторинг — это трассировка, то есть возможность увидеть, что происходит в системе в реальном времени.

Как это работает? Архитектура, структура, магия

Сначала — немного магии, но без чересчур сложных терминов. eBPF (extended Berkeley Packet Filter) — это виртуальная машина внутри ядра Linux, куда можно загрузить свой байткод. Он выполняется быстро, безопасно (ядро проверяет код) и может “подслушивать” разные события: системные вызовы, сетевые пакеты, события файловой системы и даже кастомные коды.

bpftrace — это язык и утилита, чтобы писать скрипты для eBPF. Вы пишете что-то вроде “лови каждый вызов openat() и покажи, кто его делает”, а bpftrace компилирует это в eBPF-байткод, грузит в ядро и выводит результат в терминал.

  • Нет необходимости пересобирать ядро, ставить патчи, перезагружать машину.
  • Работает на лету, не мешает продакшену (если не злоупотреблять).
  • Можно ограничить область: один процесс, один контейнер, один сокет.

Пример архитектуры:

[Ваш скрипт на bpftrace] → [Компилятор bpftrace] → [eBPF байткод] → [Ядро Linux] → [Сбор данных и вывод]

Типовые точки входа (probes):

  • kprobe — ловит вызовы функций ядра.
  • uprobe — ловит вызовы функций в юзерспейс-программах.
  • tracepoint — ловит события, встроенные в ядро (например, sched:sched_switch).
  • usdt — ловит кастомные точки в приложениях (например, в PostgreSQL).

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

Шаг 1. Подготовка окружения

  • Нужен Linux 4.9+ (лучше 5.10+ для всех фич).
  • Права root (или CAP_SYS_ADMIN).
  • Установить bpftrace и зависимости (bcc, clang, llvm).
# Ubuntu/Debian
sudo apt update
sudo apt install bpftrace linux-headers-$(uname -r)

# CentOS/RHEL
sudo yum install bpftrace kernel-devel-$(uname -r)

# Альтернативно — собрать из исходников:
git clone https://github.com/iovisor/bpftrace.git
cd bpftrace
mkdir build && cd build
cmake ..
make
sudo make install

Для Docker:

docker run --rm -it --privileged \
  --pid=host \
  -v /usr/src:/usr/src:ro \
  -v /lib/modules:/lib/modules:ro \
  -v /etc/os-release:/etc/os-release:ro \
  quay.io/iovisor/bpftrace:latest

Шаг 2. Первый скрипт — hello world!

sudo bpftrace -e 'kprobe:vfs_read { printf("Reading from file by PID %d\n", pid); }'

Каждый раз, когда кто-то читает файл, вы увидите PID процесса. Можно усложнить:

sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s opened %s\n", comm, str(args->filename)); }'

Шаг 3. Готовые скрипты и шаблоны

Лучший способ начать — использовать готовые скрипты из репозитория bpftrace/tools. Там есть всё: от мониторинга задержек диска до анализа сетевого трафика.

sudo bpftrace /usr/share/bpftrace/tools/biolatency.bt
sudo bpftrace /usr/share/bpftrace/tools/tcpconnect.bt

Шаг 4. Запуск в проде — лайфхаки

  • Всегда ограничивайте область наблюдения: фильтруйте по PID, cgroup, контейнеру.
  • Не запускайте тяжёлые скрипты на долгий срок — bpftrace потребляет память ядра.
  • Используйте -d для дебага и -v для подробного вывода.
  • Логируйте вывод в файл для последующего анализа.

Примеры и кейсы: как это помогает в реальной жизни

Кейс Решение с bpftrace Результат Комментарий
Неожиданные тормоза на VPS sudo bpftrace -e 'tracepoint:sched:sched_switch { @[comm] = count(); }' Видно, кто чаще всего переключается — можно найти “шумные” процессы Традиционные средства не показывают такие детали
Потери пакетов в Docker sudo bpftrace -e 'kprobe:tcp_drop { @[comm] = count(); }' Показывает, какие процессы теряют пакеты tcpdump не покажет причину дропа
Долгие запросы к базе sudo bpftrace -e 'uprobe:/usr/lib/postgresql/15/bin/postgres:ExecProcNode { @[comm] = hist(nsecs); }' Видно, сколько времени тратится на обработку запроса Не надо влезать в логи или менять код
Анализ сетевых соединений sudo bpftrace -e 'tracepoint:inet_sock_set_state /args->protocol == IPPROTO_TCP/ { @[args->sport] = count(); }' Портрет активности по портам tcpdump не даст такой агрегации

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

  • Миф: bpftrace опасен, может положить сервер.
    Факт: Если не запускать тяжёлые скрипты без фильтров — всё ок. Ядро ограничивает ресурсы.
  • Ошибка: Запускать без фильтрации по PID — получите тонны данных и нагрузку.
  • Ошибка: Использовать bpftrace для долгосрочного мониторинга. Это инструмент для ad-hoc анализа, для постоянного мониторинга лучше использовать BCC или Tetragon.
  • Миф: eBPF — только для сетевых задач. На самом деле можно ловить любые события.

Похожие решения и сравнение

Инструмент Плюсы Минусы
bpftrace Просто, гибко, быстро. Не требует C. Много готовых скриптов. Не для долгосрочного мониторинга. Меньше возможностей для кастомизации, чем у BCC.
BCC Максимальная гибкость, можно писать на Python/C. Интеграция с Prometheus. Сложнее порог вхождения, нужны знания C/Python.
perf, strace Стандартные, везде есть. Простые. Не видят глубоко в ядро, нет фильтрации, нет агрегации.
SystemTap Гибко, но… Сложная настройка, часто требует модулей ядра.

Интересные факты и нестандартные применения

  • С помощью bpftrace можно ловить секретные ключи в памяти процессов (осторожно, это уже хакерство!).
  • Можно строить графики задержек прямо в терминале — используйте hist() и lhist().
  • bpftrace поддерживает интерполяцию переменных — можно писать динамические скрипты для CI/CD.
  • Работает в контейнерах, если дать доступ к /sys и /proc.
  • Можно использовать для аудита безопасности: кто запускает подозрительные команды, кто открывает сокеты.
  • В 2025 году появились облачные сервисы для централизованного сбора eBPF-метрик (например, через OpenTelemetry Collector).

Новые возможности и автоматизация

  • Скрипты bpftrace теперь можно запускать как systemd unit — удобно автоматизировать сбор метрик.
  • Можно интегрировать с Prometheus через pushgateway — собираете метрики, отправляете в мониторинг.
  • В Docker и Kubernetes — можно запускать в DaemonSet для сбора данных со всех нод.
  • Интеграция с CI/CD: ловите баги прямо на тестовых стендах, не дожидаясь продакшена.

Заключение и рекомендации

Если вы хотите реально понимать, что происходит с вашим сервером — будь то VPS, выделенный сервер или облако — bpftrace должен быть в вашем арсенале. Это не просто модная штука, а реальный инструмент для быстрой диагностики, поиска узких мест и даже аудита безопасности.

  • Используйте bpftrace для ad-hoc анализа, поиска багов, дебага сложных проблем.
  • Не бойтесь экспериментировать — большинство скриптов безопасны, если фильтровать по PID и не запускать на долгий срок.
  • Для постоянного мониторинга — смотрите в сторону BCC, Tetragon, Cilium.
  • Читайте официальный репозиторий bpftrace и коллекцию скриптов.
  • Для облачных и контейнерных сред — не забудьте про права и монтирование /proc, /sys.

В 2025 году трассировка ядра — это не роскошь, а необходимость. bpftrace делает её доступной каждому, кто не боится открыть терминал. Прокачайте свой уровень — и пусть баги боятся вас!


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

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

Leave a reply

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