samply é um sampling profiler de linha de comando multiplataforma para macOS, Linux e Windows. Ele amostra stack traces de um comando ou um processo em execução (padrão ~1000 Hz) e então serve os resultados à web UI do Firefox Profiler — um front end maduro e interativo com gráficos de chama, gráficos de pilha, árvore de chamada e timelines por thread. Ele perfila código nativo (C/C++/Rust/Go) e outras linguagens que emitem informações de pilha padrão, sem mudanças de código necessárias.
Instalação
| Método | Comando |
|---|
| Cargo | cargo install --locked samply |
| Binário | faça download da página de Releases do GitHub |
| Acesso de evento perf do Linux | pode precisar sysctl kernel.perf_event_paranoid=1 (ou inferior) |
| Verificar | samply --version |
Uso Básico
| Comando | Descrição |
|---|
samply record ./my-program args | Perfil de um comando, depois abra a UI |
samply record -- cargo run --release | Perfil após -- (passe bandeiras através) |
samply record --pid 1234 | Perfil de um processo já em execução |
samply load profile.json.gz | Re-abra um perfil salvo na UI |
samply --help | Lista de opção completa |
Opções de Gravação
| Opção | Descrição |
|---|
-r, --rate N | Taxa de amostragem em Hz (padrão ~1000) |
-o, --output FILE | Salve o perfil em um arquivo |
--save-only | Grave sem iniciar a UI do navegador |
-p, --pid PID | Anexe a um processo em execução |
-d, --duration SECS | Perfil por uma duração fixa |
--reuse-threads | Ajuste de manipulação de thread para algumas workloads |
-- | Tudo depois é o comando + seus args |
A UI do Firefox Profiler
Após gravação, samply abre uma visualização local do Firefox Profiler. Painéis principais:
| Painel | Mostra |
|---|
| Gráfico de chama | Pilhas agregadas (onde o tempo é gasto) |
| Gráfico de pilha | Tempo no eixo x, pilhas empilhadas verticalmente |
| Árvore de chamada | Hierarquia top-down / bottom-up com self/total time |
| Gráfico de marcador | Eventos com o tempo (se presente) |
| Timeline | Atividade por thread; selecione um intervalo para focar |
| Ação de UI | Uso |
|---|
| Selecione um intervalo de tempo | Analise focus em parte da execução |
| Inverta pilha de chamada | Encontre funções de folha quente (self time) |
| Procure | Filtre a árvore de chamada por nome de função |
| Compartilhe/exporte | Salve ou carregue o perfil |
Dicas de Workflow
| Objetivo | Abordagem |
|---|
| Encontre caminhos quentes de CPU | Grave, abra gráfico de chama, procure por frames amplos |
| Encontre uma fase lenta específica | Selecione esse intervalo de tempo na timeline |
| Compare builds | Salve perfis e carregue lado a lado |
| Reduza ruído | Perfil de compilações liberadas com info de debug (debug = true) |
Workflows Comuns
# Perfil de uma compilação Rust liberada (mantenha símbolos com info de debug)
samply record -- cargo run --release
# Perfil de um servidor em execução por 20 segundos
samply record --pid $(pgrep -n myserver) -d 20
# Grave headless em CI, inspecione o artefato depois
samply record --save-only -o prof.json.gz ./bench
samply load prof.json.gz
samply vs Outros Profilers
| Aspecto | samply | perf + FlameGraph | hotspot |
|---|
| Plataformas | macOS/Linux/Windows | Linux | Linux |
| UI | Firefox Profiler (rica) | Static SVG | Qt GUI |
| Setup | Binário único | Múltiplas ferramentas | Instalação GUI |
| Melhor para | Cross-platform, interativo | Profiling Linux scriptado | Usuários GUI do Qt/perf |
Recursos