Ultra Profiler Combina Coleta de Traces de Baixo Nível no .NET com Interface do Firefox Profiler
Toda vez que o desempenho cai ou o uso de memória dispara em uma aplicação .NET, a busca familiar começa. O PerfView assusta você com sua interface dos anos 2000, o dotnet-trace cospe relatórios secos, e profilers comerciais completos frequentemente se revelam verdadeiras feras. Recentemente, Alexander Mütel (conhecido como xoofx, autor do Markdig e numerosas outras utilitários C# de baixo nível) lançou sua ferramenta Ultra, que tenta combinar coleta detalhada de traces com uma interface web conveniente.
A ferramenta coleta amostras de baixo nível até o kernel do SO e exibe os resultados através do profiler.firefox.com. O resultado é uma ferramenta de linha de comando leve que gera traces de apenas alguns megabytes e abre imediatamente uma visualização clara com linhas do tempo, flamegraphs e árvores de chamadas.

O Que Está Por Trás e Como Funciona
A ideia principal por trás do projeto é evitar inventar sua própria interface pesada. O autor utilizou o motor do Firefox Profiler, que é excelente em gráficos interativos, e escreveu um coletor de dados eficiente para .NET.
A coleta é tratada de forma diferente em diferentes plataformas:
- No Windows, o profiling depende de ETW (Event Tracing for Windows). A frequência de amostragem aqui pode chegar a 8190 amostras por segundo. Isso fornece uma stack de chamadas honesta: você pode ver não apenas código .NET gerenciado, mas também chamadas do runtime do CLR, chamadas de bibliotecas nativas e funções do kernel do Windows.
- No macOS, o coletor funciona através de injeção de biblioteca dinâmica diretamente no processo na inicialização e escuta o EventPipe. Aqui a frequência é limitada a 1000 amostras por segundo, e o trace captura chamadas gerenciadas e nativas do espaço do usuário.
No relatório, todas as chamadas são claramente destacadas e organizadas por categoria: .NET, .NET JIT, .NET GC, .NET CLR, Native e Kernel. Fica imediatamente claro se o processo está girando no seu loop, esperando um bloqueio de thread no kernel, ou preso na compilação de método.
Detalhes sobre o Coletor de Lixo e JIT
Além das amostras de CPU, o utilitário anexa eventos de runtime.
Marcadores de compilação JIT com nomes de métodos específicos aparecem na linha do tempo, então a fase de warmup da aplicação fica claramente visível. Para o GC, o trace registra estatísticas do heap, eventos de pausa do runtime (GCSuspendEE e GCRestartEE) e alocações de memória.
Os traces são compactos: uma execução de dez segundos geralmente pesa apenas alguns megabytes. O arquivo resultante pode ser compartilhado com um colega ou carregado diretamente no share.firefox.dev para análise colaborativa de incidentes.
Início Rápido
O utilitário é distribuído como uma ferramenta global padrão. Ele requer .NET SDK 10 ou superior:
dotnet tool install -g Ultra
No Windows, são necessários direitos administrativos para coletar stacks do kernel. Você pode fazer o profile de um programa separado usando o separador de argumentos --:
ultra.exe profile -- my_command.exe arg0 arg1
Se um serviço já está rodando em um servidor ou máquina local, basta passar o ID do processo:
ultra.exe profile 15243
Após a coleta terminar com Ctrl+C, o utilitário salva o arquivo de trace.
No macOS com chips Apple Silicon, privilégios elevados não são necessários, mas há uma ressalva. O profiler funciona apenas ao iniciar um novo binário:
ultra profile -- ./my_command arg0 arg1
Anexar por PID no Mac ainda não é possível, porque o coletor injeta exclusivamente na inicialização do processo. A coleta de stacks do kernel no macOS também não é suportada, e símbolos de bibliotecas do sistema no cache compartilhado do dyld permanecem não resolvidos.
Integração com Modelos de Linguagem
Um detalhe interessante: o ecossistema do projeto já possui um servidor MCP separado chamado UltraMCP por Kirill Osenkov. Ele conecta os resultados de profiling diretamente a agentes de IA como Cursor ou Claude Desktop. Um agente pode ler o trace ele mesmo, encontrar gargalos no código e sugerir correções de otimização sem copiar manualmente stacks de chamadas em um chat.
Vale a Pena Experimentar
A ferramenta é nova, com uma licença BSD-2-Clause aberta. No macOS ainda há limitações funcionais, mas para Windows já é uma ótima substituição para utilitários pesados.
Se você precisa regularmente descobrir por que um serviço é lento para iniciar, para onde vai a memória em um loop apertado, ou quanto tempo o JIT leva, adicione o Ultra ao seu kit de ferramentas. A coleta rápida de traces com um único comando sem mexer com configuração economiza muito tempo.
Projetos relacionados