1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  bpftrace - dynamiczne śledzenie z eBPF

# bpftrace - dynamiczne śledzenie systemu Linux z eBPF

Opublikowano: 10 kwietnia 2026 · Kategoria: VPS

⚡ W skrócie · 7 min czytania

-   Instalacja bpftrace, składnia programów (probes/predicates/actions), tracepoints vs kprobes vs uprobes, gotowe skrypty (execsnoop, opensnoop, biolatency). Porównanie z SystemTap.
-   Instalacja bpftrace i BCC.
-   Składnia bpftrace - probes, predicates, actions.
-   Typy probe - tracepoints, kprobes, uprobes.
-   Gotowe narzędzia - BCC tools.

eBPF (extended Berkeley Packet Filter) to rewolucja w obserwabilności systemu Linux. Pozwala uruchamiać własny kod w przestrzeni jądra - bezpiecznie, weryfikowalnie i z minimalnym narzutem wydajnościowym. `bpftrace` to wysokopoziomowy język zbudowany na eBPF, który pozwala pisać zaawansowane skrypty śledzenia w jednej linii lub krótkich programach - bez znajomości C czy API jądra. Używany przez inżynierów Netflix, Meta i Cloudflare do diagnozowania problemów produkcyjnych w czasie rzeczywistym.

## Instalacja bpftrace i BCC

```
# Ubuntu 22.04+ / Debian 12+
sudo apt install bpftrace bpfcc-tools linux-headers-$(uname -r) -y

# Sprawdź wersję i obsługiwane probes
bpftrace --version
bpftrace -l  # lista wszystkich dostępnych probe types

# Wymagania kernela:
# - Kernel 5.8+ dla pełnych możliwości (CO-RE, BTF)
# - Kernel 4.9+ dla podstawowych funkcji
# - Sprawdź BTF support:
ls /sys/kernel/btf/vmlinux && echo "BTF OK" || echo "Brak BTF - ograniczone mozliwosci"

# Upewnij się że masz uprawnienia
# bpftrace wymaga root lub CAP_BPF + CAP_SYS_ADMIN (kernel 5.8+)
```

## Składnia bpftrace - probes, predicates, actions

Programy bpftrace składają się z reguł w formacie: `probe /predicate/ { action }`. Probe definiuje kiedy uruchomić akcję, predicate filtruje zdarzenia, action to kod wykonywany przy dopasowaniu.

```
# Hello World - jednolinijkowy program
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("PID %d otwieral: %s\n", pid, str(args->filename)); }'

# Z filtrem na PID (predicate)
bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s\n", str(args->filename)); }'

# Śledź wywołania write() i ich rozmiar (histogram)
bpftrace -e 'tracepoint:syscalls:sys_enter_write { @bytes = hist(args->count); }'

# Latencja syscall (czas między enter a exit)
bpftrace -e '
tracepoint:syscalls:sys_enter_read { @start[tid] = nsecs; }
tracepoint:syscalls:sys_exit_read  /{@start[tid]}/ {
  @latency_us = hist((nsecs - @start[tid]) / 1000);
  delete(@start[tid]);
}
'

# Zmienne wbudowane dostępne w probe:
# pid   - PID procesu
# tid   - thread ID
# uid   - user ID
# comm  - nazwa procesu (comm string)
# nsecs - czas w nanosekndach
# cpu   - numer CPU
# curtask - wskaźnik na task_struct
```

## Typy probe - tracepoints, kprobes, uprobes

Typ probe

Przykład

Stabilność API

Zastosowanie

tracepoint

tracepoint:syscalls:sys\_enter\_read

Wysoka (stabilne API)

Syscalls, scheduler, network, block I/O

kprobe

kprobe:tcp\_connect

Średnia (zmienne między wersjami)

Dowolna funkcja jądra, wewnętrzne zdarzenia

kretprobe

kretprobe:tcp\_connect

Średnia

Wartość zwracana funkcji jądra

uprobe

uprobe:/usr/bin/php:zend\_execute

Niska (symbol dependent)

Funkcje aplikacji user-space, biblioteki

uretprobe

uretprobe:/usr/bin/node:uv\_\_run

Niska

Wartość zwracana funkcji user-space

profile

profile:hz:99

Wysoka

CPU sampling (jak perf), flame graphs

software

software:page-faults:1000

Wysoka

Software events (page faults, context-switch)

hardware

hardware:cache-misses:1000000

Sprzętowa

PMU counters (cache misses, CPU cycles)

## Gotowe narzędzia - BCC tools

```
# execsnoop - śledź wszystkie nowe procesy (bardzo przydatne!)
sudo execsnoop-bpfcc
# PCOMM            PID    PPID   RET ARGS
# bash             12345  1234     0 bash -c ls /etc
# ls               12346  12345    0 /usr/bin/ls /etc

# opensnoop - otwierane pliki z latencją
sudo opensnoop-bpfcc -p $(pgrep nginx | head -1)
# PID    COMM               FD ERR PATH
# 1234   nginx              22   0 /etc/nginx/nginx.conf

# biolatency - histogram latencji dysku (blkio)
sudo biolatency-bpfcc
# Tracing block device I/O... Hit Ctrl-C to end.
#      usecs              : count     distribution
#      0 -> 1            :   234     |****                    |
#      2 -> 3            :  1289     |************************|
#      4 -> 7            :   890     |****************        |

# tcpconnect - nowe wychodzące połączenia TCP
sudo tcpconnect-bpfcc
# PID    COMM         IP SADDR            DADDR            DPORT

# tcpretrans - retransmisje TCP (problemy sieciowe)
sudo tcpretrans-bpfcc

# funclatency - latencja konkretnej funkcji
sudo funclatency-bpfcc 'do_sys_open'

# offcputime - gdzie procesy spędzają czas poza CPU (blokady, I/O)
sudo offcputime-bpfcc -p $(pgrep php-fpm | head -1) 10
```

## Własne skrypty bpftrace - przykłady produkcyjne

```
# Plik: slow-writes.bt - znajdź wolne write() > 1ms
# Uruchom: sudo bpftrace slow-writes.bt

tracepoint:syscalls:sys_enter_write
{
  @start[tid] = nsecs;
}

tracepoint:syscalls:sys_exit_write
/@start[tid]/
{
  $latency_us = (nsecs - @start[tid]) / 1000;
  if ($latency_us > 1000) {
    printf("SLOW WRITE: comm=%s pid=%d fd=%d latency=%dms\n",
      comm, pid, args->fd, $latency_us / 1000);
  }
  delete(@start[tid]);
}

# Uruchom skrypt z pliku
sudo bpftrace slow-writes.bt

# -------

# Jednolinijkowiec - top 10 procesów po liczbie syscall read
sudo bpftrace -e '
tracepoint:syscalls:sys_enter_read { @reads[comm, pid] = count(); }
END { print(@reads, 10); }
' -- sleep 30

# -------

# Śledź połączenia MySQL z PHP (uprobe na libmysql)
sudo bpftrace -e '
uprobe:/usr/lib/x86_64-linux-gnu/libmysqlclient.so:mysql_real_connect
{
  printf("MySQL connect: pid=%d comm=%s\n", pid, comm);
}
'
```

## Najczęstsze pytania

Czym jest bpftrace i jakie ma zalety nad strace? +

bpftrace to wysokopoziomowy język do pisania eBPF programów do dynamicznego śledzenia systemu Linux. W przeciwieństwie do strace (narzut 5-100x przez ptrace), bpftrace używa eBPF - programy kompilowane do bytecode i uruchamiane w JIT w przestrzeni jądra z minimalnym narzutem (poniżej 1%). Pozwala śledzić syscalls, funkcje jądra (kprobes), funkcje aplikacji (uprobes), tracepoints, hardware events - wszystko w czasie rzeczywistym na produkcji bez zatrzymywania procesów.

Jaka jest różnica między kprobes, uprobes i tracepoints? +

Tracepoints to statyczne punkty pomiarowe wbudowane w kod jądra - stabilne API, idealne do monitorowania (net:net\_dev\_xmit, sched:sched\_switch). Kprobes to dynamiczne hooki na dowolne funkcje jądra - elastyczne ale mogą się zmieniać między wersjami kernela. Uprobes działają analogicznie ale w przestrzeni użytkownika - pozwalają hookować dowolne funkcje w programach i bibliotekach bez ich modyfikacji. Kolejność preferencji dla stabilności: tracepoints > kprobes > uprobes.

Jakie są gotowe skrypty bpftrace do natychmiastowego użycia? +

Brendan Gregg udostępnia dziesiątki gotowych narzędzi w projekcie BCC (BPF Compiler Collection): execsnoop (śledź nowe procesy), opensnoop (otwierane pliki), biolatency (latencja dysku w histogramie), tcpconnect (nowe połączenia TCP), tcpretrans (retransmisje), funclatency (latencja funkcji), offcputime (czas procesów poza CPU), hardirqs/softirqs (latencja przerwań). Dostępne w pakiecie bpfcc-tools lub bpftrace na Ubuntu/Debian.

Czym bpftrace różni się od SystemTap? +

SystemTap jest starszym narzędziem wymagającym jądra z debuginfo, kompiluje skrypty do modułów kernel (wymaga DKMS/gcc, długi czas kompilacji). bpftrace używa eBPF - skrypty kompiluje LLVM do bytecode weryfikowanego przez kernel, bez potrzeby debug symbols i z natychmiastowym startem. bpftrace jest nowocześniejszy, bezpieczniejszy (eBPF verifier), lżejszy i ma prostszą składnię. SystemTap jest bardziej dojrzały i ma więcej wbudowanych tapsetów (gotowych bibliotek tapsetów dla POSIX, Java, Python).

## Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.

Contabo

VPS z kernel 5.8+ wymaganym do pełnych możliwości eBPF/bpftrace

Kernel 5.8+

[Aktywuj rabat →](/out/contabo/#reklama "Contabo")

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo/)

ProSerwer.pl

Polski VPS z root access do instalacji narzędzi eBPF

Root VPS

[Aktywuj rabat →](/out/proserwer-pl/#reklama "ProSerwer.pl")

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/proserwer/)

Mikr.us

Budżetowy VPS do nauki eBPF i dynamicznego śledzenia systemu

Dev/Learn

[Aktywuj rabat →](/out/mikrus/#reklama "Mikr.us")

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus/)

## Powiązane strony

-   [perf - profilowanie CPU i analiza wydajności](/baza-wiedzy/perf-profiling-cpu/)
-   [strace i ltrace - diagnostyka procesów](/baza-wiedzy/strace-debugging-linux/)
-   [Linux kernel - tuning wydajności dla serwerów](/baza-wiedzy/linux-performance-tuning-kernel/)
-   [Wszystkie artykuły](/baza-wiedzy/)
-   [Hosting Minecraft - ile kosztuje? Darmowy, Realms czy VPS
    
    Darmowy hosting Minecraft, Realms czy VPS? Ile RAM potrzebuje serwer i ile zapłacisz przez 24 miesiące. Tabela TCO,…
    
    ](/baza-wiedzy/hosting-minecraft-ile-kosztuje/)
-   [OVH VPS - cennik, opinie i polskie alternatywy
    
    OVH VPS to francuski VPS rozliczany w EUR. Poznaj polskie alternatywy - Contabo, Mikrus, home.pl, CyberFolks, LH.pl - z…
    
    ](/baza-wiedzy/ovh-vps-alternatywy/)
-   [Serwery dedykowane - ranking cenowy i specyfikacja
    
    Ile kosztuje serwer dedykowany w Polsce? Ranking cenowy trzech dostawców z realną ofertą Bare Metal - Contabo,…
    
    ](/baza-wiedzy/serwery-dedykowane-ranking/)
-   [Jaki VPS wybrać?](/jaki-vps-wybrac/)

Autor: [Redakcja HostGrade.pl](/autorzy/) Zespół redakcyjny · Aktualizacja: 10 kwietnia 2026

Artykuły HostGrade.pl przygotowuje i aktualizuje redakcja serwisu. Ceny startowe, ceny odnowienia i warunki planów sprawdzamy w cennikach i regulaminach dostawców, a potem liczymy całkowity koszt za 2 lata (cena startowa plus odnowienia). Zasady zbierania danych i liczenia kosztów opisujemy na stronie Metodologia. Linki partnerskie oznaczamy jako #reklama.

[O redakcji i metodologii →](/autorzy/)