Bytehound - Memory Profiler für Linux Cheatsheet
Bytehound ist ein Memory Profiler für Linux, der jede Allocation und Deallocation in einem Programm verfolgt und die Ergebnisse in einer ungewöhnlich guten Web-UI präsentiert. Über das Finden von Lecks hinaus zeigt es Allocation-Churn über die Zeit, gruppiert Allocations nach Call-Stack und lässt dich interaktiv filtern — “zeige mir Allocations größer als 1MB, die nie freigegeben wurden, aus diesem Modul.” Es ist ein Rust-basiertes Tool, das mit jedem nativen Programm funktioniert (C, C++, Rust) via LD_PRELOAD.
Installation
| Methode | Wie |
|---|
| Release | Download bytehound + libbytehound.so von GitHub Releases |
| Aus Quelle | cargo build --release im Repo |
| Anforderungen | Linux x86-64; Programm mit Symbolen (-g) |
| Überprüfung | ./bytehound --version |
Profiling eines Programms
# Preload den Profiler und starte dein Programm
LD_PRELOAD=./libbytehound.so ./my-program
# Dies erzeugt memory-profiling_*.dat
| Variable | Zweck |
|---|
LD_PRELOAD=./libbytehound.so | Injiziere die Allocator-Hooks |
MEMORY_PROFILER_OUTPUT | Output-Dateipfad |
MEMORY_PROFILER_LOG=warn | Log-Level |
MEMORY_PROFILER_CULL_TEMPORARY_ALLOCATIONS | Reduziere Noise aus kurzlebigen Allocations |
MEMORY_PROFILER_DISABLE_BY_DEFAULT | Starte pausiert, aktiviere programmgesteuert |
Ergebnisse anschauen
# Starten Sie die Web-UI auf den erfassten Daten
./bytehound server memory-profiling_*.dat
# → öffne http://localhost:8080
| Ansicht | Zeigt |
|---|
| Graphs | Speichernutzung über die Zeit (Live, Lecks, Allocated) |
| Allocations | Jede Allocation mit Stack, Größe, Lebensdauer |
| Flame-Graph | Allocation-Volumen dem Call-Stack zugeordnet |
| Geleckt | Nie freigegebene Allocations |
| Filtering | Interaktiver Query-Builder |
Die Filter-Sprache
Bytehounds Stärke ist das Aufteilen der Daten:
| Filter | Findet |
|---|
| Nur Geleckt | Allocations, die beim Beenden noch aktiv sind |
| Größenbereich | z.B. > 1 MiB |
| Lebensdauer | Kurzlebig (Churn) vs Langlebig |
| Backtrace enthält | Allocations aus einer spezifischen Funktion/Modul |
| Zeitbereich | Allocations während eines Fensters |
# Konzeptionell: Geleckte Allocations über 1MB aus dem Parser-Modul
leaked AND size > 1048576 AND backtrace contains "parser::"
Was zu suchen ist
| Symptom | Untersuche |
|---|
| RSS wächst unbegrenzt | ”Geleckt”-Ansicht — Allocations nie freigegeben |
| Hohe CPU im Allocator | Temporäre Allocation-Churn |
| Speicherspitze im Moment | Zeit-Bereichs-Filter um die Spitze |
| Eine Funktion dominiert | Allocation Flame-Graph |
| Fragmentierung | Viele kleine langlebige Allocations |
Skriptung der Analyse
Bytehound stellt eine API und CLI für Automatisierung bereit:
| Befehl | Zweck |
|---|
bytehound server DATA | Interaktive UI |
bytehound export-heaptrack DATA | Konvertiere für heaptrack-Tools |
| REST API | Query Allocations programmgesteuert |
| Scripting | Benutzerdefinierte Analysen über dem Datensatz |
Overhead reduzieren
| Setting | Effekt |
|---|
| Temporäre Allocations cullen | Viel kleinere Ausgabe, weniger Noise |
| Standardmäßig deaktiviert + im Code aktivieren | Profiliere nur die interessante Phase |
| Kürzere Läufe | Datendateien wachsen schnell |
Bytehound vs andere Memory Profiler
| Aspekt | Bytehound | heaptrack | Valgrind massif | jemalloc prof |
|---|
| Overhead | Niedrig | Niedrig | Sehr hoch | Sehr niedrig |
| UI | Reiche Web-UI | Qt GUI | Text/Visualizer | Text + Tools |
| Filtering | Ausgezeichnet | Gut | Limitiert | Limitiert |
| Setup | LD_PRELOAD | heaptrack ./prog | valgrind --tool=massif | Allocator-Config |
| Bestes für | Interaktive Exploration | Schnelle Heap-Profiling | Tiefe Korrektheit | Production Sampling |
Vergleiche mit heaptrack für einen ähnlichen Niedrig-Overhead-Ansatz mit Qt-UI; beide schlagen Valgrind für realistische Workloads.
Ressourcen