Коли потрібен 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.