Linux bpftrace-Befehl

Linux 命令大全Linux-Befehlsreferenz


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

# Ubuntu/Debian
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-ID
  • tid: Aktuelle Thread-ID
  • comm: Aktueller Prozessname
  • nsecs: Nanosekunden-Zeitstempel
  • arg0-argN: Funktionsargumente
  • retval: Rückgabewert der Funktion

bpftrace Praktische Beispiele

1. Systemaufrufe verfolgen

Beispiel

# Anzahl der open-Systemaufrufe zählen
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_open { @[comm] = count(); }'

2. Analyse der Funktionsausführungszeit

Beispiel

# Ausführungszeit von vfs_read messen
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

# Von einem bestimmten Prozess geöffnete Dateien verfolgen
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat /pid == 1234/ { printf("%s -> %sn", comm, str(args->filename)); }'

4. Zählen von TCP-Verbindungen

Beispiel

# TCP-Verbindungen nach Prozess zählen
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

# Histogramm zählen
@hist = hist(nsecs);

# Durchschnitt berechnen
@avg = avg(nsecs);

# Eindeutige Werte zählen
@unique = count();

2. Bedingte Filterung

Beispiel

# Nur read-Aufrufe eines bestimmten Prozesses verfolgen
tracepoint:syscalls:sys_enter_read /pid == 1234/ {
    printf("PID %d liest %d bytesn", pid, args->count);
}

3. Kombination mehrerer Probes

Beispiel

# Den gesamten Prozess von der Socket-Erstellung bis zur Verbindung verfolgen
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

  1. Trace-Umfang begrenzen: Verwenden Sie PID- oder Befehlsnamenfilterung, um System-Overhead zu reduzieren
  2. Übermäßige Ausgaben vermeiden: Zu viele printf-Aufrufe können die Leistung beeinträchtigen
  3. Aggregation verwenden: Verwenden Sie count(), sum() und andere Aggregatfunktionen, wann immer möglich
  4. Ressourcen aufräumen: Lang laufende Skripte sollten regelmäßig Map-Daten bereinigen
  5. 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

  1. Offizielle bpftrace-Dokumentation
  2. bpftrace One-Liner-Tutorial
  3. bpftrace-Beispielrepository

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.


Linux 命令大全Linux-Befehlsreferenz

Andere Erweiterungen