samply - Muestreador de Perfiles con Interfaz Firefox Profiler
samply es un muestreador de perfiles de línea de comandos multiplataforma para macOS, Linux y Windows. Muestrea trazas de pila de un comando o proceso en ejecución (por defecto ~1000 Hz) y luego sirve los resultados a la interfaz web Firefox Profiler — un frente final maduro e interactivo con gráficos de llama, gráficos de pila, un árbol de llamadas, y líneas de tiempo por hilo. Perfila código nativo (C/C++/Rust/Go) y otros lenguajes que emiten información de pila estándar, sin cambios de código requeridos.
Instalación
| Método | Comando |
|---|
| Cargo | cargo install --locked samply |
| Binario | descargar desde la página GitHub Releases |
| Acceso de eventos perf en Linux | puede ser necesario sysctl kernel.perf_event_paranoid=1 (o menor) |
| Verificar | samply --version |
Uso Básico
| Comando | Descripción |
|---|
samply record ./my-program args | Perfilar un comando, luego abrir la interfaz |
samply record -- cargo run --release | Perfilar después de -- (pasar banderas a través) |
samply record --pid 1234 | Perfilar un proceso ya en ejecución |
samply load profile.json.gz | Reabrir un perfil guardado en la interfaz |
samply --help | Lista completa de opciones |
Opciones de Grabación
| Opción | Descripción |
|---|
-r, --rate N | Frecuencia de muestreo en Hz (por defecto ~1000) |
-o, --output FILE | Guardar el perfil en un archivo |
--save-only | Grabar sin lanzar la interfaz del navegador |
-p, --pid PID | Adjuntar a un proceso en ejecución |
-d, --duration SECS | Perfilar durante una duración fija |
--reuse-threads | Ajuste de manejo de hilos para algunas cargas de trabajo |
-- | Todo después es el comando + sus argumentos |
La Interfaz Firefox Profiler
Después de grabar, samply abre una vista local de Firefox Profiler. Paneles clave:
| Panel | Muestra |
|---|
| Gráfico de llama | Pilas agregadas (dónde se gasta el tiempo) |
| Gráfico de pila | Tiempo en el eje x, pilas apiladas verticalmente |
| Árbol de llamadas | Jerarquía de arriba hacia abajo / abajo hacia arriba con tiempo propio/total |
| Gráfico de marcador | Eventos a lo largo del tiempo (si están presentes) |
| Línea de tiempo | Actividad por hilo; seleccionar un rango para enfocarse |
| Acción de interfaz | Uso |
|---|
| Seleccionar un rango de tiempo | Enfocar análisis en parte de la ejecución |
| Invertir pila de llamadas | Encontrar funciones hoja caliente (tiempo propio) |
| Búsqueda | Filtrar el árbol de llamadas por nombre de función |
| Compartir/exportar | Guardar o subir el perfil |
Consejos de Flujo de Trabajo
| Objetivo | Enfoque |
|---|
| Encontrar rutas CPU calientes | Grabar, abrir gráfico de llama, buscar marcos anchos |
| Encontrar una fase lenta específica | Seleccionar ese rango de tiempo en la línea de tiempo |
| Comparar compilaciones | Guardar perfiles y cargar lado a lado |
| Reducir ruido | Perfilar compilaciones de liberación con información de depuración (debug = true) |
Flujos de Trabajo Comunes
# Perfilar una compilación de liberación Rust (mantener símbolos con información de depuración)
samply record -- cargo run --release
# Perfilar un servidor en ejecución durante 20 segundos
samply record --pid $(pgrep -n myserver) -d 20
# Grabar sin interfaz en CI, inspeccionar el artefacto más tarde
samply record --save-only -o prof.json.gz ./bench
samply load prof.json.gz
samply vs Otros Perfiladores
| Aspecto | samply | perf + FlameGraph | hotspot |
|---|
| Plataformas | macOS/Linux/Windows | Linux | Linux |
| Interfaz | Firefox Profiler (rico) | SVG estático | GUI Qt |
| Configuración | Binario único | Múltiples herramientas | Instalación GUI |
| Mejor para | Multiplataforma, interactivo | Perfilado Linux programado | Usuarios de GUI Qt/perf |
Recursos