Когда нужен eBPF
eBPF позволяет запускать в ядре небольшие проверяемые программы и собирать данные о событиях: запуск процессов, открытие файлов, задержки диска, TCP-соединения. Он нужен, когда top, iostat и логи молчат, а сервер тормозит: инструмент показывает, кто и что делает прямо сейчас, без изменения кода приложений. Он видит события ядра, а не строки вашего кода.
bcc и bpftrace: два набора инструментов
bcc — набор готовых утилит: ставите пакет и запускаете, например opensnoop. bpftrace — язык короткого описания трассировки: он гибче, но запрос пишете сами. Шесть популярных инструментов есть в bcc: execsnoop, opensnoop, biolatency, tcpconnect, runqlat и profile. В bpftrace готовы пять, готового profile в каталоге tools нет.
| Вопрос | bcc | bpftrace, каталог tools |
|---|---|---|
| Кто запускает процессы | execsnoop | execsnoop.bt |
| Какие файлы открывают | opensnoop | opensnoop.bt |
| Задержки блочного ввода-вывода | biolatency | biolatency.bt |
| Исходящие TCP-соединения | tcpconnect | tcpconnect.bt |
| Очередь планировщика процессора | runqlat | runqlat.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.5 | README libbpf-tools в bcc |
| CAP_BPF и CAP_PERFMON | появились в ядре 5.8, раньше нужен CAP_SYS_ADMIN | man capabilities |
Для BTF надёжнее не запоминать версию, а проверить, есть ли файл: ls /sys/kernel/btf/vmlinux.
Установка на Ubuntu
Установка занимает две команды. bcc ставится пакетом bpfcc-tools вместе с заголовками ядра, bpftrace — одноимённым пакетом. На Ubuntu утилиты bcc лежат в /sbin с суффиксом -bpfcc, например opensnoop-bpfcc. Сам bcc предупреждает, что пакеты в Ubuntu устаревают: свежую версию ищите в документации проекта. В Debian имена пакетов могут совпадать, но проверьте это через apt search.
- Проверьте версию ядра и наличие файла BTF.
- Установите нужный набор из блока ниже.
- Запустите утилиту от 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; в других дистрибутивах имя может быть без суффикса.
execsnoop-bpfcc— кто запускает процессы. Ловит короткоживущие программы, которые не успевают попасть в top: лишние вызовы скриптов из cron или из веб-приложения.opensnoop-bpfcc— какие файлы открываются и кем. Помогает найти попытки открыть несуществующий файл и неожиданно тяжёлый доступ к диску.biolatency-bpfcc 10 1— гистограмма задержек блочного ввода-вывода за 10 секунд. Длинный хвост значит, что диск или его очередь тормозят.- однострочник 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.