# 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 kprobes an 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?

# 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

  1. Symptom: System wird extrem langsam, sobald ftrace läuft.

    • Ursache: Zu viele Funktionen im Filter (function tracer ohne Filter auf einer 64-Core Maschine).
    • Lösung: Nutzen Sie immer set_ftrace_filter oder set_graph_function.
  2. Symptom: trace Datei ist leer.

    • Ursache: tracing_on ist 0 oder ein anderer Tracer blockiert die Ressource.
    • Lösung: echo 0 > current_tracer zum Resetten.
  3. Symptom: Mount-Point fehlt.

    • Lösung: mount -t tracefs nodev /sys/kernel/tracing.

# “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.


# 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

# Referenzen