До основного вмісту

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.

Чи була стаття корисною?
← Назад до бази знань Поставити питання підтримці