# Kernel Tracing Deep Dive: ftrace & Dynamic Instrumentation
TL;DR / Management Summary ftrace ist der offizielle “Function Tracer” des Linux-Kernels. Im Gegensatz zu externen Tools ist er fest im Kernel-Quellcode integriert und benötigt keine zusätzlichen Bibliotheken. Er erlaubt es, den Funktionsaufruf-Graphen des Kernels in Echtzeit zu verfolgen, Latenzen von Interrupts zu messen und via
kprobesan beliebige Stellen im Binärcode zu springen. Für Admins ist es das Werkzeug der Wahl, wenn es darum geht, herauszufinden, warum der Kernel in einer bestimmten Situation Zeit verliert.
# 1. Einführung & Architektur
Die Schaltzentrale: tracefs.
ftrace wird primär über ein virtuelles Dateisystem gesteuert, das meist unter /sys/kernel/tracing (oder /sys/kernel/debug/tracing) gemountet ist.
# Wie funktioniert ftrace?
- Compile-time: Der Kernel wird mit speziellen Flags (
-pg) übersetzt, die am Anfang jeder Funktion Platz für einen Hook lassen. - Runtime: Im Normalbetrieb sind diese Hooks durch “No-Ops” ersetzt (Null-Overhead). Aktiviert man ftrace, ersetzt der Kernel diese No-Ops dynamisch durch Sprungbefehle zum Tracer.
# Architektur-Diagramm (Mermaid)
graph TD
USER[Admin / trace-cmd] -->|Write Config| T_FS[tracefs /sys/kernel/tracing]
T_FS -->|Enable| K_LOGIC[Kernel Function Hooks]
K_LOGIC -->|Record| RING_BUF[Ring Buffer]
RING_BUF -->|Read Output| T_FS
T_FS -->|Display| USER
subgraph "Tracer Types"
F_GRAPH[function_graph]
F_TRACER[function]
IRQ_TRACER[irqsoff]
end
# 2. ftrace in der Praxis
Direkt auf der Kommandozeile.
# Tracer aktivieren
cd /sys/kernel/tracing
# Verfügbare Tracer anzeigen
cat available_tracers
# Function Graph Tracer aktivieren (zeigt Hierarchie)
echo function_graph > current_tracer
# Trace starten und stoppen
echo 1 > tracing_on
# ... kurz warten ...
echo 0 > tracing_on
# Ergebnis lesen
head trace
# Filtern nach Funktionen
Alles zu tracen erzeugt zu viel Last. Filtern Sie auf das relevante Subsystem:
# Nur Funktionen tracen, die mit 'vfs_' beginnen
echo 'vfs_*' > set_ftrace_filter
# 3. Deep Dive: Trace-cmd
Das komfortable Frontend.
Niemand möchte manuell in /sys Dateien schreiben. trace-cmd automatisiert diesen Prozess.
# Einen Befehl aufzeichnen
# Tracet alle Kernel-Funktionen während eines 'ls'
trace-cmd record -p function_graph -g __do_sys_openat ls
# Ergebnis analysieren
trace-cmd report
# Latenzen finden
Mit dem wakeup oder irqsoff Tracer finden Sie heraus, was Ihr System blockiert:
trace-cmd record -p irqsoff -f
# 4. Kombination mit Kprobes & Uprobes
Dynamische Sonden via ftrace.
ftrace kann auch dynamische Ereignisse erzeugen, ohne dass man eBPF/bpftrace nutzen muss.
# Kprobes via ftrace
# Einen neuen Event-Punkt definieren
echo 'p:my_probe do_sys_openat filename=+0(%si):string' > kprobe_events
# Event aktivieren
echo 1 > events/kprobes/my_probe/enable
# Output lesen
cat trace | grep my_probe
# 5. Troubleshooting & “War Stories”
Wenn der Tracer das System bremst.
# Top 3 Fehlerbilder
-
Symptom: System wird extrem langsam, sobald ftrace läuft.
- Ursache: Zu viele Funktionen im Filter (
functiontracer ohne Filter auf einer 64-Core Maschine). - Lösung: Nutzen Sie immer
set_ftrace_filteroderset_graph_function.
- Ursache: Zu viele Funktionen im Filter (
-
Symptom:
traceDatei ist leer.- Ursache:
tracing_onist 0 oder ein anderer Tracer blockiert die Ressource. - Lösung:
echo 0 > current_tracerzum Resetten.
- Ursache:
-
Symptom: Mount-Point fehlt.
- Lösung:
mount -t tracefs nodev /sys/kernel/tracing.
- Lösung:
# “War Story”: Der schluckaufende Scheduler
Ein Real-Time System verpasste Deadlines. Standard-Monitoring zeigte 10% CPU-Last.
Wir nutzten den function_graph Tracer mit Fokus auf irq_handler_entry.
Entdeckung: Ein schlecht geschriebener RAID-Controller-Treiber hielt die Interrupts für 2ms am Stück gesperrt. ftrace zeigte uns die exakte Zeitspanne zwischen irq_disable und irq_enable.
# 6. Monitoring & Day-2
ftrace im Dauerbetrieb?
ftrace ist ein Diagnose-Tool, kein Monitoring-Tool. Es sollte nicht permanent laufen.
# Instanzen nutzen
Sie können mehrere Puffer parallel nutzen (Multi-User-Tracing):
mkdir /sys/kernel/tracing/instances/admin_debug
# Diese Instanz hat ihre eigene 'trace' Datei und Filter
# 7. Fazit & Empfehlung
ftrace ist das “Schweizer Taschenmesser” im Kernel.
- Empfehlung: Nutzen Sie
trace-cmdfür die Aufzeichnung auf Remote-Servern und analysieren Sie den Report lokal auf Ihrem Laptop. - Vergleich: Wenn Sie komplexe Berechnungen im Kernel brauchen, nehmen Sie eBPF. Wenn Sie nur sehen wollen, wer wen aufruft, nehmen Sie ftrace.
# Anhang: Cheatsheet
| Aufgabe | Pfad / Befehl |
|---|---|
| Tracer wählen | echo <name> > current_tracer |
| Filter setzen | echo <pattern> > set_ftrace_filter |
| Live-View | cat trace_pipe |
| Reset | echo nop > current_tracer |
| Aufzeichnung | trace-cmd record -p function |