Linux bpftrace-Befehl
bpftrace ist ein fortgeschrittenes Tracing-Tool, das auf eBPF (extended Berkeley Packet Filter) basiert. Es ermöglicht Entwicklern, den Laufzeitzustand von Linux-Systemen dynamisch zu beobachten und zu analysieren, ohne Kernel-Code zu ändern.
eBPF ist eine revolutionäre Technologie im Linux-Kernel. Sie bietet eine sichere virtuelle Maschinenumgebung, die benutzerdefinierten Code im Kernel ausführen kann. bpftrace baut auf eBPF auf und bietet eine einfachere, höhere Abstraktionsebene.
Kernvorteile von bpftrace
Echtzeit-Systembeobachtung
- Kein Neustart des Systems oder der Anwendungen erforderlich
- Extrem geringer Performance-Overhead
- Kann sowohl Kernel- als auch Userspace-Programme beobachten
Flexible Probing-Fähigkeiten
- Unterstützt mehrere Probe-Point-Typen: Funktionseintritt/-austritt, Timer, Hardware-Ereignisse usw.
- Kann Systemaufrufe, Netzwerkereignisse, Festplatten-I/O usw. verfolgen.
Einfache Skriptsprache
- AWK-ähnliche Syntax mit einer sanften Lernkurve
- Umfangreiche Sammlung integrierter Funktionen und Variablen
- Unterstützt bedingte Filterung und aggregierte Statistiken
bpftrace-Installation und -Konfiguration
Installationsmethoden
Beispiel
sudo apt install bpftrace
# CentOS/RHEL
sudo yum install bpftrace
# Aus dem Quellcode erstellen
git clone https://github.com/iovisor/bpftrace.git
mkdir bpftrace/build && cd bpftrace/build
cmake ..
make
sudo make install
Installation überprüfen
sudo bpftrace -e 'BEGIN { printf("Hello, bpftrace!n"); }'
bpftrace-Grundsyntax
Ein bpftrace-Programm besteht aus Probe Points und zugehörigen Aktionen. Die grundlegende Struktur ist wie folgt:
probe /filter/ {
action
}
Probe-Point-Typen
| Probe-Point-Typ | Beschreibung | Beispiel |
|---|---|---|
kprobe |
Kernel-Funktionseintritt | kprobe:vfs_read |
kretprobe |
Kernel-Funktionsrückkehr | kretprobe:vfs_read |
uprobe |
Userspace-Funktionseintritt | uprobe:/bin/bash:readline |
tracepoint |
Statischer Kernel-Tracepoint | tracepoint:syscalls:sys_enter_open |
interval |
Timer-ausgelöst | interval:s:5 |
software |
Software-Ereignisse | software:faults:major |
Gängige integrierte Variablen
pid: Aktuelle Prozess-IDtid: Aktuelle Thread-IDcomm: Aktueller Prozessnamensecs: Nanosekunden-Zeitstempelarg0-argN: Funktionsargumenteretval: Rückgabewert der Funktion
bpftrace Praktische Beispiele
1. Systemaufrufe verfolgen
Beispiel
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'
2. Analyse der Funktionsausführungszeit
Beispiel
sudo bpftrace -e '
kprobe:vfs_read { @start[tid] = nsecs; }
kretprobe:vfs_read /@start[tid]/ {
@times = hist(nsecs - @start[tid]);
delete(@start[tid]);
}'
3. Überwachung des Dateizugriffs von Prozessen
Beispiel
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s -> %sn", comm, str(args->filename)); }'
4. Zählen von TCP-Verbindungen
Beispiel
sudo bpftrace -e 'kprobe:tcp_connect { @[comm] = count(); }'
bpftrace Erweiterte Funktionen
1. Map-Funktionalität
bpftrace bietet eine Vielzahl integrierter Map-Typen für die Datenaggregation:
Beispiel
@hist = hist(nsecs);
# Durchschnitt berechnen
@avg = avg(nsecs);
# Eindeutige Werte zählen
@unique = count();
2. Bedingte Filterung
Beispiel
tracepoint:syscalls:sys_enter_read /pid == 1234/ {
printf("PID %d liest %d bytesn", pid, args->count);
}
3. Kombination mehrerer Probes
Beispiel
kprobe:sock_alloc {
@socket[tid] = 1;
}
kprobe:tcp_connect /@socket[tid]/ {
printf("socket %d verbindet mit %s:%dn", args->sock->__sk_common.skc_dport,
ntop(args->sock->__sk_common.skc_daddr),
args->sock->__sk_common.skc_dport);
delete(@socket[tid]);
}
bpftrace Bewährte Verfahren
- Trace-Umfang begrenzen: Verwenden Sie PID- oder Befehlsnamenfilterung, um System-Overhead zu reduzieren
- Übermäßige Ausgaben vermeiden: Zu viele printf-Aufrufe können die Leistung beeinträchtigen
- Aggregation verwenden: Verwenden Sie count(), sum() und andere Aggregatfunktionen, wann immer möglich
- Ressourcen aufräumen: Lang laufende Skripte sollten regelmäßig Map-Daten bereinigen
- Sicherheitsaspekte: bpftrace erfordert Root-Rechte; seien Sie vorsichtig beim Ausführen unbekannter Skripte
bpftrace-Vergleich mit anderen Werkzeugen
| Tool | Vorteile | Nachteile |
|---|---|---|
| bpftrace | Flexibel, leistungsstark, einfach zu bedienen | Erfordert Root-Rechte |
| strace | Einfach, keine Kompilierung erforderlich | Hoher Performance-Overhead |
| perf | Umfangreiche Funktionen, geringer Overhead | Steile Lernkurve |
| SystemTap | Leistungsstark | Erfordert Kompilierung, komplexe Konfiguration |
Empfohlene Lernressourcen
bpftrace ist ein leistungsstarkes Werkzeug für Systemleistungsanalyse und Fehlerbehebung. Wenn Sie diese Beispiele üben und seine Kernkonzepte beherrschen, werden Sie ein tieferes Verständnis für das Laufzeitverhalten von Linux-Systemen erlangen und es optimieren können.
Andere Erweiterungen
Linux-Befehlsreferenz