# perf: Die CPU-Performance unter dem Mikroskop
TL;DR / Management Summary perf ist das Standardwerkzeug für Performance-Profiling unter Linux. Es nutzt Hardware-Performance-Counter (PMU) der CPU und Kernel-Tracepoints, um statistisch zu erfassen, wo ein System Zeit verbringt. Ob Sie herausfinden wollen, warum ein Prozess 100% CPU last verursacht, oder warum Cache-Misses die Datenbank bremsen:
perfliefert die Antwort mit minimalem Overhead.
# 1. Einführung & Architektur
Messen durch Stichproben (Sampling).
Anstatt jeden Befehl zu loggen (hoher Overhead), macht perf Sampling. Es schaut z.B. 1000 Mal pro Sekunde nach, welcher Code-Befehl gerade auf der CPU ausgeführt wird.
# Was kann perf messen?
- Hardware Events: CPU-Zyklen, Instruktionen, Cache-Misses, Branch-Mispredictions.
- Software Events: Context Switches, Page Faults.
- Tracepoints: Scheduler-Events, System-Calls.
# 2. perf in der Praxis
Die drei Säulen der Analyse.
# 1. Detaillierte Live-Statistik (perf stat)
Ideal für einen schnellen Überblick über die Effizienz eines Befehls.
perf stat -B dd if=/dev/zero of=/dev/null count=1000000
Achten Sie auf ‘Instructions per cycle’ (IPC). Ein Wert < 1.0 deutet oft auf Memory-Bottlenecks hin.
# 2. Live-Top-View (perf top)
Wie top, aber für Funktionen (Kernel und User-Space).
# Zeigt die heißesten Funktionen systemweit
perf top
# 3. Record & Report (perf record)
Für die detaillierte Analyse im Nachgang.
# 10 Sekunden lang das gesamte System sampeln
perf record -a -g -- sleep 10
# Ergebnis betrachten
perf report
-g: Zeichnet den Call-Graph auf (Wer hat die Funktion aufgerufen?).
# 3. Deep Dive: Flame Graphs
Den Wald vor lauter Bäumen sehen.
Ein perf report kann bei komplexen Applikationen tausende Zeilen lang sein. Flame Graphs (von Brendan Gregg) visualisieren diese Daten.
# Erstellung (Konzept)
- Daten sammeln:
perf record -F 99 -a -g -- sleep 60 - Daten kollabieren:
perf script | ./stackcollapse-perf.pl > out.folded - SVG erstellen:
./flamegraph.pl out.folded > graph.svg
In einem Flame Graph ist die Breite eines Balkens proportional zur verbrauchten CPU-Zeit. Suchen Sie nach den “Plateaus”.
# 4. Day-2 Operations: Cache & Memory Tuning
Wenn die CPU auf den RAM wartet.
# Cache-Misses finden
Wenn eine CPU auf Daten aus dem RAM warten muss (L3 Cache Miss), verliert sie hunderte Zyklen.
perf stat -e cache-misses,cache-references,instructions,cycles ./my_app
Wenn die Miss-Rate hoch ist, müssen Sie die Datenstrukturen in Ihrer Applikation optimieren (Data Locality).
# 5. Troubleshooting & “War Stories”
Wenn perf nichts sieht.
# Top 3 Herausforderungen
-
Symptom:
perf reportzeigt nur Hex-Adressen (0xffffffff81...) statt Funktionsnamen.- Ursache: Fehlende Debug-Symbole oder Kernel-KASLR.
- Lösung:
yum install kernel-debuginfooderecho 0 > /proc/sys/kernel/kptr_restrict.
-
Symptom: Flame Graphs zeigen nur “Unknown” oder flache Stacks.
- Ursache: Programme wurden ohne Frame-Pointer (
-fno-omit-frame-pointer) kompiliert. - Lösung: Applikation mit Frame-Pointern neu kompilieren oder
perf record --call-graph dwarfnutzen (höherer Overhead).
- Ursache: Programme wurden ohne Frame-Pointer (
-
Symptom:
perf recordbricht ab (Permission denied).- Lösung:
sysctl -w kernel.perf_event_paranoid=1(erlaubt Usern mehr Rechte).
- Lösung:
# “War Story”: Die gierige Spinlock
Ein High-Performance Proxy skalierte nicht über 4 Kerne hinaus. Jede zusätzliche CPU machte das System langsamer.
perf top zeigte, dass 40% der Zeit in native_queued_spin_lock_slowpath verbracht wurde.
Entdeckung: Alle Threads versuchten gleichzeitig, eine einzige globale Statistik-Variable zu aktualisieren. Durch den Wechsel auf thread-lokale Counter (Per-CPU Variables) verschwand der Lock-Contention und der Durchsatz verfünffachte sich.
# 6. Monitoring Integration
Profiling im Cluster.
# eBPF Exporter
Sie können eBPF-Programme nutzen, um perf-ähnliche Daten (wie Latenz-Histogramme) permanent zu sammeln und an Prometheus zu senden, ohne die CPU-Last von perf record zu haben.
# 7. Fazit & Empfehlung
perf ist die ultimative Wahrheit über CPU-Aktivität.
- Empfehlung: Nutzen Sie
perf statroutinemäßig, um die Effizienz Ihrer Kern-Anwendungen zu prüfen. - Lernziel: Verstehen Sie den Unterschied zwischen CPU-Zeit (on-CPU) und Wartezeit (off-CPU).
perfmisst nur Ersteres!
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Schneller Check | perf stat <command> |
| Wer braucht CPU? | perf top |
| Mit Stack-Trace | perf record -g |
| I/O Latenz | perf record -e block:block_rq_issue |
| Context Switches | perf stat -e context-switches |