Bytehound - Cheatsheet de Perfilador de Memória para Linux
Bytehound é um perfilador de memória para Linux que rastreia cada alocação e desalocação em um programa e apresenta os resultados em uma UI web incomumente bom. Além de encontrar vazamentos, mostra churn de alocação ao longo do tempo, agrupa alocações por call stack, e permite que você filtre interativamente — “mostre-me alocações maiores que 1MB que nunca foram liberadas, desse módulo.” É uma ferramenta baseada em Rust que funciona com qualquer programa nativo (C, C++, Rust) via LD_PRELOAD.
Instalação
| Método | Como |
|---|
| Lançamento | Download bytehound + libbytehound.so do GitHub Releases |
| Do fonte | cargo build --release no repo |
| Requisitos | Linux x86-64; programa com símbolos (-g) |
| Verificar | ./bytehound --version |
Perfilando um Programa
# Preload o perfilador e execute seu programa
LD_PRELOAD=./libbytehound.so ./my-program
# Isso produz memory-profiling_*.dat
| Variável | Propósito |
|---|
LD_PRELOAD=./libbytehound.so | Injeta os hooks do allocator |
MEMORY_PROFILER_OUTPUT | Caminho do arquivo de saída |
MEMORY_PROFILER_LOG=warn | Nível de log |
MEMORY_PROFILER_CULL_TEMPORARY_ALLOCATIONS | Reduz ruído de alocações de curta vida |
MEMORY_PROFILER_DISABLE_BY_DEFAULT | Comece pausado, habilite programaticamente |
Visualizando Resultados
# Inicia a UI web nos dados capturados
./bytehound server memory-profiling_*.dat
# → abra http://localhost:8080
| View | Mostra |
|---|
| Gráficos | Uso de memória ao longo do tempo (vivo, vazado, alocado) |
| Alocações | Cada alocação com stack, tamanho, lifetime |
| Flame graph | Volume de alocação atribuído a call stacks |
| Vazado | Alocações nunca liberadas |
| Filtragem | Construtor de consulta interativa |
A Linguagem de Filtragem
A força de Bytehound é fatiar os dados:
| Filtro | Encontra |
|---|
| Apenas vazado | Alocações vivas na saída |
| Intervalo de tamanho | ex. > 1 MiB |
| Lifetime | Curta (churn) vs longa |
| Backtrace contém | Alocações de uma função/módulo específico |
| Intervalo de tempo | Alocações durante uma janela |
# Conceitual: alocações vazadas acima de 1MB do módulo parser
leaked AND size > 1048576 AND backtrace contains "parser::"
O que Procurar
| Sintoma | Investigue |
|---|
| RSS cresce sem limites | View “Vazado” — alocações nunca liberadas |
| CPU alto no allocator | Churn de alocação temporária |
| Pico de memória em um momento | Filtro de intervalo de tempo em torno do pico |
| Uma função domina | Flame graph de alocação |
| Fragmentação | Muitas alocações pequenas de longa vida |
Scriptando a Análise
Bytehound expõe uma API e CLI para automação:
| Comando | Propósito |
|---|
bytehound server DATA | UI interativa |
bytehound export-heaptrack DATA | Converte para ferramentas heaptrack |
| REST API | Consulta alocações programaticamente |
| Scripting | Análises customizadas sobre o dataset |
Reduzindo Sobrecarga
| Setting | Efeito |
|---|
| Cull alocações temporárias | Saída muito menor, menos ruído |
| Desabilita por padrão + habilita em código | Perfil apenas a fase interessante |
| Execuções mais curtas | Arquivos de dados crescem rápido |
Bytehound vs Outros Perfiladores de Memória
| Aspecto | Bytehound | heaptrack | Valgrind massif | jemalloc prof |
|---|
| Sobrecarga | Baixa | Baixa | Muito alta | Muito baixa |
| UI | UI web rico | Qt GUI | Text/visualizer | Text + tooling |
| Filtragem | Excelente | Bom | Limitado | Limitado |
| Setup | LD_PRELOAD | heaptrack ./prog | valgrind --tool=massif | Configuração de allocator |
| Melhor para | Exploração interativa | Perfilamento rápido de heap | Correção profunda | Amostragem de produção |
Compare com heaptrack para uma abordagem semelhante de baixa sobrecarga com Qt UI; ambos batem Valgrind em workloads realistas.
Recursos