Ultra Profiler combina la recolección de trazas de bajo nivel en .NET con la interfaz del Firefox Profiler
Cada vez que el rendimiento cae o el uso de memoria se dispara en una aplicación .NET, comienza la búsqueda familiar. PerfView te asusta con su interfaz de principios de los 2000, dotnet-trace escupe informes secos, y los profilers comerciales completos suelen resultar bestias pesadas. Recientemente, Alexander Mütel (conocido como xoofx, autor de Markdig y numerosas otras utilidades de C# de bajo nivel) lanzó su herramienta Ultra, que intenta combinar la recolección detallada de trazas con una interfaz web conveniente.
La herramienta recolecta muestras de bajo nivel hasta el kernel del sistema operativo y muestra los resultados a través de profiler.firefox.com. El resultado es una herramienta de línea de comandos ligera que genera trazas de apenas un par de megabytes y abre inmediatamente una visualización clara con líneas de tiempo, flamegraphs y árboles de llamadas.

Qué hay bajo el capó y cómo funciona
La idea principal del proyecto es evitar inventar su propia interfaz de usuario voluminosa. El autor tomó el motor del Firefox Profiler, que destaca en gráficos interactivos, y escribió un recolector de datos eficiente para .NET.
La recolección se maneja de manera diferente en distintas plataformas:
- En Windows, el perfilado se basa en ETW (Event Tracing for Windows). La frecuencia de muestreo aquí puede alcanzar hasta 8190 muestras por segundo. Esto te da una pila de llamadas honesta: puedes ver no solo código .NET administrado, sino también llamadas al runtime de CLR, llamadas a bibliotecas nativas y funciones del kernel de Windows.
- En macOS, el recolector funciona a través de inyección de bibliotecas dinámicas directamente en el proceso al inicio y escucha EventPipe. Aquí la frecuencia está limitada a 1000 muestras por segundo, y la traza captura llamadas de espacio de usuario administradas y nativas.
En el informe, todas las llamadas están neatly organizadas y categorizadas: .NET, .NET JIT, .NET GC, .NET CLR, Native y Kernel. Está inmediatamente claro si el proceso está girando en tu bucle, esperando en un bloqueo de hilo en el kernel, o atascado en la compilación de métodos.
Detalles sobre el Recolector de Basura y JIT
Además de las muestras de CPU, la utilidad adjunta eventos del runtime.
Los marcadores de compilación JIT con nombres de métodos específicos aparecen en la línea de tiempo, por lo que la fase de calentamiento de la aplicación es claramente visible. Para GC, la traza registra estadísticas del heap, eventos de pausa del runtime (GCSuspendEE y GCRestartEE) y asignaciones de memoria.
Las trazas son compactas: una ejecución de diez segundos suele pesar apenas unos pocos megabytes. El archivo resultante se puede compartir con un colega o cargar directamente en share.firefox.dev para el análisis colaborativo de incidentes.
Inicio Rápido
La utilidad se distribuye como una herramienta global estándar. Requiere .NET SDK 10 o superior:
dotnet tool install -g Ultra
En Windows, se necesitan derechos administrativos para recolectar stacks del kernel. Puedes perfilar un programa separado usando el separador de argumentos --:
ultra.exe profile -- my_command.exe arg0 arg1
Si un servicio ya se está ejecutando en un servidor o máquina local, simplemente pasa el ID del proceso:
ultra.exe profile 15243
Después de que la recolección termina con Ctrl+C, la utilidad guarda el archivo de traza.
En macOS con chips Apple Silicon, no se requieren privilegios elevados, pero hay una advertencia. El profiler solo funciona al iniciar un nuevo binario:
ultra profile -- ./my_command arg0 arg1
Adjuntar por PID en Mac aún no es posible, porque el recolector se inyecta exclusivamente al inicio del proceso. La recolección de stacks del kernel en macOS tampoco es compatible, y los símbolos de bibliotecas del sistema en la caché compartida de dyld permanecen sin resolver.
Integración con Modelos de Lenguaje
Un detalle interesante: el ecosistema del proyecto ya tiene un servidor MCP separado llamado UltraMCP por Kirill Osenkov. Conecta los resultados del perfilado directamente a agentes de IA como Cursor o Claude Desktop. Un agente puede leer la traza él mismo, encontrar cuellos de botella en el código y sugerir correcciones de optimización sin copiar manualmente las trazas de pila en un chat.
¿Vale la Pena Probarlo
La herramienta es reciente, con una licencia BSD-2-Clause abierta. En macOS aún hay limitaciones funcionales, pero para Windows ya es un excelente reemplazo para utilidades pesadas.
Si regularmente necesitas descubrir por qué un servicio es lento para iniciar, a dónde va la memoria en un bucle ajustado, o cuánto tiempo toma JIT, añade Ultra a tu kit de herramientas. La rápida recolección de trazas con un solo comando sin pelear con la configuración ahorra mucho tiempo.
Proyectos relacionados