Start Debugging
2026-01-21 Actualizado 2026-01-23 dotnetdotnet-10dotnet-9performance Edit on GitHub

Perfetto + dotnet-trace: un ciclo práctico de profiling para .NET 9/.NET 10

Un ciclo práctico de profiling para .NET 9 y .NET 10: captura trazas con dotnet-trace, visualízalas en Perfetto e itera sobre problemas de CPU, GC e hilos del thread pool.

La forma más rápida de salir del atasco con un “va lento” en .NET es dejar de adivinar y empezar a mirar una línea de tiempo. Un artículo que circula esta semana muestra un flujo limpio: capturar trazas con dotnet-trace y luego inspeccionarlas en Perfetto (el mismo ecosistema de visor de trazas que muchos conocen del mundo Android y Chromium): Using dotnet-trace with Perfetto.

Por qué vale la pena sumar Perfetto a tu caja de herramientas

Si ya usas dotnet-counters o un profiler, Perfetto no es un reemplazo. Es un complemento:

Para apps en .NET 9 y .NET 10 esto es especialmente útil cuando intentas validar que un cambio “pequeño” no introdujo accidentalmente asignaciones extra, hilos extra o un nuevo cuello de botella de sincronización.

El ciclo de captura (primero reproducir, luego trazar)

El truco es tratar el tracing como un ciclo, no como una acción única:

Esta es la secuencia mínima de captura usando la herramienta global:

dotnet tool install --global dotnet-trace

# Find the PID of the target process (pick one)
dotnet-trace ps

# Capture an EventPipe trace (default providers are usually a good starting point)
dotnet-trace collect --process-id 12345 --duration 00:00:15 --output app.nettrace

Terminarás con app.nettrace. A partir de ahí, sigue los pasos de conversión/apertura del artículo original (la ruta exacta para “abrir en Perfetto” depende de qué Perfetto UI uses y qué paso de conversión elijas).

Qué buscar al abrir la traza

Empieza por preguntas que puedas responder en minutos:

Una vez que encuentres una ventana sospechosa, vuelve al código y aplica un cambio quirúrgico (por ejemplo: reducir asignaciones, evitar sync-over-async, quitar un lock del hot path de la solicitud o agrupar llamadas costosas).

Un patrón pragmático: trazar en Release sin perder símbolos

Si puedes, ejecuta el camino lento en Release (más cerca de producción), pero conserva información suficiente para razonar sobre los frames. En proyectos SDK-style, los PDB se generan por defecto; para una sesión de profiling normalmente quieres rutas de salida predecibles:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net9.0</TargetFramework>
    <Configuration>Release</Configuration>
    <DebugType>portable</DebugType>
  </PropertyGroup>
</Project>

Mantenlo aburrido: entrada estable, configuración estable, trazas cortas, repetir.

Si quieres los pasos detallados de Perfetto y capturas de pantalla, el artículo original es la mejor referencia para tener abierta mientras corres el ciclo: Using dotnet-trace with Perfetto.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Volver