>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
C-sharp

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.

Captura de tela do trace do Ultra

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