Este artículo proviene de un motor de traducción automática.

Diagnóstico de subprocesos

Ajuste del rendimiento con el visualizador de concurrencia en Visual Studio 2010

Hazim Shafi

Procesadores multinúcleo se han convertido en ampliamente disponibles y rendimiento de un único subproceso en nuevos procesadores es probable que permanecen relativamente plana. Esto significa que agregó a presión en los desarrolladores de software para mejorar el rendimiento de la aplicación aprovechando las mejores ventajas de paralelismo.

Programación paralela es un desafío por muchas razones, pero en este artículo me gustaría centrarse en los aspectos de rendimiento de las aplicaciones paralelas. Aplicaciones multiproceso no sólo son propensas a orígenes comunes de ineficiencia en implementaciones secuenciales, como algoritmos ineficientes, comportamiento de caché defectuosas y E/s excesiva, sino también pueden sufrir errores de performance en paralelo. Rendimiento paralelo y la escalabilidad pueden estar limitadas por carga desequilibrio, overhead de la sincronización excesivo, serialización involuntaria o migración de subproceso.

Comprensión de dichos cuellos de botella de rendimiento que solían requerir instrumentación significativa y análisis de los desarrolladores expertos. Incluso para aquellos programadores elite, tuning del performance era un proceso tedioso y demandar mucho tiempo.

Se va a cambiar para mejor. Visual Studio 2010 incluye una nueva herramienta de generación de perfiles: el visualizador de concurrencia: que debería reducir considerablemente la carga de análisis de performance en paralelo. Además, el visualizador de concurrencia puede ayudar a los desarrolladores a analizar sus aplicaciones secuenciales para descubrir oportunidades para el paralelismo. En este artículo, presento una introducción a las características del visualizador de concurrencia en Visual Studio de 2010, junto con algunas instrucciones de uso práctico.

Utilización de la CPU

El visualizador de simultaneidad se compone de varios visualización y herramientas de generación de informes. Hay tres vistas principales: Uso de CPU, subprocesos y núcleos.

La vista Uso de CPU, que se muestra en de figura 1, está pensada para ser el punto de partida en el visualizador de concurrencia. El eje x muestra el tiempo transcurrido desde el inicio de la traza hasta el final de la actividad de la aplicación (o al final de la traza que sea anterior). El eje y muestra el número de núcleos de procesador lógico en el sistema.


Figura 1 de ver el uso de CPU

Antes de describa el propósito de la vista, es importante que comprenda lo que es un núcleo lógico. En la actualidad un único chip de CPU puede incluir varios circuitos de microprocesador, que se denomina núcleos físicos. Cada núcleo físico puede ser capaz de ejecutar varios subprocesos de aplicación simultáneamente. Esto a menudo se conoce como subprocesamiento múltiple simultáneo (SMT); Intel llama a la tecnología Hyper-Threading. Cada subproceso de hardware compatible en un núcleo con capacidad de chapa presenta como un núcleo lógico al sistema operativo.

Si recopila una traza en un sistema de núcleo cuádruple no es compatible con chapa, el eje y mostraría cuatro núcleos lógicos. Si es capaz de ejecutar dos subprocesos SMT cada núcleo del sistema de núcleo cuádruple, el eje y mostraría ocho núcleos lógicos. El punto aquí es que el número de núcleos lógicos es un reflejo del número de subprocesos que pueden ejecutarse simultáneamente en el sistema, no el número de núcleos físicos.

Ahora, let’s volver a la vista. Hay cuatro áreas que se muestra en el gráfico, como se describe en la leyenda. El área de color verde representa el número promedio de núcleos lógicos que está utilizando la aplicación está analiza en cualquier momento durante la ejecución de generación de perfiles. El resto de los núcleos lógicos están bien inactivo (se muestra en gris), utilizado por el proceso del sistema (que se muestra en rojo) o utilizado por otros procesos que se ejecutan en el sistema (que se muestra en amarillo).

Las barras azules verticales en esta vista se corresponden con un mecanismo opcional que permite a los usuarios instrumentar su código para correlacionar las visualizaciones en la herramienta con construcciones de aplicación. Explicaré cómo esto puede hacer esto más adelante en este artículo.

El control deslizante de zoom en la parte superior izquierda permite acercar la vista para obtener más detalles y el control de gráfico admite una barra de desplazamiento horizontal cuando se ha aplicado el zoom. También puede hacer zoom haciendo clic en el botón secundario del mouse (ratón) y arrastrando en el gráfico de área de sí mismo.

Esta vista tiene tres propósitos principales. En primer lugar, si está interesado en poner en paralelo una aplicación, puede buscar las áreas de ejecución cualquiera exhiben bastantes tareas vinculados a la CPU serie, que se muestra como largas regiones verdes en el núcleo único nivel en el eje y o regiones donde no hay mucho la CPU, donde el verde no se muestra o es considerablemente menor que 1 en promedio. Ambas circunstancias podrían indicar una oportunidad para la puesta en paralelo. Para tareas que hacen un uso intensivo de CPU se puede acelerar mediante el aprovechamiento de paralelismo y las áreas de baja utilización de CPU inesperada podrían implica bloqueo (quizás debido a la E/s) donde se puede utilizar paralelismo superponiendo otro trabajo útil con tales retrasos.

En segundo lugar, si está intentando ajustar la aplicación paralela, esta vista permite confirmar el grado de paralelismo existe cuando realmente se está ejecutando la aplicación. Las sugerencias de muchos errores comunes de rendimiento paralelo son normalmente aparentes examinando este gráfico. Por ejemplo, puede observar cargar desequilibrios como patrones de escalera paso en el gráfico o la contención de objetos de sincronización como la ejecución en serie cuando se espera el paralelismo.

En tercer lugar, puesto que la aplicación reside en un sistema que puede estar ejecutando muchas otras aplicaciones compiten por sus recursos, es importante comprender si el rendimiento de la aplicación se ve afectado por otras aplicaciones. Cuando las interferencias es inesperada, es normalmente una buena idea reducir desactivando aplicaciones o servicios para mejorar la fidelidad de los datos, porque el rendimiento generalmente es un proceso iterativo. A veces, las interferencias está causada por otros procesos con el que la aplicación colabora para proporcionar una experiencia. En ambos casos, podrá utilizar esta vista para descubrir si existe dicha interferencia y, a continuación, identificar los procesos reales implicados utilizando la vista subprocesos, que tratará más adelante.

Otra característica que puede ayudar a reducir las interferencias es mediante las herramientas de la línea de comandos de generador de perfiles para recopilar seguimientos en lugar de hacerlo desde el entorno de desarrollo integrado (IDE) de Visual Studio.

Centra la atención en alguna ventana de ejecución piques su interés, Acercar en él y, a continuación, cambie a la vista subprocesos para un posterior análisis. Siempre puede volver a esta vista para buscar la siguiente área de interés y repita el proceso.

Subprocesos

La vista subprocesos, que se muestra en de figura 2, contiene la mayor parte de las características de análisis detallado y informes en el visualizador de concurrencia. Esto es donde encontrará información que explica que identificó en el uso de CPU o vistas de núcleos de comportamiento. También es donde puede encontrar datos que se vincularán comportamiento al código fuente de aplicación cuando sea posible. Hay tres componentes principales de esta vista: control de ficha de la escala de tiempo, activa la leyenda y los reporting y detalles.

Similar a la vista Uso de CPU, la vista subprocesos muestra tiempo en el eje x. (Al cambiar entre vistas en el visualizador de simultaneidad, se conserva el intervalo de tiempo mostrado en el eje x.) Sin embargo, el eje y de vista de subprocesos contiene dos tipos de canales horizontales.

Los canales superiores normalmente están dedicados a discos físicos en el sistema si tuvieran actividad en el perfil de la aplicación. Existen dos canales por disco, uno para las operaciones de lectura y escritura. Estos canales muestran accesos de disco que se realizan por los subprocesos de aplicación o por los subprocesos del proceso del sistema. (Muestra que los accesos del sistema, dado que a veces puede reflejan funciona realiza en nombre de proceso de, como la paginación.) Cada lectura o escritura está dibujado como un rectángulo. La longitud del rectángulo muestra la latencia de retrasa el acceso, incluida la puesta en cola; por lo tanto, es posible que se solapen varios rectángulos.

Para determinar qué archivos se tuvo acceso a un momento determinado en el tiempo, seleccione un rectángulo haciendo clic en el botón secundario del mouse (ratón). Al hacer que, se cambiará la vista Informes siguiente a la ficha pila actual, que es la ubicación estándar para mostrar datos interactivamente con la escala de tiempo. Su contenido enumera los nombres de archivos que se han ya sea leídos o escrito, según el canal de disco seleccionado. Volverá a análisis de E/s más adelante.

Una cosa que debe tener en cuenta es que leer el archivo no todos los y operaciones de escritura realizadas por la aplicación pueden ser visibles cuando prevea que va a producirse. Esto es porque el sistema de archivos del sistema operativo utiliza el almacenamiento en búfer, lo que permite que algunos disco las operaciones de E/s realizar sin acceder al dispositivo de disco físico.

Los canales restantes en la escala de tiempo enumeran todos los subprocesos que existían en la aplicación durante el período de recopilación de perfil. Para cada subproceso, si la herramienta detecta ninguna actividad durante la ejecución del generador de perfiles, mostrará el estado del subproceso a lo largo de la traza hasta que se levante.

Si un subproceso se está ejecutando, que se representa por la categoría verde de ejecución, el visualizador de concurrencia muestra lo que hacía el subproceso, aprovechando la información de perfil de ejemplo. Hay dos formas de llegar a este tipo de datos. Uno es haciendo clic en un segmento verde, en cuyo caso, verá más próximo (dentro de +/-1 ms) pila de llamadas de ejemplo de perfil en la ventana de ficha de pila actual.

También puede generar un informe de perfil de ejemplo para el intervalo de tiempo visible entender dónde se dedicó la mayor parte del trabajo. Si hace clic en la etiqueta de la ejecución en la leyenda activa, el informe mostrará en la ficha informe de perfil. El informe de perfil tiene dos características que pueden utilizarse para reducir la complejidad. Uno es una característica de reducción de ruido que, de forma predeterminada, llamada quita apila responsable de 2 por ciento o menos de los ejemplos de perfil. Este umbral puede cambiarse por el usuario. Otra característica, denominada Sólo mi código, puede utilizarse para reducir el número de marcos de pila debido a archivos DLL de sistema en el informe, si eso es deseable. Trataré los informes con más detalle más adelante.

Antes de continuar, me gustaría señalar algunas características más para administrar la complejidad en los informes y vistas. A menudo se encontrará con escenarios de aplicación que consta de muchos subprocesos, algunos de los cuales pueden no estar haciendo nada útil en un generador de perfiles determinado ejecutar. Además de filtrado de informes basados en el intervalo de tiempo, el visualizador de concurrencia también permite filtrar por los subprocesos que están activos. Si está interesado en subprocesos que funcionan, puede utilizar la opción Ordenar por para ordenar los subprocesos por el porcentaje de tiempo que se encuentren en el estado de ejecución. A continuación, puede seleccionar el grupo de subprocesos que no se siente mucho trabajo útil y ocultar de la pantalla haciendo clic con el botón secundario del mouse y seleccionando la opción Ocultar en el menú contextual o haciendo clic en el botón Ocultar en la barra de herramientas situada en la parte superior de la vista. Puede ordenar por todas las categorías de estado de subproceso y puede ocultar/mostrar según su conveniencia.

El efecto de ocultar subprocesos es que sus contribuciones a todos los informes se eliminarán, junto a ocultar sus canales desde la línea de tiempo. Todas las estadísticas e informes en la herramienta se mantienen actualizadas dinámicamente como el filtrado se realiza en subprocesos y el intervalo de tiempo.

Bloqueo de categorías

Los subprocesos pueden bloquear por muchos motivos. La vista subprocesos intenta identificar la razón por qué se bloquea un subproceso mediante la asignación de cada instancia a un conjunto de categorías de bloqueo. Digo intentos porque esta categorización a veces puede ser inexacta, tal como explicaré en breve, por lo que deben considerarse como una guía aproximada. Dicho esto, la vista subprocesos muestra todos los retrasos de subproceso y períodos de ejecución representa con precisión. Su atención debe centrarse en categorías responsables retrasos importantes en la vista según su nivel de comprensión sobre el comportamiento de la aplicación.

Además, la vista subprocesos proporciona la pila de llamadas a la que el subproceso detenido la ejecución en la ficha pila actual si hace clic en un evento de bloqueo. Haciendo clic en un marco de pila en la ventana Pila de actual, el usuario se abrirá el archivo de código fuente (cuando esté disponible) y el número de línea donde se llama a la función siguiente. Se trata de una característica importante de la productividad de la herramienta.

Let’s eche un vistazo a las distintas categorías de bloqueo:

Sincronización Casi todas las operaciones de bloqueo se pueden atribuir a un mecanismo de sincronización subyacente en Windows. El visualizador de concurrencia intenta asignar los eventos de bloqueo debido a la API como EnterCriticalSection y WaitForSingleObject de sincronización a esta categoría, pero a veces se pueden asignar otras operaciones que resultan en sincronización internamente a esta categoría, aunque es posible que hacen más sentido en otro lugar. Por lo tanto, ésta es a menudo una categoría de bloqueo muy importante para analizar durante el ajuste del rendimiento, no sólo porque sobrecargas de sincronización son importantes pero también porque puede reflejar otras razones importantes para los retrasos de ejecución.

Solicitud de preferencia Esto incluye preferencia debido a la caducidad de cuanto al uso compartido de un subproceso de tiempo en su núcleo caduca. También incluye preferencia debido al sistema operativo reglas como, por ejemplo, otro subproceso de proceso con una prioridad más alta que se está listo para ejecutar la programación. El visualizador de concurrencia asigna también otras fuentes de preferencia aquí, como las interrupciones y LPCs, que pueden dar lugar a interrumpir la ejecución del subproceso. En cada evento, el usuario puede obtener el identificador/nombre de proceso y thread ID que tuvieron por colocar el puntero sobre una región de preferencia y examinando la información sobre herramientas (o al hacer clic en una región amarilla y observar el contenido de la ficha pila actual). Esto puede ser una característica valiosa para comprender que las causas de interferencia amarillo en la vista Uso de CPU.

Modo de suspensión Esta categoría se utiliza para informar de eventos como resultado de una solicitud explícita de bloqueo de subproceso por el subproceso de suspensión o yield voluntariamente su núcleo.

Administración de la paginación y memoria Esta categoría cubre bloqueo eventos debido a la administración de memoria, que incluye las operaciones de bloqueo iniciadas por el Administrador de memoria del sistema como respuesta a una acción por la aplicación. Cosas como errores de página, determinadas contención de asignación de memoria o bloqueo de ciertos recursos aparecería aquí. Errores de página en particular son importantes porque pueden dar como resultado E/s. Cuando vea un error de página 
event de bloqueo, debe tanto examinar la pila de llamadas y busque una E/s correspondiente leer eventos en el canal de disco en caso de que el error de página necesarios de E/s. Un origen común de dichos errores de página está cargando archivos DLL, E/s asignada a memoria y paginación de memoria virtual normal el núcleo. Puede identificar si esto fue una carga de DLL o paginación haciendo clic en el segmento de E/s correspondiente para obtener el nombre de archivo implicados.

E/S Esta categoría incluye sucesos como el bloqueo en archivo lecturas y escrituras, determinadas operaciones de socket de red y del registro de accesos. Un número de operaciones considerado por algunos estar relacionados con la red es posible que no aparezcan aquí, sino en la categoría de sincronización. Esto es porque muchas operaciones de E/s utilizan mecanismos de bloque y el visualizador de concurrencia pueden no estar buscando esas firmas de API de esta categoría de sincronización. Al igual que con la categoría de paginación de memoria/aparezca un evento de bloqueo de E/s que parece estar relacionados con el acceso a las unidades de disco, debe averiguar si hay un acceso al disco correspondiente en los canales de disco. Para facilitar esta tarea, puede utilizar los botones de flecha en la barra de herramientas para mover sus subprocesos más cerca al canal de disco. Para ello, seleccione un canal de subproceso haciendo clic en su etiqueta de la izquierda y, a continuación, haga clic en el botón de barra de herramientas correspondiente.

Procesamiento de la interfaz de usuario Esto es la única forma de bloqueo que se suele ser deseable. Es el estado de un subproceso se bombea mensajes. Si el subproceso de interfaz de usuario dedica la mayor parte de su tiempo en este estado, esto implica que la aplicación está respondiendo. Por otro lado, si el subproceso de interfaz de usuario no excesivo trabajo o el bloqueo por otros motivos, desde la perspectiva del usuario de aplicación de la interfaz de usuario aparecerá a bloquearse. Esta categoría ofrece una forma excelente para estudiar la capacidad de respuesta de la aplicación y para ajustarlo.

Inter-Thread dependencias

Una de las características más valiosas de la vista subprocesos es la capacidad de determinar las dependencias de sincronización inter-thread. En de figura 2 se ha activado un segmento de retraso de sincronización. El segmento obtiene ampliado y su color se resalta (en este caso, es rojo). La ficha pila actual muestra la pila de llamadas del subproceso en ese momento. Examinando la pila de llamadas, puede determinar la API que dieron como resultado la ejecución del subproceso de bloqueo.


Figura 2 de vista subprocesos

Otra característica de visualización es una línea que conecta el segmento de bloqueo a un segmento de ejecución en un subproceso diferente. Cuando esta visualización está visible, ilustra el subproceso terminó por desbloquear el subproceso bloqueado. Además, puede hacer clic en la ficha de la pila Unblocking en este caso para ver lo que hacía el subproceso desbloqueo cuando suelta el subproceso bloqueado.

Por ejemplo, si el subproceso de bloqueo estaba esperando una sección crítica de Win32, vería la firma de EnterCriticalSection en su pila de llamadas de bloqueo. Cuando se desbloquea, debería ver la firma de LeaveCriticalSection en la pila de llamadas de desbloqueo del subproceso. Esta característica puede resultar muy valiosa al analizar el comportamiento de las aplicaciones complejas.

Informes

Los informes de perfil le ofrecen una forma sencilla de identificar colaboradores principales en el comportamiento de rendimiento de la aplicación. Si está interesado en costes indirectos de ejecución, gastos generales de bloqueo o E/s de disco, estos informes permiten centrarse en los elementos más importantes que pueden ser merece la pena investigar.

Existen cuatro tipos de informes en la vista subprocesos: perfiles de muestreo de ejecución, bloqueo de perfiles, las operaciones de archivos y resúmenes por subproceso. Se obtiene acceso a todos los informes por medio de la leyenda. Por ejemplo, para obtener el informe de perfil de ejecución, haga clic en la entrada de leyenda de ejecución. Esto genera un informe en la ficha informe de perfil. Los informes un aspecto similares al que se muestra en de figura 3.


Figura 3 de un informe de perfil típica

Para un informe de perfil de ejecución, el visualizador de concurrencia analiza todas las pilas de llamadas recopilados cuando la ejecución de la aplicación (verdes segmentos) de muestreo y intercala identificando los marcos de pila compartida para ayudar al usuario en la comprensión de la estructura de la ejecución de la aplicación. La herramienta también calcula los costos, ambos inclusivos y exclusivos para cada fotograma. Ejemplos de inclusión en cuenta todas las muestras en una ruta de ejecución determinado, incluidas todas las rutas de acceso por debajo de él. Ejemplos exclusivos se corresponden con el número de muestras de hojas de gráfico de llamadas marco de pila.

Para obtener un bloqueo perfil, haga clic en la categoría de interés en la leyenda bloqueo. El informe generado se construye como el informe de perfil de ejecución, pero las columnas, ambos inclusivas y exclusivas corresponden ahora a bloqueo tiempo atribuido a las pilas de llamadas o marcos en el informe. Otra columna muestra el número de instancias de bloqueo de atribuir a ese marco de pila en el árbol de llamadas.

Estos informes le ofrecen una forma cómoda de esfuerzos de ajuste mediante la identificación de las partes de la aplicación responsable de la mayoría de los retrasos del rendimiento priorizar. El informe de preferencia es informativo y normalmente no ofrece ningún procesables datos debido a la naturaleza de esta categoría. Todos los informes le permiten saltar al código fuente. Puede hacerlo haciendo clic con el botón secundario en un marco de pila de interés. El menú contextual que aparece permite saltar a la definición de función (la opción Ver código fuente) o a la ubicación en la aplicación donde se ha llamado esa función (opción de llamada a la lista de sitios). Si hay varios de los llamadores, se le presentará varias opciones. Esto permite una integración transparente entre los datos de diagnóstico y el proceso de desarrollo para ajustar el comportamiento de la aplicación. Los informes también pueden exportarse para las comparaciones entre perfil.

El informe de las operaciones de archivo se muestra en figura 4 incluye un resumen de todos los archivos operaciones de lectura y escritura visibles en el intervalo de tiempo actual. Para cada archivo, el visualizador de concurrencia enumera el subproceso de la aplicación tiene acceso a él, el número de lectura y las operaciones de escritura, el número total de bytes leídos o escritos y el total de lectura o escritura latencia. Además de mostrar las operaciones con archivos atribuidas directamente a la aplicación, el visualizador de concurrencia también muestra las realizadas por el proceso del sistema. Se muestran, como se mencionó anteriormente, porque es posible que incluyen las operaciones de archivo realizadas por el sistema en nombre de la aplicación. Exportar el informe permite comparaciones entre perfil durante el ajuste de esfuerzos.


Figura 4 del informe de operaciones de archivo

El informe Resumen por subproceso, que se muestra en de figura 5, presenta un gráfico de barras para cada subproceso. La barra se divide en las distintas categorías de estado de subproceso. Esto puede ser una herramienta útil para realizar un seguimiento del progreso de optimización del rendimiento. Al exportar los datos del gráfico entre iteraciones de ajustes diferentes, puede documentar su progreso y proporcionar un medio de la comparación de ejecuciones. El gráfico no mostrará todos los subprocesos para las aplicaciones que tienen demasiados subprocesos para que quepa en la vista.


Figura 5 por informe de resumen de subprocesos

Núcleos

Cambios de contexto excesivo pueden tener un efecto perjudicial sobre el rendimiento de la aplicación, especialmente cuando subprocesos migrarán a través de sockets de procesador o núcleos cuando reanude la ejecución. Esto es porque un subproceso en ejecución carga instrucciones y datos que necesita (a menudo se denomina el conjunto de trabajo) en la jerarquía de caché. Cuando un subproceso reanuda la ejecución, especialmente en el núcleo de otro, puede verse afectado latencia significativo mientras su conjunto de trabajo se vuelve a cargar desde la memoria o otras cachés en el sistema.

Hay dos formas comunes para reducir esta sobrecarga. Un desarrollador o bien puede reducir la frecuencia de cambios de contexto mediante la resolución de las causas subyacentes, o puede aprovechar la afinidad del procesador o de núcleo. La primera de ellas casi siempre es más conveniente porque utiliza afinidad de subprocesos puede ser el origen de otros problemas de performance y sólo debe utilizarse en circunstancias especiales. La vista de núcleos es una herramienta que ayuda a identificar cambios de contexto excesivo o los errores de rendimiento introducidos por afinidad de subprocesos.

Como con otras vistas, la vista de núcleos muestra una escala de tiempo con el tiempo en el eje x. Los núcleos lógicos en el sistema se muestran en el eje y. Cada subproceso de la aplicación se asigna un color y segmentos de la ejecución de subprocesos se dibujan en los canales de núcleo. Se muestran una estadísticas de switch leyenda y el contexto en el panel inferior, tal y como se muestra en de figura 6.


Figura 6 núcleos ver

Las estadísticas de ayudar al usuario identificar subprocesos que tienen cambios de contexto excesivo y los que incurren las migraciones de núcleo excesivo. El usuario, a continuación, puede utilizar esta vista para centrar su atención en áreas de ejecución donde los subprocesos en cuestión se interrumpen o saltar hacia delante y hacia atrás a través de núcleos siguiendo las sugerencias de color visual. Una vez que se identifica una región que describe el problema, el usuario puede acercarse a ella y volver a la vista subprocesos para comprender lo que activa los cambios de contexto y corríjalos si es posible (por ejemplo, al reducir la contención de una sección crítica). Los errores de afinidad de subproceso pueden también manifestar en algunos casos cuando dos o más subprocesos compiten por un solo núcleo mientras que otros núcleos aparecer a estar inactivo.

Compatibilidad con PPL, TPL y PLINQ

El visualizador de concurrencia es compatible con los modelos de programación paralelos de envío en Visual Studio 2010 aparte de Windows nativos y administrados programación modelos existentes. Algunas de las nuevas construcciones paralelas — parallel_for en el paralelo patrón Library (PPL), Parallel.for en las consultas PLINQ y Task Parallel Library (TPL) — incluyen ayudas para la visualización en la herramienta de rendimiento que permiten centra la atención en las regiones de ejecución.

PPL requiere la activación de seguimiento para esta funcionalidad esté habilitada, tal y como se muestra en este ejemplo:

Concurrency::EnableTracing();
parallel_for (0, SIZE, 1, [&] (int i2) {
  for (int j2=0; j2<SIZE; j2++) {
    A[i2+j2*SIZE] = 1.0;
    B[i2+j2*SIZE] = 1.0;
    C[i2+j2*SIZE] = 0.0;
  }
});
Concurrency::DisableTracing();

Cuando el seguimiento está habilitado, las vistas de núcleos y subprocesos describa la región de ejecución parallel_for dibujando verticales marcadores al principio y al final de su ejecución. Las barras verticales se conectan a través de barras horizontales en la parte superior e inferior de la vista. Colocando con el mouse (ratón) sobre las barras horizontales, se dibuja una información sobre herramientas que muestra el nombre de la construcción, como se muestra en de figura 7.


Figura 7 de un ejemplo parallel_for marcador Visual en la vista subprocesos

TPL y PLINQ no requieren activación manual de seguimiento para una funcionalidad equivalente en el visualizador de concurrencia.

Recopilación de un perfil

El visualizador de concurrencia es compatible con el lanzamiento de aplicación y adjuntar métodos de recopilación de un perfil. El comportamiento es exactamente igual que los usuarios del generador de perfiles de Visual Studio están acostumbrados a. Se puede iniciar una nueva sesión de generación de perfiles mediante la opción del menú analizar si se inicia el Asistente de rendimiento, se muestra en de figura 8, o mediante el generador de perfiles de | opción nueva sesión de rendimiento. En ambos casos, se activa el visualizador de concurrencia, elegir el método de generación de perfiles de concurrencia y, a continuación, seleccione la opción “ Ver el comportamiento de una aplicación multiproceso ”.


Figura 8 de cuadro de diálogo método de generación de perfiles el Asistente para rendimiento

Herramientas de línea de comandos del generador de perfiles de Visual Studio permiten recopilar seguimientos de visualizador de concurrencia y analizarlos utilizando el IDE. Esto permite a los usuarios que están interesados en escenarios de servidor donde instalar el IDE es imposible recopilar una traza con la intrusión mínimo posible.

Observará que el visualizador de simultaneidad no tiene compatibilidad integrada para perfilar las aplicaciones ASP.NET. Sin embargo, es posible asociar al proceso de host (normalmente w3wp.exe) mientras se ejecuta la aplicación ASP.NET para analizar su rendimiento.

Puesto que el visualizador de concurrencia utiliza seguimiento de eventos para Windows (ETW), requiere privilegios administrativos para recopilar datos. Puede cualquiera lanzamiento el IDE como administrador o se le pedirá para ello cuando sea necesario. En este último caso, se reiniciará el IDE con derechos de administrador.

Vinculación de visualizaciones a las fases de aplicación

Otra característica en el visualizador de concurrencia es una biblioteca de instrumentación opcional que permite a los desarrolladores personalizar las vistas mediante el dibujo de marcadores para las fases de aplicación cosas importantes. Puede ser extremadamente valioso para permitir más fácil de correlación entre las visualizaciones y el comportamiento de la aplicación. La biblioteca de instrumentación se denomina biblioteca escenario y está disponible para su descarga desde el sitio Web de MSDN Code Gallery en code.msdn.microsoft.com/scenario de . Aquí es un ejemplo utilizando una aplicación C:

#include "Scenario.h"
int _tmain(int argc, _TCHAR* argv[]) {
  myScenario = new Scenario(0, L"Scenario Example", (LONG) 0);
  myScenario->Begin(0, TEXT("Initialization"));

  // Initialization code goes here

  myScenario->End(0, TEXT("Initialization"));
  myScenario->Begin(0, TEXT("Work Phase"));

  // Main work phase goes here  

  myScenario->End(0, TEXT("Work Phase"));
  exit(0);
}

El uso es bastante simple; incluya el archivo de encabezado de escenario y vincular la biblioteca correcta. A continuación, puede crear uno o varios objetos del escenario y Mark el principio y final de cada fase invocando la iniciar y finalizar los métodos, respectivamente. También especificar el nombre de cada fase a estos métodos. La visualización es idéntica a la que se muestra en de figura 7, excepto que la información sobre herramientas mostrará el nombre de fase personalizado que especifica en el código. Además, los marcadores de escenario también son visibles en la vista Uso de CPU, que no es el caso para otros marcadores. También se proporciona un 
implementation administrado equivalente.

Una palabra de precaución está en orden aquí. Marcadores de escenario deben utilizarse con moderación; de lo contrario, las visualizaciones pueden estar ocultos de completamente por ellos. De hecho, para evitar este problema, la herramienta se significativamente reducir o eliminar el número de marcadores que se muestra si detecta el uso excesivo. En tales casos, puede acercar para exponer los marcadores que han sido elididos en la mayoría de las vistas. Además, cuando anidamiento de los marcadores de escenario tiene lugar, se mostrará sólo el marcador más interno.

Recursos y errata

El visualizador de concurrencia incluye muchas características que ayudan a comprender sus vistas e informes. La mayoría interesante característica tan es el botón Demystify se muestra en la esquina superior derecha de todas las vistas. Haciendo clic en Demystify, obtener un puntero de mouse especiales permitiéndole haga clic en cualquier característica en la vista que desea obtener ayuda en. Ésta es nuestra forma de proporcionar ayuda contextual en la herramienta.

Además, hay una ficha de sugerencias con la ayuda más contenido, incluyendo un vínculo a una galería de firmas de visualización para algunos problemas comunes de rendimiento.

Como se mencionó anteriormente, la herramienta aprovecha ETW. Algunos de los eventos requeridos por el analizador de la concurrencia no existen en Windows XP o Windows Server 2003, por lo que la herramienta sólo es compatible con Windows Vista, Windows Server 2008, Windows 7 y Windows Server 2008 R2. Variantes de 32 bits y 64 bits de estos sistemas operativos son compatibles.

Además, la herramienta admite ambas aplicaciones .NET y C o C++ nativas (con exclusión de .NET 1.1 y anterior). Si no se ejecutan en una plataforma compatible, debe explorar otra herramienta de simultaneidad valiosa en Visual Studio de 2010, que está habilitada si selecciona la opción “ recopilar datos de contención de recursos ”.

En ciertos casos, cuando hay una gran cantidad de actividad en un escenario de generación de perfiles o cuando hay contención de ancho de banda de E/s desde otras aplicaciones, eventos de seguimiento importante pueden perderse. Esto produce un error durante el análisis de seguimiento. Hay dos formas de controlar esta situación. En primer lugar, podría tratar de generación de perfiles nuevo con un número menor de las aplicaciones activas, que es una buena metodología deben seguir para minimizar las interferencias mientras la optimización de la aplicación. Las herramientas de línea de comandos son una opción adicional en este caso.

En segundo lugar, puede aumentar el número o el tamaño de búferes de memoria ETW. En cómo lograr este objetivo, ofrecemos documentación a través de un vínculo en la ventana de resultados para obtener instrucciones. Si elige opción dos, por favor, establecer el tamaño mínimo de búfer total necesario para recopilar una buena traza puesto que estos búferes consumen recursos importantes del núcleo en el uso.

Cualquier herramienta de diagnóstico sólo es tan buena como los datos que se proporciona para el usuario. El visualizador de concurrencia le ayudará a concretar las causas de problemas de rendimiento con las referencias a código fuente, pero para ello, necesita acceso a archivos de símbolos. Puede agregar los servidores de símbolos y las rutas de acceso en el IDE mediante las herramientas | opciones | depuración | cuadro de diálogo símbolos. Se incluirá implícitamente símbolos para su solución actual, pero debe habilitar el servidor de símbolos público de Microsoft así como otros trazados que son específicas de la aplicación sometida a estudio donde se pueden encontrar los archivos de símbolos importante. También es una buena idea Habilitar caché de símbolo porque reducirá significativamente tiempo de análisis de perfil como la memoria caché se rellena con archivos de símbolos que necesita.

Aunque ETW proporciona un mecanismo de seguimiento de bajo overhead, las trazas recopiladas por el visualizador de concurrencia pueden ser de gran tamaño. Analizar trazas grandes pueden ser muy lentas y pueden provocar en sobrecargas de rendimiento en las visualizaciones proporcionadas por la herramienta. Por lo general, deben recopilarse los perfiles de las duraciones no superior a uno o dos minutos para reducir al mínimo las posibilidades de estos problemas que afectan a su experiencia. Para la mayoría de las situaciones de análisis, esta duración es suficiente para identificar el problema. La capacidad de conectar a un proceso en ejecución también es una característica importante a fin de evitar la recopilación de datos antes de la aplicación alcance el punto de interés.

Hay varias fuentes de información sobre el visualizador de concurrencia. Visite el foro de generador de perfiles de Visual Studio (social.msdn.microsoft.com/forums/en-us/vstsprofiler/threads ) para desarrollo de comunidad y respuestas de equipo. Para obtener más información está disponible en el blog del equipo en blogs.msdn.com/visualizeparallel de y mi blog personal en blogs.msdn.com/hshafi de . No dude en llegar a mí o a mi equipo si tiene cualquier pregunta acerca de nuestra herramienta. Nos encanta audiencia de las personas que utilizan el visualizador de concurrencia y sus comentarios nos ayuda a mejorar la herramienta.

 

Dr. Hazim Shafi   es el arquitecto de herramientas de rendimiento y exactitud paralelo en el equipo Parallel Computing Platform de Microsoft. Tiene 15 años de experiencia en muchos aspectos de análisis de informática y rendimiento paralelo y distribuidas. Posee un B.S.E.E. de Santa Clara University y máster y pH.d. grados de Rice University.

Gracias a los siguientes expertos técnicos para la revisión de este artículo: Drake Campbell, Bill Colburn, Sasha Dadiomov y de James Rapp