К основному содержимому

eBPF и bpftrace: диагностика тормозов Linux-сервера

VDS / VPS · 09.11.2026 · 5 мин чтения

Когда нужен eBPF

eBPF позволяет запускать в ядре небольшие проверяемые программы и собирать данные о событиях: запуск процессов, открытие файлов, задержки диска, TCP-соединения. Он нужен, когда top, iostat и логи молчат, а сервер тормозит: инструмент показывает, кто и что делает прямо сейчас, без изменения кода приложений. Он видит события ядра, а не строки вашего кода.

bcc и bpftrace: два набора инструментов

bcc — набор готовых утилит: ставите пакет и запускаете, например opensnoop. bpftrace — язык короткого описания трассировки: он гибче, но запрос пишете сами. Шесть популярных инструментов есть в bcc: execsnoop, opensnoop, biolatency, tcpconnect, runqlat и profile. В bpftrace готовы пять, готового profile в каталоге tools нет.

Вопросbccbpftrace, каталог tools
Кто запускает процессыexecsnoopexecsnoop.bt
Какие файлы открываютopensnoopopensnoop.bt
Задержки блочного ввода-выводаbiolatencybiolatency.bt
Исходящие TCP-соединенияtcpconnecttcpconnect.bt
Очередь планировщика процессораrunqlatrunqlat.bt
Где тратится процессорprofileготового файла нет

Перечень сверен с README bcc и каталогом tools репозитория bpftrace.

Требования к ядру и правам

Нужны достаточно новое ядро, права root и, для части инструментов, заголовки ядра или файл BTF. Политика свежих версий bpftrace — минимальное ядро 6.1, bcc требует ядро не ниже 4.1 и заголовки ядра. Версия пакета в дистрибутиве может быть старше этой политики, поэтому сверяйте bpftrace --version.

ЧтоЗначениеИсточник
bpftrace, свежие версииядро 6.1 и новееполитика проекта bpftrace
bccядро 4.1 и новее, заголовки ядраINSTALL.md проекта bcc
Файл /sys/kernel/btf/vmlinuxдоступен с ядра 5.5README libbpf-tools в bcc
CAP_BPF и CAP_PERFMONпоявились в ядре 5.8, раньше нужен CAP_SYS_ADMINman capabilities

Для BTF надёжнее не запоминать версию, а проверить, есть ли файл: ls /sys/kernel/btf/vmlinux.

Установка на Ubuntu

Установка занимает две команды. bcc ставится пакетом bpfcc-tools вместе с заголовками ядра, bpftrace — одноимённым пакетом. На Ubuntu утилиты bcc лежат в /sbin с суффиксом -bpfcc, например opensnoop-bpfcc. Сам bcc предупреждает, что пакеты в Ubuntu устаревают: свежую версию ищите в документации проекта. В Debian имена пакетов могут совпадать, но проверьте это через apt search.

  1. Проверьте версию ядра и наличие файла BTF.
  2. Установите нужный набор из блока ниже.
  3. Запустите утилиту от root на несколько секунд и остановите её по Ctrl+C.
uname -r
ls /sys/kernel/btf/vmlinux
sudo apt install bpfcc-tools linux-headers-$(uname -r)
sudo apt install bpftrace
sudo opensnoop-bpfcc

Где это работает: VPS, контейнер, железо

В KVM-VPS у гостя своё ядро, поэтому условия те же, что на железе, но ядро образа может быть урезанным: проверьте BTF и версию. В непривилегированном контейнере (LXC, Incus, Docker) eBPF обычно не работает и отвечает «Operation not permitted». Это наблюдение, а не запрет из документации, поэтому проверьте сами.

systemd-detect-virt
systemd-detect-virt --container
sudo opensnoop-bpfcc

Команда systemd-detect-virt печатает тип виртуализации, например kvm или lxc, а с ключом --container — тип контейнера или none. Если opensnoop-bpfcc за несколько секунд вывел строки, окружение подходит; если получили «Operation not permitted», eBPF здесь закрыт.

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

Четыре готовых примера

Начинайте с коротких запусков на несколько секунд: каждый пример отвечает на свой вопрос, и все они останавливаются по Ctrl+C. Первые три примера используют готовые утилиты bcc, четвёртый — однострочник bpftrace. Команды bcc даны с суффиксом -bpfcc, как в Ubuntu; в других дистрибутивах имя может быть без суффикса.

  1. execsnoop-bpfcc — кто запускает процессы. Ловит короткоживущие программы, которые не успевают попасть в top: лишние вызовы скриптов из cron или из веб-приложения.
  2. opensnoop-bpfcc — какие файлы открываются и кем. Помогает найти попытки открыть несуществующий файл и неожиданно тяжёлый доступ к диску.
  3. biolatency-bpfcc 10 1 — гистограмма задержек блочного ввода-вывода за 10 секунд. Длинный хвост значит, что диск или его очередь тормозят.
  4. однострочник bpftrace с пробой profile:hz:99 — считает, в каких процессах чаще всего оказывается процессор, 99 раз в секунду; готового profile в bpftrace нет.
sudo execsnoop-bpfcc
sudo opensnoop-bpfcc
sudo biolatency-bpfcc 10 1
sudo bpftrace -e 'profile:hz:99 { @[comm] = count(); }'

Что делать с результатом

Результат eBPF — подсказка, а не диагноз: он называет процесс, файл или устройство, а дальше нужен обычный разбор с проверкой гипотез. Для общей картины подойдёт профилирование производительности Linux, а гистограмма задержек диска ведёт к статье про дисковую подсистему и очереди.

  • Медленные PHP-скрипты: slowlog PHP-FPM показывает строку кода, которую eBPF не видит.
  • Следы тех же событий в журнале: journalctl и rsyslog.

Частые вопросы

Безопасно ли запускать eBPF на рабочем сервере?

Короткие запуски обычно переносятся нормально, но трассировка частых событий добавляет нагрузку. Начинайте с узких инструментов вроде biolatency, запускайте на несколько секунд и не оставляйте трассировку включённой.

Почему bpftrace пишет «Operation not permitted»?

Чаще всего нет прав root либо вы внутри непривилегированного контейнера, где доступ к BPF закрыт. Проверьте systemd-detect-virt --container и запустите команду через sudo на самом сервере или в KVM-VPS.

Что делать клиентам ZevsHost?

На общем хостинге такая диагностика недоступна: ядро общее, а нагрузку и логи показывает панель. На VPS с виртуализацией KVM ядро своё, и запускать инструменты вам самому; тип виртуализации покажет systemd-detect-virt.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке