Análisis del rendimiento mediante la generación de perfiles de CPU en el Generador de perfiles de rendimiento (C#, Visual Basic, C++, F#)

Una buena forma de comenzar a investigar los problemas de rendimiento de la aplicación es entender el uso de CPU mediante un generador de perfiles de CPU. La herramienta de rendimiento Uso de CPU muestra el tiempo de CPU y el porcentaje dedicado a ejecutar código en C++, C#, y Visual Basic.

La herramienta de uso de CPU puede ayudarle a:

  • Diagnosticar una ralentización o un bloqueo de proceso en el código base del equipo. La herramienta puede ayudarle a diagnosticar el problema con el código de producción del equipo. La herramienta proporciona información automática y varias vistas de los datos para poder analizar y diagnosticar problemas de rendimiento.

  • Identifique problemas de rendimiento en escenarios de DevOps, como cuando un cliente informa de que algunas solicitudes o pedidos no llegan al sitio web del minorista durante la temporada alta. A menudo, los problemas están en el entorno de producción y es difícil depurarlos en ese momento, pero esta herramienta puede ayudarle a capturar suficiente información y evidencias del problema. Después de recopilar un archivo de seguimiento, el análisis puede ayudarle a comprender rápidamente las posibles causas y proporcionarle sugerencias en el contexto del código para que pueda corregir el problema.

  • Si el problema de latencia no se sitúa dentro de una solicitud de API, puede comprobar si hay un uso elevado de la CPU y otros problemas relacionados con la herramienta Uso de CPU. La herramienta Uso de CPU puede ayudarle a identificar cuellos de botella para que pueda determinar dónde debe optimizar.

La herramienta Uso de CPU es útil tanto para las sesiones de seguimiento locales como para el entorno de producción. La herramienta de uso de CPU también se puede iniciar mediante la selección del método abreviado de teclado Alt+F2 y, a continuación, de Uso de CPU, o bien mediante la apertura de un seguimiento ya recopilado con una herramienta como dotnet-trace o dotnet-monitor. (Para el código de producción de .NET, esta es probablemente la forma en que se recopilarían los seguimientos).

La herramienta Uso de CPU puede ejecutarse en un proyecto de Visual Studio abierto, en una aplicación instalada de Microsoft Store, o conectarse a una aplicación o un proceso en ejecución. Puede ejecutar la herramienta Uso de CPU con o sin depuración. Para obtener más información, vea Ejecutar herramientas de generación de perfiles con o sin el depurador.

En las siguientes instrucciones se muestra cómo usar la herramienta Uso de CPU sin el depurador, mediante el Generador de perfiles de rendimiento de Visual Studio. Los ejemplos usan una compilación de versión en un equipo local. Las compilaciones de versión proporcionan la mejor vista de rendimiento de la aplicación real. Para ver un tutorial que muestra cómo mejorar el rendimiento mediante la herramienta de Uso de CPU, consulte la Guía para principiantes para optimizar el código.

Por lo general, el equipo local replica mejor la ejecución de aplicaciones instaladas. Para recopilar datos de un dispositivo remoto, ejecute la aplicación directamente en el dispositivo en lugar de en una Conexión a Escritorio remoto.

Recopilación de datos de uso de CPU

  1. En el proyecto de Visual Studio, establezca la configuración de la solución en Versión y seleccione Depurador local de Windows (o Equipo local) como el destino de implementación.

    Captura de pantalla que muestra Seleccionar versión y Máquina local.

    Captura de pantalla que muestra Seleccionar versión y Máquina local.

  2. Seleccione Depurar>Generador de perfiles de rendimiento.

  3. En Herramientas disponibles seleccione Uso de CPUy después Iniciar.

    Captura de pantalla que muestra Seleccionar uso de CPU.

    Captura de pantalla que muestra Seleccionar uso de CPU.

    Si habilita la opción Iniciar con la recopilación en pausa antes de iniciar el generador de perfiles, los datos no se recopilarán hasta que seleccione el botón Grabar en la vista de sesión de diagnóstico.

    Nota:

    Para obtener más información sobre cómo aumentar la eficacia de la herramienta, consulte el artículo sobre cómo optimizar la configuración del generador de perfiles.

  4. Después de que se inicie la aplicación, comienza la sesión de diagnóstico y muestra datos de uso de CPU. Cuando haya terminado de recopilar datos, haga clic en Detener recopilación.

    Captura de pantalla que muestra la Detención de la recopilación de datos de uso de CPU.

    Captura de pantalla que muestra la Detención de la recopilación de datos de uso de CPU.

    La herramienta Uso de CPU analiza y muestra el informe. Si tiene problemas para recopilar o mostrar datos, consulte Solución de problemas en la generación de perfiles y corrección de problemas.

    Captura de pantalla que muestra el informe uso de CPU.

    Captura de pantalla que muestra el informe uso de CPU.

    Use la lista desplegable Filtro para seleccionar o anular la selección de subprocesos para mostrar, y use el cuadro Búsqueda para buscar un subproceso o un nodo concreto.

Columnas de datos de uso de CPU

Nombre Descripción
Total de CPU [unidad, porcentaje] % total de ecuación de datos

Los milisegundos y el porcentaje de CPU que usaron las llamadas a la función y las funciones llamadas por la función en el intervalo de tiempo seleccionado. Esto no es lo mismo que el gráfico de línea cronológica Utilización de CPU, que compara la actividad total de CPU en un intervalo de tiempo con el total de CPU disponible.
CPU propia [unidad, porcentaje] % de autoecuación

Los milisegundos y el porcentaje de CPU que usaron las llamadas a la función en el intervalo de tiempo seleccionado, sin incluir las funciones llamadas por la función.
Módulo En algunas vistas se muestra la columna Módulo, que indica el nombre del módulo que contiene la función.

Análisis de la información de CPU

Para analizar las conclusiones destacadas, las principales funciones y la ruta de acceso activa, consulte Información de CPU.

Análisis del uso de CPU

Para analizar el informe de Uso de CPU, haga clic en Abrir detalles o en una de las funciones principales para abrir la vista Funciones.

El informe proporciona distintas vistas de los datos de diagnóstico:

  • Llamador o destinatario
  • Árbol de llamadas
  • Módulos
  • Functions
  • Grafo de llamas

Para analizar el informe, haga clic en Crear informe detallado.

El informe proporciona distintas vistas de los datos de diagnóstico:

  • Llamador o destinatario
  • Árbol de llamadas

En todas las vistas excepto llamador o destinatario, el informe de diagnóstico se ordena por Total de CPU, de mayor a menor. Puede cambiar el criterio de ordenación o la columna de ordenación seleccionando los encabezados de columna. Puede hacer doble clic en una función que le interese y verá el origen de la función, así como el resaltado que muestra dónde se invierte el tiempo en esa función. En la tabla se muestran columnas con datos como el tiempo empleado en la función, incluidas las funciones llamadas(CPU total) y una segunda columna que muestra el tiempo empleado en una función, excepto las funciones llamadas(Propio CPU).

Estos datos pueden ayudarle a evaluar si la función en sí es un cuello de botella de rendimiento. Determine cuántos datos muestra el método para ver si el código de terceros o las bibliotecas en tiempo de ejecución son el motivo de que los puntos de conexión sean lentos o consuman recursos intensivamente.

Para obtener más información sobre el uso del gráfico de llamas, consulte Identificación de rutas de acceso activas con el gráfico de llamas.

Árbol de llamadas de Uso de CPU

Para ver el árbol de llamadas, seleccione el nodo primario en el informe. De forma predeterminada, la página Uso de CPU se abre en la vista Llamador y destinatario. En la lista desplegable Vista actual seleccione Árbol de llamadas.

Puede hacer clic en los botones Expandir ruta de acceso activa y Mostrar ruta de acceso activa para ver las llamadas de función que usan el porcentaje más alto de CPU en la vista de árbol de las llamadas.

Estructura del árbol de llamadas

Captura de pantalla que muestra la estructura del árbol de llamadas.

Captura de pantalla que muestra la estructura del árbol de llamadas.

Imagen Descripción
Paso 1 El nodo de nivel superior de los árboles de llamadas de Uso de CPU es un pseudonodo.
Paso 2 En la mayoría de las aplicaciones, cuando se desactiva la opción Mostrar código externo, el nodo de segundo nivel es un nodo [Código externo] . El nodo contiene el código del sistema y del marco que inicia y detiene la aplicación, dibuja la interfaz de usuario, controla la programación de subprocesos y ofrece otros servicios de bajo nivel a la aplicación.
Paso 3 Los elementos secundarios del nodo de segundo nivel son los métodos de código de usuario y las rutinas asíncronas llamados o creados por el sistema de segundo nivel y el código de Framework.
Paso 4 Los nodos secundarios de un método contienen datos únicamente de las llamadas del método principal. Cuando está deshabilitada la opción Mostrar código externo , los métodos de aplicación también pueden contener un nodo [Código externo] .

Código externo

Las funciones del sistema y del marco que ejecuta el código se llaman código externo. Las funciones de código externo inician y detienen la aplicación, dibujan la interfaz de usuario, controlan los subprocesos y proporcionan otros servicios de bajo nivel a la aplicación. En la mayoría de los casos no le interesará el código externo, por lo que el árbol de llamadas de Uso de CPU reúne las funciones externas de un método de usuario en un nodo [Código externo] .

Para ver las rutas de llamadas de código externo, cambie la vista actual a la vista Árbol de llamadas o haga clic con el botón derecho y seleccione Ver en árbol de llamadas.

Captura de pantalla que muestra Mostrar en el árbol de llamadas.

Para ver las rutas de llamada de código externo, en la página de informe de diagnóstico principal (panel derecho), seleccione Mostrar código externo en la lista desplegable Filtro y después haga clic en Aplicar. Después, la vista Árbol de llamadas de la página Uso de CPU expande las llamadas a código externo. (La lista desplegable Filtro está disponible en la página principal de diagnóstico, no en las vistas detalladas).

Captura de pantalla que muestra Mostrar código externo.

Muchas cadenas de llamadas de código externo están profundamente anidadas, así que el ancho de la cadena puede superar el ancho de pantalla de la columna Nombre de la función. A continuación, los nombres de función aparecen como se muestra en la imagen siguiente.

Captura de pantalla que muestra el código externo anidado en el árbol de llamadas.

Muchas cadenas de llamadas de código externo están profundamente anidadas, así que el ancho de la cadena puede superar el ancho de pantalla de la columna Nombre de la función. Los nombres de función aparecen como ... .

Captura de pantalla que muestra el código externo anidado en el árbol de llamadas.

Para encontrar un nombre de función que está buscando, use el cuadro de búsqueda. Mantenga el mouse sobre la línea seleccionada o use la barra de desplazamiento horizontal para ver los datos.

Captura de pantalla que muestra la búsqueda de código externo anidado.

Captura de pantalla que muestra la búsqueda de código externo anidado.

Funciones asincrónicas en el árbol de llamadas de Uso de CPU

Cuando el compilador encuentra un método asincrónico, crea una clase oculta para controlar la ejecución del método. Conceptualmente, la clase es una máquina de estados. La clase tiene funciones generadas por el compilador que llaman asincrónicamente a los métodos originales, las devoluciones de llamada, el programador y los iteradores necesarios para ejecutarlos. Cuando un método principal llama al método original, el compilador quita al método del contexto de ejecución del elemento principal y ejecuta los métodos de la clase oculta en el contexto del código del sistema y Framework que controla la ejecución de la aplicación. A menudo, aunque no siempre, los métodos asincrónicos se ejecutan en uno o varios subprocesos diferentes. Este código aparece en el árbol de llamadas de Uso de CPU como elementos secundarios del nodo [Código externo] que se encuentra justo debajo del nodo superior del árbol.

En el siguiente ejemplo, los dos primeros nodos bajo [Código externo] son los métodos generados por el compilador de la clase de la máquina de estados. El tercer nodo es la llamada al método original.

Captura de pantalla que muestra el nodo asincrónico.

Expanda los métodos generados para mostrar lo que está sucediendo:

Captura de pantalla que muestra el nodo asincrónico expandido.

Captura de pantalla que muestra el nodo asincrónico expandido.

  • MainPage::GetMaxNumberAsyncButton_Click solo administra una lista de valores de la tarea, calcula el valor máximo de los resultados y muestra el resultado.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext muestra la actividad necesaria para programar e iniciar las 48 tareas que incluyen la llamada en GetNumberAsync.

  • MainPage::<GetNumberAsync>b__b muestra la actividad de las tareas que llaman a GetNumber.

Recopilación de recuentos de llamadas (.NET)

Si desea ver los recuentos de llamadas en la vista Funciones, puede habilitar el valor antes de iniciar el generador de perfiles. Esta configuración es compatible con los tipos de proyecto de .NET y requiere iniciar el proceso en el generador de perfiles. No se admite el escenario de asociación.

  1. Seleccione el icono Configuración de Uso de CPU en el Generador de perfiles de rendimiento.

    Captura de pantalla en la que se muestra el icono de configuración de Uso de CPU.

  2. Habilite la opción Recopilar recuentos de llamadas (solo .NET).

    Captura de pantalla en la que se muestra la configuración de Uso de CPU.

  3. Recopile los datos de uso de la CPU.

  4. Abra la vista Funciones y asegúrese de que la columna Recuento de llamadas esté establecida como visible.

    Si no ve la columna, haga clic con el botón derecho en un encabezado de columna para elegir columnas visibles.

    Captura de pantalla en la que se muestran los datos de los recuentos de llamadas.