 Autor: [Piotr Wasilewski](/autorzy/piotr-wasilewski) Architekt rozwiązań chmurowych · Zweryfikowano Kwiecień 2026

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

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 · 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 · 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 · 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/)