En .NET Core 3.0, presentamos un conjunto de herramientas que aprovechan las nuevas características del entorno de tiempo de ejecución .NET que simplifican el diagnóstico y la resolución de problemas de rendimiento.
Estas características lo ayudarán a responder algunas preguntas de diagnóstico comunes que pueda tener:
- ¿Mi aplicación está operativa?
- ¿Por qué mi aplicación tiene un comportamiento anormal?
- ¿Por qué se bloquea mi aplicación?

¿Mi aplicación está operativa?
Con el tiempo, puede producirse una pérdida de memoria en la aplicación, que finalmente conduce a una excepción OutOfMemoryException. En otros casos, un código problemático puede provocar un salto en la carga del procesador. Estos son solo algunos de los problemas que puede identificar activamente con las
métricas .
Métricas
Las métricas son datos de medición durante un período de tiempo. Estas métricas le permiten monitorear el estado de su sistema a un alto nivel. A diferencia de .NET Framework en Windows, .NET Core no genera contadores de rendimiento. En su lugar, presentamos una nueva forma de generar métricas en .NET Core a través de la API
EventCounter .
EventCounters ofrece una mejora sobre los contadores de rendimiento de Windows, ya que ahora se utilizan en todos los sistemas operativos que admiten .NET Core. Además, a diferencia de los contadores de rendimiento, también se pueden usar en entornos de bajos privilegios (por ejemplo, al implementar xcopy). Desafortunadamente, la falta de una herramienta como el Monitor de rendimiento (perfmon) dificulta la visualización de estos indicadores en tiempo real.
contadores dotnetEn 3.0-preview5, presentamos una nueva herramienta de línea de comandos para monitorear las métricas generadas por las aplicaciones .NET Core en tiempo real.
Puede instalar esta herramienta ejecutando el siguiente comando
dotnet tool install --global dotnet-counters --version 1.0.3-preview5.19251.2
En el siguiente ejemplo, vemos que la carga de CPU y la memoria de nuestra aplicación aumentan cuando comenzamos a cargar en nuestra aplicación web.

Para obtener instrucciones detalladas sobre cómo usar esta herramienta, consulte el
archivo Léame en el proyecto con dotnet-counters . Para conocer las limitaciones conocidas de los contadores dotnet, observe
los problemas abiertos en GitHub .
¿Por qué mi aplicación tiene un comportamiento anormal?
Si bien las métricas ayudan a identificar la aparición de un comportamiento anormal, ofrecen poca comprensión de lo que salió mal. Para responder a la pregunta de por qué su aplicación tiene un comportamiento anormal, debe recopilar información adicional a través de rastreos. Por ejemplo, los perfiles de CPU recopilados mediante trazas pueden ayudarlo a determinar la ruta activa en su código.
Traza
Los rastreos son registros de eventos discretos con fecha y hora fijos. Las trazas contienen un contexto local que le permite determinar mejor el destino del sistema. Tradicionalmente, .NET Framework (y marcos como ASP.NET) generaban rastros de diagnóstico sobre sus componentes internos mediante Event Tracing for Windows (ETW). En .NET Core, estos rastros se registraron en ETW para Windows y LTTng para Linux.
dotnet-traceEn la versión 3.0-preview5, cada aplicación .NET Core abre un canal dúplex llamado EventPipe (un socket de dominio Unix en * nix o una canalización con nombre en Windows) a través del cual puede enviar eventos. Mientras todavía estamos trabajando en el protocolo del controlador, dotnet-trace implementa una versión preliminar de este protocolo.
Puede instalar esta herramienta ejecutando el siguiente comando
dotnet tool install --global dotnet-trace--version 1.0.3-preview5.19251.2

En el ejemplo anterior, ejecuto un seguimiento de dotnet con un perfil predeterminado que incluye eventos de perfil de CPU y eventos de tiempo de ejecución .NET.
Además de los eventos predeterminados, puede habilitar
proveedores adicionales en función del estudio que está intentando realizar.
Como resultado de ejecutar dotnet trace, obtienes un archivo .netperf. Este archivo contiene eventos de recuperación de pila de CPU y tiempo de ejecución que se pueden visualizar en
perfview . La próxima actualización de Visual Studio (16.1) también agregará soporte para visualizar estos rastros.

Si está ejecutando OS X o Linux, puede convertir archivos .netperf a archivos .speedscope.json que se pueden representar con
Veloccope.app al grabar trazas
.Puede convertir una traza existente ejecutando el siguiente comando:
dotnet trace convert <input-netperf-file>
La imagen a continuación muestra un diagrama que visualiza el rastro que acabamos de recibir.

Para obtener instrucciones detalladas sobre cómo usar esta herramienta, consulte el
archivo Léame . Para conocer las limitaciones conocidas de dotnet-trace, observe
los problemas abiertos en GitHub .
¿Por qué se bloquea mi aplicación?
En algunos casos, no es posible establecer la causa del comportamiento anormal simplemente monitoreando el proceso. En el caso de una falla del proceso o situaciones en las que necesitemos información adicional, como el acceso a todo el montón del proceso, un volcado del proceso puede ser más adecuado para el análisis.
Análisis de volcado
Un volcado es un registro del estado de la memoria virtual de trabajo de un proceso, generalmente capturado cuando finalizó inesperadamente. Los diagnósticos de volcado del kernel se usan comúnmente para identificar las causas de los bloqueos de la aplicación o el comportamiento inesperado.
Tradicionalmente, confiaba en su sistema operativo para recibir un volcado cuando una aplicación se bloqueaba (por ejemplo, informes de error de Windows) o utilizaba una herramienta como
procdump para capturar un volcado cuando se cumplían ciertos criterios de inicio.
Hasta ahora, el problema con el volcado de volcado usando .NET en Linux ha sido que el volcado de volcado usando gcore o el depurador ha llevado a volcados muy grandes, porque las herramientas existentes no sabían qué páginas de memoria virtual recortar en el proceso .NET Core.
Además, fue difícil analizar estos volcados incluso después de haberlos recopilado, porque tenía que comprar un depurador y configurarlo para cargar sos, una extensión del depurador para .NET.
dotnet-dumpEn 3.0.0-preview5, presentamos una nueva herramienta que le permite recopilar y analizar volcados de procesos tanto en Windows como en Linux.
dotnet-dump todavía está en desarrollo activo, y la tabla a continuación muestra qué características son compatibles actualmente en qué sistemas operativos.

Puede instalar esta herramienta ejecutando el siguiente comando
dotnet tool install --global dotnet-dump --version 1.0.3-preview5.19251.2
Después de haber instalado dotnet-dump, puede capturar el volcado del proceso ejecutando el siguiente comando
sudo $HOME/.dotnet/tools/dotnet-dump collect -p <pid>
En Linux, el volcado resultante se puede analizar cargando el volcado resultante con el siguiente comando
dotnet dump analyze <dump-name>
En el siguiente ejemplo, estoy tratando de definir un volcado de ASP.NET Core Hosting Environment

Para obtener instrucciones detalladas sobre cómo usar esta herramienta, consulte el
archivo Léame. Para conocer las limitaciones conocidas con dotnet-dump, observe
los problemas abiertos en GitHub .
Conclusión
Gracias por probar las nuevas herramientas de diagnóstico en .NET Core 3.0. Continúa enviándonos comentarios, ya sea en los comentarios o en
GitHub . Escuchamos atentamente y haremos cambios basados en sus comentarios.