- Home »

Повышайте уровень с bpftrace: удобная трассировка eBPF в 2025
О чём эта статья и зачем она нужна
Всё чаще на форумах мелькают вопросы: как понять, что жрёт 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 делает её доступной каждому, кто не боится открыть терминал. Прокачайте свой уровень — и пусть баги боятся вас!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.