Share via


Vista de subprocesos (rendimiento paralelo)

Esta es la vista más detallada y con mayor número de características del visualizador de simultaneidad. Con esta vista, puede identificar si los subprocesos se están ejecutando o se bloquean debido a la sincronización, a E/S o a algún otro motivo.

Durante el análisis de perfiles, el visualizador de simultaneidad examina todos los eventos de cambio de contexto del sistema operativo para cada subproceso de la aplicación. Los cambios de contexto se pueden producir por muchos motivos, por ejemplo:

  • Un subproceso se bloquea en una primitiva de sincronización.

  • El cuanto de un subproceso expira.

  • Un subproceso realiza una solicitud de E/S que provoca un bloqueo.

La Vista de subprocesos asigna una categoría a cada cambio de contexto cuando un subproceso deja de ejecutarse. Las categorías se muestran en la leyenda del área inferior izquierda de la vista y se explican en sus temas de Ayuda correspondientes. La categorización de eventos de cambio de contexto se logra buscando las API que se sabe que provocan bloqueos en la pila de llamadas del subproceso. En caso de no encontrar una coincidencia de pila de llamadas, utilizamos la razón de espera que proporciona Windows. Aunque es técnicamente correcto, la categoría Windows puede estar basada en un detalle de la implementación, en lugar de en la expectativa o intención de los usuarios. Un ejemplo de esto es que Windows notificará el bloqueo en un bloqueo de lectura-escritura nativo como E/S en lugar de la sincronización. Sin embargo, en estos casos debe poder identificar la causa principal de un evento de bloqueo examinando las pilas de llamadas que se corresponden con los eventos de cambio de contexto.

La Vista de subprocesos también muestra las dependencias entre subprocesos. Por ejemplo, si identifica un subproceso bloqueado en un objeto de sincronización, la herramienta suele poder mostrar el subproceso que lo desbloqueó junto con lo que dicho subproceso estaba haciendo en ese momento mostrando la pila de llamadas cuando desbloqueó el subproceso de interés.

Por último, cuando se están ejecutando subprocesos, la herramienta recopila muestras para poder analizar qué código ejecutan uno o varios subprocesos durante un segmento de ejecución. Además de proporcionar visibilidad basada en muestras para la ejecución del subproceso, esta vista también proporciona informes de generación de perfiles de ejecución del árbol de pila de llamadas e informes de bloqueo.

Uso

La Vista de subprocesos está pensada para diferentes fines. A continuación se exponen algunos casos habituales:

  • Identificar las razones por las que la interfaz de usuario de una aplicación no responde durante ciertas fases de ejecución.

  • Identificar la cantidad de tiempo dedicado al bloqueo en la sincronización, E/S, errores de página, etc.

  • Identificar el grado de interferencia con otros procesos que se ejecutan en el sistema.

  • Identificar problemas de equilibrio de carga de la ejecución en paralelo.

  • Identificar las razones que explican una escalabilidad poco óptima o una falta completa de escalabilidad (por ejemplo, la razón por la que no mejora el rendimiento de una aplicación paralela cuando hay disponibles en el sistema más núcleos lógicos).

  • Entender el grado de simultaneidad de la aplicación como ayuda para la paralelización.

  • Entender las dependencias entre los subprocesos de trabajo y las rutas críticas de ejecución.

En el resto de esta sección se explica un modelo de uso recomendado para que su experiencia resulte más productiva en esta vista. En primer lugar se recomienda usar la Vista de utilización de la CPU para centrar la atención en una fase concreta de ejecución del proceso que resulta de interés. Puede aprovechar Compatibilidad con el marcador de escenario de la aplicación para ayudar en este proceso. Después de acercar una ventana de tiempo de ejecución de interés, puede seleccionar la Vista de subprocesos.

Identificar y restringir un área de interés

En la Vista de subprocesos, aparecerá una vista de escala de tiempo que muestra tiempo en el eje X. En el eje Y se ven dos canales E/S, uno para las lecturas y el otro para las escrituras, para cada dispositivo de disco físico del sistema con actividad durante la recolección de perfiles. Debajo de los canales de disco verá un canal para cada subproceso del proceso. Inicialmente, los subprocesos se clasifican por orden de creación, lo que significa que el subproceso de la aplicación principal es el primero. Puede utilizar la opción de ordenación de la esquina superior izquierda de la vista para ordenar los subprocesos en función de otro criterio, por ejemplo, los subprocesos que realizan más trabajo de ejecución.

Después, puede ocultar los subprocesos que no están realizando ningún trabajo de interés; para ello, seleccione sus nombres en la columna de la izquierda y haga clic en el icono Ocultar subprocesos de la barra de herramientas. Este tipo de subproceso puede existir por muchas razones. Por ejemplo, pueden ser subprocesos de un grupo de subprocesos inactivo. Normalmente, estos subprocesos se bloquean completamente (debido a la sincronización). Deber quitarlos de la vista porque sus estadísticas pueden contaminar los informes con información irrelevante.

Puede usar el informe de la pestaña de desglose de ejecución para identificar otros subprocesos que se pueden ocultar. Para ver el gráfico de desglose de la ejecución, haga clic en Resumen por subproceso en la leyenda activa. Este gráfico muestra el desglose de estados de subproceso de los subprocesos de la aplicación en la ventana de tiempo actualmente visible. Para admitir escalabilidad en ese gráfico, se limita el número de subprocesos mostrado, de modo que en ciertos casos el gráfico no muestra los datos de todos los subprocesos de la aplicación. Cuando esto ocurre, se muestran puntos suspensivos en el extremo derecho.

Ahora que ha restringido el análisis a una región de interés y ha seleccionado los subprocesos que desea, puede iniciar el análisis de rendimiento. En las secciones siguientes se describen las diferentes herramientas de que dispone.

Detalles del bloqueo de subprocesos

Para entender las razones subyacentes de las regiones de bloqueo de subprocesos, mantenga el mouse sobre una de estas regiones o seleccione una de ellas (haciendo clic). Al detener el mouse sobre una región de bloqueo, se muestra información sobre herramientas acerca del evento, como la categoría, una API de bloqueo si está disponible, la hora de inicio de la región y la duración del bloqueo. En la categoría de adelantamiento, también se muestran el identificador de proceso y el identificador de subproceso del proceso programado en la CPU cuando el kernel detuvo el subproceso. También puede seleccionar una región de bloqueo en un canal de interés, lo que hace que se muestre la pila actual en la ventana inferior. Además de los datos que muestra la información sobre herramientas, la pestaña Pila actual indicará la pila de llamadas que produjo el bloqueo del subproceso. Al examinar la pila de llamadas, puede determinar la razón subyacente del evento de bloqueo del subproceso. De forma predeterminada, en esta vista se muestran las pilas de llamadas completas, incluidas las pilas de usuario y de kernel. Cuando la herramienta puede identificar una determinada API como responsable, la pila de llamadas se recorta después de ese marco. Si la herramienta no puede determinar la llamada a la función raíz que produjo el bloqueo, se expone la pila de llamadas completa para que el usuario pueda examinarla y llegar a una conclusión.

A menudo, una ruta de ejecución genera varios eventos de bloqueo. Por otra parte, también resulta útil por lo general comprender los retrasos de bloqueo acumulados organizados por las pilas de llamadas. Por este motivo, se proporciona un informe de perfil basado en el árbol de llamadas para cada categoría de bloqueo. Puede ver el perfil si selecciona una de las entradas de leyenda de categoría de bloqueo de la izquierda. Estos informes proporcionan un método rápido para determinar dónde debe dedicar tiempo para mejorar el rendimiento de la aplicación.

Dependencias entre subprocesos

El visualizador de simultaneidad muestra las dependencias entre los subprocesos que producen bloqueos dentro de su proceso. Para determinar qué acciones de un subproceso desbloquearon un subproceso de interés, haga clic en el segmento de bloqueo pertinente. Si la herramienta puede determinar el subproceso que produjo el desbloqueo, dibuja una línea que conecta el segmento de ejecución que sigue al segmento de bloqueo con el otro subproceso. Esa línea muestra cómo un subproceso diferente desbloqueó el subproceso seleccionado. Además, la pestaña Pila de desbloqueo se rellena con la pila de llamadas pertinente. Así, puede identificar rápidamente un subproceso bloqueado, obtener información sobre lo que estaba intentando hacer y ver lo que finalmente permitió su ejecución.

Detalles de ejecución del subproceso

A menudo resulta útil determinar el código que ejecutan los subprocesos cuando la aplicación se está ejecutando. Estas regiones se muestran como segmentos verdes en el gráfico de escala de tiempo. Dos características ayudan con esto.

En primer lugar, al hacer clic en un segmento de ejecución de la escala de tiempo, se intenta localizar la pila de llamadas del perfil de muestra más próximo. Cuando se consigue, se muestra un símbolo de intercalación negro sobre la ubicación del bloque de ejecución donde se tomó la muestra y aparece la propia pila de llamadas en la pestaña Pila actual. Puede seleccionar otras muestras si hace clic en otras ubicaciones de los segmentos de ejecución. De vez en cuando quizá no podamos encontrar un ejemplo. Por lo general, se debe a los períodos de 1 ms en que se recopilan los perfiles de muestra. Por ejemplo, cuando un segmento de ejecución tiene una duración inferior a un milisegundo, es posible que no se recopile ninguna pila de llamadas. No se puede modificar la frecuencia de muestreo, pero un milisegundo es un buen equilibrio entre precisión y sobrecarga de la ejecución.

En segundo lugar, el informe de perfiles de muestreo de ejecución con su vista de árbol de llamadas es una característica importante que puede ayudar a comprender dónde transcurre el tiempo de ejecución. Para tener acceso a esta característica puede hacer clic en el elemento Ejecución en la leyenda activa. El perfil de ejecución proporciona un informe de ejemplo para todos los subprocesos habilitados (no ocultos) en la vista actual filtrados por el intervalo de tiempo de la ventana.

Gráfico de escala de tiempo

El gráfico de escala de tiempo muestra la actividad de todos los subprocesos del proceso y todos los dispositivos de disco físicos del equipo host. Puede acercar la línea de tiempo si hace clic y arrastra el puntero del mouse, si usa el control deslizante de zoom de la barra de herramientas de la ventana o si mantiene presionada la tecla CTRL mientras hace girar la rueda del mouse. Mantenga el mouse sobre una de las barras horizontales, o segmentos, para ver la categoría, la hora de inicio y la duración de dicho punto en el subproceso. Haga clic en uno de los segmentos para ver la pila de llamadas en la parte inferior de la pantalla en la pestaña Pila actual.

En el gráfico de escala de tiempo, el color indica el estado de un subproceso en un momento determinado. Por ejemplo, los segmentos verdes se están ejecutando, los segmentos rojos están bloqueados para sincronización, los segmentos amarillos se han adelantado y los segmentos púrpura están dedicados a la E/S del dispositivo. Esta vista es útil para examinar el equilibro de trabajo de un grupo de subprocesos que intervienen en un bucle paralelo o en tareas simultáneas. Si uno o más de los subprocesos tarda mucho más tiempo en completarse que los otros, esto puede indicar una carga de trabajo desequilibrada y una oportunidad para mejorar el rendimiento del programa mediante una distribución más uniforme del trabajo entre los subprocesos.

Puede utilizar también el gráfico de escala de tiempo para examinar las dependencias entre subprocesos y las relaciones temporales entre los subprocesos que bloquean y los bloqueados. Puede ver cuántos subprocesos se están ejecutando en un momento dado si observa el segmento vertical en dicho punto de la escala de tiempo. Si solo existe un subproceso verde (en ejecución) en ese momento, la aplicación no está aprovechando al máximo la simultaneidad disponible en el sistema. En la barra de herramientas, puede hacer clic en los botones arriba y abajo para ordenar, subir o bajar subprocesos individuales, o puede usar el botón Ocultar subprocesos para ocultar los subprocesos que no son de interés.

Informes de perfil

Debajo del gráfico de escala de tiempo se muestra una ventana de leyenda activa con pestañas que dispone de los siguientes informes. Los informes de perfil se actualizan automáticamente cuando la vista de subprocesos se modifica haciendo zoom, desplazándose, ocultando o mostrando los subprocesos. Para seguimientos mayores, la ventana de informes se deshabilitará mientras se calculan los informes actualizados. Para cada informe, hay dos ajustes de filtro: Reducción de nodos irrelevantes y Solo mi código. La reducción de nodos irrelevantes ayuda a ocultar las entradas del árbol de llamadas de poco interés en la que apenas transcurre tiempo. El valor predeterminado es 2%, pero se puede ajustar en cualquier valor de 0% a 99%. La casilla Solo mi código permite ocultar o ver las entradas del árbol de llamadas distintas de las suyas propias. Los informes disponibles se detallan en la siguiente sección.

Informe de perfil

Se puede tener acceso al informe de perfil actual a través de esta pestaña. Al hacer clic en una entrada de la leyenda activa se determina el informe de perfil que se muestra. A continuación se enumeran los informes de perfil disponibles, comenzando por Ejecución.

Pila actual

Esta pestaña muestra las pilas de llamadas de un segmento de subproceso seleccionado en el gráfico de detalles. Las pilas de llamadas se recortan para centrarse en la actividad directamente relacionada con el programa. Dentro de la ventana de selección, la información del subproceso actualmente en ejecución resulta inmediatamente visible.

Pila de desbloqueo

Haga clic en Pila de desbloqueo para ver qué subproceso desbloqueó este y en qué línea de código.

Execution

El informe de perfil de ejecución muestra una tabla detallada con el porcentaje de tiempo transcurrido en los diferentes estados de cada subproceso, como ejecución, E/S y administración de memoria.

Haga clic en el control de árbol situado junto a una entrada del árbol de llamadas que le interese para explorar en profundidad y buscar la línea de código donde transcurre el tiempo de ejecución. Una vez identificada una entrada del árbol de llamadas que sea de interés, haga clic con el botón secundario en dicha entrada para obtener un menú contextual con las opciones Ver código fuente y Ver sitios de llamada. Al hacer clic en Ver código fuente, se localiza la línea de origen y al hacer clic en Ver sitios de llamada, se localiza la línea de código que llamó a esta línea. Si solo hay un sitio de llamada, el clic ubica la línea resaltada de código para el sitio de llamada. Si hay varios sitios de llamada, se muestra un cuadro de diálogo en el que se puede seleccionar una entrada. Al hacer clic en el botón Ir a código fuente, ubica el sitio de llamada resaltado. Suele ser más útil seleccionar y ubicar el código fuente para el sitio de llamada que tiene más instancias, más tiempo o ambos. Para obtener más información, vea Informe del perfil de ejecución.

Sincronización

El informe de sincronización muestra las llamadas responsables de los bloques de sincronización, junto con los tiempos de bloqueo agregados de cada pila de llamadas. Puede usar esta información para identificar e investigar las áreas que pueden verse afectadas.

Haga clic en el control de árbol situado junto a la entrada del árbol de llamadas que le interese para explorar en profundidad y buscar la línea de código donde transcurre el tiempo de sincronización. Una vez identificada una entrada del árbol de llamadas que sea de interés, haga clic con el botón secundario en dicha entrada para obtener un menú contextual con las opciones Ver código fuente y Ver sitios de llamada. Al hacer clic en Ver código fuente, se localiza la línea de origen y al hacer clic en Ver sitios de llamada, se localiza la línea de código que llamó a esta línea. Si solo hay un sitio de llamada, el clic conecta con la línea resaltada de código para el sitio de llamada. Si hay varios sitios de llamada, se muestra un cuadro de diálogo en el que se puede seleccionar una entrada. Al hacer clic en el botón Ir a código fuente se localiza el sitio de llamada resaltado. Suele ser más útil seleccionar y conectarse al origen del sitio de llamada que tiene más instancias, más tiempo o ambos. Para obtener más información, vea Hora de sincronización.

E/S

El informe de E/S muestra las llamadas responsables de los bloques de E/S, junto con los tiempos de bloqueo agregados de cada pila de llamadas. Puede usar esta información para identificar e investigar las áreas que pueden verse afectadas.

Haga clic en el control de árbol situado junto a la pila de llamadas que le interese para explorar en profundidad y buscar la línea de código donde transcurre el tiempo de E/S. Una vez identificada una entrada del árbol de llamadas que sea de interés, haga clic con el botón secundario en dicha entrada para obtener un menú contextual con las opciones Ver código fuente y Ver sitios de llamada. Al hacer clic en Ver código fuente, se localiza la línea de origen y al hacer clic en Ver sitios de llamada, se localiza la línea de código que llamó a esta línea. Si solo hay un sitio de llamada, el clic conecta con la línea resaltada de código para el sitio de llamada. Si hay varios sitios de llamada, se muestra un cuadro de diálogo en el que se puede seleccionar una entrada. Al hacer clic en el botón Ir a código fuente, ubica el sitio de llamada resaltado. Suele ser más útil seleccionar y conectarse al origen del sitio de llamada que tiene más instancias, más tiempo o ambos. Para obtener más información, vea Tiempo de E/S (Vista de subprocesos).

Sleep

El informe en suspensión (Sleep) muestra las llamadas responsables de los bloques en suspensión junto con los tiempos de bloqueo agregados de cada pila de llamadas. Puede usar esta información para identificar e investigar las áreas que pueden verse afectadas.

Haga clic en el control de árbol situado junto a la pila de llamadas que le interese para explorar en profundidad y buscar la línea de código donde transcurre el tiempo de suspensión. Una vez identificada una entrada del árbol de llamadas que sea de interés, haga clic con el botón secundario en dicha entrada para obtener un menú contextual con las opciones Ver código fuente y Ver sitios de llamada. Al hacer clic en Ver código fuente, se localiza la línea de origen y al hacer clic en Ver sitios de llamada, se localiza la línea de código que llamó a esta línea. Si solo hay un sitio de llamada disponible, el clic conecta con la línea resaltada de código para el sitio de llamada. Si hay varios sitios de llamada disponibles, se presenta un cuadro de diálogo en el que se selecciona una entrada. Al hacer clic en el botón Ir a código fuente se localiza el sitio de llamada resaltado. Suele ser más útil seleccionar y conectarse al origen del sitio de llamada que tiene más instancias, más tiempo o ambos. Para obtener más información, vea Tiempo de suspensión.

Paginación

El informe de paginación muestra las llamadas donde se produjeron bloqueos de adelantamiento, junto con los tiempos de bloqueo agregados de cada pila de llamadas. Puede usar esta información para identificar e investigar las áreas que pueden verse afectadas. Este informe de bloqueo es menos procesable que los otros porque, normalmente, el adelantamiento es impuesto en el proceso por el sistema operativo en lugar de por el código. Muestra los tipos de adelantamientos que ocurrieron, dónde tuvieron lugar y durante cuánto tiempo permaneció el proceso en el estado de adelantamiento especificado.

Haga clic en el control de árbol situado junto a la entrada del árbol de llamadas que le interese para explorar en profundidad y buscar la línea de código donde transcurrió el tiempo de adelantamiento. Una vez identificada una entrada del árbol de llamadas que sea de interés, haga clic con el botón secundario en dicha entrada para obtener un menú contextual con las opciones Ver código fuente y Ver sitios de llamada. Si se hace clic en Ver código fuente se navega a la línea de código fuente, mientras que si se hace clic en Ver sitios de llamada, la navegación se dirige a la línea de código que llamó a la actual. Si hay solamente un sitio de llamada disponible, el clic lleva directamente a la línea de código resaltada para el sitio de llamada. Si hay varios sitios de llamada disponibles, se presenta un cuadro de diálogo en el que se selecciona una entrada. Al hacer clic en el botón Ir a código fuente se localiza el sitio de llamada resaltado. Suele ser más útil seleccionar y conectarse al origen del sitio de llamada que tiene más instancias, más tiempo o ambos. Para obtener más información, vea Tiempo de administración de la memoria.

Adelantamiento

El informe de paginación muestra las llamadas donde se produjeron bloqueos de adelantamiento, junto con los tiempos de bloqueo agregados de cada pila de llamadas. Puede usar esta información para identificar e investigar las áreas que pueden verse afectadas. Este informe de bloqueo es menos procesable que los otros porque, normalmente, el adelantamiento es impuesto en el proceso por el sistema operativo en lugar de por el código. Muestra los tipos de adelantamientos que ocurrieron, dónde tuvieron lugar y durante cuánto tiempo permaneció el proceso en el estado de adelantamiento especificado.

Haga clic en el control de árbol situado junto a la pila de llamadas que le interese para explorar en profundidad y buscar la línea de código donde transcurrió el tiempo de adelantamiento. Una vez identificada una entrada del árbol de llamadas que sea de interés, haga clic con el botón secundario en dicha entrada para obtener un menú contextual con las opciones Ver código fuente y Ver sitios de llamada. Si se hace clic en Ver código fuente se navega a la línea de código fuente, mientras que si se hace clic en Ver sitio de llamada, la navegación se dirige a la línea de código que llamó a la actual. Si hay solamente un sitio de llamada disponible, el clic lleva directamente a la línea de código resaltada para el sitio de llamada. Si hay varios sitios de llamada disponibles, se presenta un cuadro de diálogo en el que se selecciona una entrada. Al hacer clic en el botón Ir a código fuente se localiza el sitio de llamada resaltado. Suele ser más útil seleccionar y conectarse al origen del sitio de llamada con más instancias, más tiempo o ambos. Para obtener más información, vea Tiempo de adelantamiento.

Procesamiento de interfaz de usuario

El informe de procesamiento de la interfaz de usuario muestra las llamadas responsables de los bloques de procesamiento de la IU, junto con los tiempos de bloqueo agregados de cada pila de llamadas. Puede usar esta información para identificar e investigar las áreas que pueden verse afectadas.

Haga clic en el control de árbol situado junto a la entrada del árbol de llamadas que le interese para explorar en profundidad y buscar la línea de código donde transcurre el tiempo de procesamiento de la interfaz de usuario. Una vez identificada una entrada del árbol de llamadas que sea de interés, haga clic con el botón secundario en dicha entrada para obtener un menú contextual con las opciones Ver código fuente y Ver sitios de llamada. Al hacer clic en Ver código fuente, se localiza la línea de origen y al hacer clic en Ver sitios de llamada, se localiza la línea de código que llamó a esta línea. Si solo hay un sitio de llamada disponible, el clic conecta con la línea resaltada de código para el sitio de llamada. Si hay varios sitios de llamada disponibles, se presenta un cuadro de diálogo en el que se selecciona una entrada. Al hacer clic en el botón Ir a código fuente se localiza el sitio de llamada resaltado. Suele ser más útil seleccionar y conectarse al origen del sitio de llamada que tiene más instancias, más tiempo o ambos. Para obtener más información, vea Tiempo de procesamiento de la interfaz de usuario.

Resumen por subproceso

Esta pestaña muestra una vista de columna codificada con colores del tiempo total transcurrido en los estado de cada subproceso, como ejecución, bloqueo y E/S. Las columnas se etiquetan en la parte inferior. En el nivel de zoom predeterminado, el subproceso principal es la columna situada más a la izquierda. Si ajusta el nivel de zoom del gráfico de detalles, los informes de pestaña se actualizarán automáticamente para reflejar la nueva escala de tiempo. Para admitir la escalabilidad del gráfico, limitamos el número de subprocesos que se muestran. Por consiguiente, en algunos casos el gráfico no puede mostrar los datos de todos los subprocesos de la aplicación, pero indicará esta limitación mostrando elipses en la posición más a la derecha. Si no encuentra el subproceso que desea ver en este gráfico, puede ocultar los subprocesos que no le interesen hasta que el subproceso deseado aparezca en el gráfico. Para obtener más información, vea Informe de resumen por subproceso.

Operaciones en archivo

Esta pestaña muestra qué subprocesos estuvieron implicados en E/S de disco y qué archivos tocaron. Esto incluye las DLL que se cargaron, cuántos bytes se leyeron y otra información. Este informe puede resultar útil para evaluar el tiempo dedicado a obtener acceso a los archivos durante la ejecución, sobre todo si el proceso parece estar enlazado a E/S. Para obtener más información, vea Informe de operaciones de archivo (Vista de subprocesos).

Vea también

Conceptos

Visualizador de simultaneidad