Perf & Flamegraphs: Performance Analysis (Artikel 384)
Beherrschung der Performance-Analyse auf Profi-Niveau. Erfahren Sie alles über das perf-Tool, Hardware-Counter und die Visualisierung von CPU-Hotspots mittels Flamegraphs.
# Perf & Flamegraphs: Den Code im Kernel sichtbar machen
TL;DR / Management Summary Wenn
topundiostatnicht mehr ausreichen, um ein Performance-Rätsel zu lösen, müssen wir tiefer graben.perfist das ultimative Analysewerkzeug, das direkt auf Hardware-Counter (PMU) und Kernel-Events zugreift. Mit Flamegraphs verwandeln wir tausende Zeilen kryptischer Profiling-Daten in eine intuitive Grafik, die uns sofort zeigt, welche Funktion im Code (oder Kernel) die meiste Zeit frisst. Wer diese Tools beherrscht, findet Performance-Bugs, die für andere unsichtbar bleiben.
# 1. Einführung & Architektur
Blick in die CPU.
Der Linux-Kernel nutzt das Performance Monitoring Unit (PMU) der CPU. Wir können Ereignisse wie “Cache Misses”, “Branch Mispredictions” oder einfach nur “CPU Zyklen” pro Funktion messen.
# Die Analyse-Pipeline (Mermaid)
graph TD
A[Target: Slow Application / Kernel] --> B[perf record: Collect Data]
B --> C[perf.data: Raw Event Storage]
C -->|Option 1: Static| D[perf report: Text UI]
C -->|Option 2: Visual| E[Stack Folding: perf script]
E --> F[FlameGraph.pl: Generate SVG]
F --> G[Visual Analysis: Wide boxes = High CPU]
# 2. Erste Schritte mit perf
Den Puls messen.
# Installation
sudo apt install linux-tools-common linux-tools-generic # Debian
sudo pacman -S perf # Arch
# CPU-Zyklen aufzeichnen
# Zeichne für 10 Sekunden alle Prozesse auf (-a: all, -g: call graph)
sudo perf record -a -g -- sleep 10
# Den Bericht lesen
sudo perf report
# Navigieren Sie durch die Liste. Die obersten Einträge verursachen die meiste Last.
# 3. Flamegraphs erstellen
Visualisierung von Komplexität.
Flamegraphs zeigen den Call-Stack. Die Breite eines Balkens entspricht der verbrauchten CPU-Zeit.
# Schritt-für-Schritt
- Daten sammeln:
perf record -a -g -F 99 -- sleep 30 - Skripten:
perf script > out.perf - Visualisieren (erfordert FlameGraph-Skripte von GitHub):
./stackcollapse-perf.pl out.perf > out.folded ./flamegraph.pl out.folded > performance.svg - Öffnen Sie
performance.svgim Browser. Suchen Sie nach breiten “Berggipfeln” – das sind Ihre Flaschenhälse.
# 4. Day-2 Operations: Hardware-Zähler nutzen
Warum ist es langsam?
Es ist nicht immer die CPU-Logik. Oft wartet die CPU auf den RAM.
# Zeige Cache-Misses (Häufige Ursache für schlechte Performance)
sudo perf stat -e cache-misses,cache-references,instructions,cycles -p <PID>
# 5. Troubleshooting & “War Stories”
Wenn Symbole fehlen.
# Story 1: “Das [unknown] Rätsel”
Symptom: perf report zeigt nur Hexadezimal-Adressen oder den String [unknown] statt Funktionsnamen.
Ursache: Die Applikation wurde ohne Debug-Symbole (Stripped) kompiliert oder es fehlen die debuginfo Pakete des Kernels.
Lösung: Installieren Sie die passenden -dbgsym oder -debuginfo Pakete. Starten Sie Java-Apps mit dem perf-map-agent, um JIT-Methoden sichtbar zu machen.
# Story 2: “Der Overhead-Kill”
Symptom: Die Performance-Analyse macht das Problem noch schlimmer oder bringt den Server zum Absturz.
Ursache: Die Sampling-Frequenz (-F) war zu hoch (z.B. 10.000 Hz). Der Kernel verbringt mehr Zeit mit dem Schreiben der Profiling-Daten als mit der Applikation.
Lösung: Starten Sie mit niedrigen Frequenzen (z.B. -F 99) und tasten Sie sich vorsichtig heran.
# 6. Fazit & Empfehlung
- Pflicht: Nutzen Sie
perf statfür einen schnellen Überblick über die Effizienz (Instructions per Cycle). - Wahl: Nutzen Sie Flamegraphs für die Kommunikation mit Entwicklern – ein Bild sagt mehr als tausend Logs.
- Wartung: Halten Sie Ihre
debuginfoRepositories bereit, damit Sie im Ernstfall sofort aussagekräftige Profile erstellen können.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Statistiken live | perf stat <command> |
| CPU-Profil (10s) | perf record -a -g -- sleep 10 |
| Interaktive Analyse | perf report |
| Top-Funktionen live | perf top |
| Systemaufrufe zählen | perf stat -e 'syscalls:sys_enter_*' -p <pid> |
| Alle verfügbaren Events | perf list |
| Flamegraph Code | github.com/brendangregg/FlameGraph |
| Java JIT Support | perf-map-agent |