Compartilhar via


Visualização de threads (desempenho paralelo)

Este é o modo de exibição mais detalhado e rico em Visualizador de simultaneidade. Usando este modo de exibição, você pode identificar se os threads estão em execução ou bloqueando por causa de sincronização, e/S ou algum outro motivo.

Durante a análise do perfil, o Visualizador de simultaneidade examina todos os eventos de alternância de contexto de sistema operacional para cada segmento do aplicativo. Alternâncias de contexto podem ocorrer por diversos motivos, como, por exemplo, o seguinte:

  • Um thread estiver bloqueado em um primitivo de sincronização.

  • O quantum de um thread expira.

  • Um segmento faz uma solicitação de i/O de bloqueio.

Visualização de threads atribui uma categoria a cada alternância de contexto, quando um thread interrompeu a execução. As categorias são mostradas na legenda no canto inferior esquerdo do modo de exibição e são explicadas por tópicos da Ajuda correspondentes. Categorização de eventos de alternância de contexto é alcançada, pesquisando em APIs bem conhecidas de bloqueio na pilha de chamadas do thread. Que não encontramos uma correspondência de pilha de chamada, podemos usar a razão de espera é fornecido por Windows. Embora tecnicamente corretos, o Windows categoria pode ser baseada em um detalhe de implementação em vez de na expectativa ou intenção do usuário. Um exemplo disso é que Windows reportará bloqueio em um bloqueio de leitor-gravador reduzidos nativo como o i/O em vez de sincronização. No entanto, nesses casos, você deve ser capaz de identificar a causa raiz de qualquer evento de bloqueio, examinando as pilhas de chamadas que correspondem ao contexto alternar eventos.

Visualização de threads também mostra as dependências de inter-thread. Por exemplo, se você identificar um segmento bloqueado em um objeto de sincronização, a ferramenta pode geralmente mostrarão o thread que desbloqueado-lo, bem como o que esse thread estava fazendo no momento, mostrando sua pilha de chamada quando ele desbloqueado o segmento de interesse.

Finalmente, quando os threads estão em execução, a ferramenta coleta amostras para que você pode analisar o código é executado por um ou mais threads durante um segmento de execução. Além de ser baseado em amostra visibilidade a execução de thread, esse modo de exibição também fornece a execução de árvore de pilha de chamada relatórios de criação de perfil e o bloqueio de relatórios.

Uso

O modo de exibição de Threads destina-se para atender a muitas finalidades. Alguns usos típicos incluem o seguinte:

  • Identifica as razões por que a interface do usuário (UI) de um aplicativo não está respondendo durante determinadas fases de execução.

  • Identifica a quantidade de tempo é gasto com o bloqueio de sincronização, e/S, falhas de página, etc.

  • Identifica o grau de interferência com outros processos que estão em execução no sistema.

  • Identifica problemas de execução paralela de balanceamento de carga.

  • Identifica os motivos de escalabilidade é inexistentes ou com qualidade inferior (por exemplo, por que não melhora o desempenho de um aplicativo paralelo quando mais lógicos núcleos estão disponíveis no sistema).

  • Entenda o grau de simultaneidade no aplicativo para ajudar a paralelização.

  • Compreenda as dependências entre os threads de trabalho e caminhos críticos de execução.

O restante desta seção explica um padrão de uso recomendado para tornar sua experiência mais produtiva neste modo de exibição. Recomendamos primeiro que você use o Exibição de utilização de CPU para se concentrar em uma fase específica da execução de processos que seja de interesse. Tirando proveito de Suporte de marcador do cenário em seu aplicativo, você pode ajudar significativamente nesse processo. Depois que você tivesse ampliado em uma janela de tempo de execução de seu interesse, você pode selecionar o modo de exibição de Threads.

Identificar e restringir uma área de interesse

A visualização de Threads, você verá um modo de exibição do cronograma tem tempo no eixo X. No eixo Y, você verá dois canais de i/O, para leituras e outro para gravações, para cada dispositivo de disco físico no sistema que tinha atividades durante a coleta de perfil. Abaixo os canais de disco, você verá um canal para cada segmento do processo. Inicialmente, os segmentos são classificados na ordem em que são criados, que resulta em um segmento do aplicativo principal, sendo o primeiro. Você pode usar a opção de classificação no canto superior esquerdo do modo de exibição para classificar os threads por outro critério (por exemplo, acordo com a qual os segmentos estiver executando mais trabalho de execução).

Em seguida, você pode ocultar os threads que não estão executando qualquer trabalho no cenário de interesse selecionando os nomes na coluna à esquerda e, em seguida, clicando no Ocultar selecionado de segmentos o ícone na barra de ferramentas. Tais segmentos podem existir por vários motivos. Por exemplo, talvez eles ocioso threads do pool. Tais segmentos são geralmente completamente bloqueados (geralmente devido à sincronização). Você deve removê-los do modo de exibição, porque suas estatísticas podem contaminarem os relatórios com informações irrelevantes.

Você pode usar o relatório de guia de divisão de execução para identificar os segmentos adicionais que podem ser ocultados. Para ver o gráfico de divisão de execução, clique em Por Thread Summary na legenda do ativa. Este gráfico mostra a divisão dos Estados do thread para threads do aplicativo para a janela de tempo visível no momento. Para oferecer suporte a escalabilidade em que o gráfico, podemos limitar o número de segmentos que são exibidos de forma que em determinados casos o gráfico não mostrar dados para todos os segmentos do aplicativo. Quando isso ocorre, ele exibe elipses na posição mais à direita.

Agora que você restringiu a análise para uma região de interesse e selecionou os segmentos de interesse, você pode iniciar a análise de desempenho. As seções a seguir descrevem as diversas ferramentas à sua disposição.

Detalhes de bloqueio de thread

Para compreender os motivos subjacentes para regiões de bloqueio de thread, você pode em Pausar na ou selecionar (left-clicking) dentre essas regiões. Quando você faz uma pausa em uma região de bloqueio, podemos exibir uma dica de ferramenta com informações gerais sobre o evento como, por exemplo, categoria, uma API de bloqueio de bloqueio, se disponível, hora de início da região e duração do bloqueio. Para a categoria de preempção, também vamos mostrar o ID de processo e a identificação de segmento do processo que foi agendado na CPU quando o thread foi interrompido pelo kernel. Você também pode selecionar uma região de bloqueio em um canal de interesse, o que resulta na exibição de pilha atual na janela inferior. Para além de que foi mostrado na dica de ferramenta, o a pilha atual guia mostrará a pilha de chamadas resultou em seu segmento de bloqueio. Examinando a pilha de chamadas, você pode determinar o motivo de base para o evento de bloqueio de thread. Por padrão, mostramos as pilhas de chamadas completa neste modo de exibição, que inclui as pilhas do kernel e de usuário. Quando a ferramenta pode identificar uma API específica, como o culpado, a pilha de chamadas é aparada além desse quadro. Se a ferramenta não conseguir determinar a chamada de função de raiz que resultaram em bloqueio, a pilha de chamadas inteira é exposta para que o usuário possa examiná-lo e fazer essa determinação.

Geralmente é verdade que um caminho de execução resulta em vários eventos de bloqueio. Ele também costuma valioso para entender os atrasos de bloqueio cumulativos que são organizados por pilhas de chamadas. Para essa finalidade, nós fornecemos um relatório de perfil com base na árvore de chamada para cada categoria de bloqueio. Você pode exibir o perfil selecionando uma das entradas de legenda bloqueio categoria à esquerda. Esses relatórios fornecem uma maneira rápida para priorizar a investir o desempenho do seu tempo quando você ajustar o aplicativo.

Dependências de inter-thread

O Visualizador de simultaneidade mostra dependências entre os threads de bloqueio no seu processo. Para determinar o thread cujas ações desbloqueado um segmento de interesse, clique no segmento de bloqueio relevante. Se a ferramenta pode determinar o desbloqueio de thread, ele desenha uma linha para conectar o segmento de execução que segue o segmento de bloqueio para o outro thread. Essa linha mostra como um thread diferente desbloqueado thread selecionada. Além disso, o a pilha de Unblocking guia é preenchido com a pilha de chamadas relevantes. Assim, você pode rapidamente identificar um thread bloqueado, saiba o que ele estava tentando fazer e ver o que finalmente habilitada-lo a executar.

Detalhes de execução do thread

Muitas vezes é útil para determinar qual código está sendo executado por threads no seu aplicativo está em execução. Essas regiões são exibidas como segmentos verdes no gráfico de linha do tempo. Dois recursos ajudam com isso.

Primeiro, quando você clica em um segmento de execução na linha do tempo, podemos tentar localizar a pilha de chamadas de perfil amostra mais próxima. Se conseguir, podemos exibir um cursor preto acima do local no bloco de execução, onde a amostra foi tirada e exibir a pilha de chamada propriamente dito na a pilha atual guia. Você pode selecionar outras amostras clicando em qualquer lugar nos segmentos de execução. Ocasionalmente, podemos ser não é possível encontrar uma amostra. Isso é normalmente devido o período de um ms em que coletamos perfis de amostra. Por exemplo, quando um segmento de execução é menos de um milissegundo longo, a pilha de chamadas não pode ser coletada. Não é possível alterar a freqüência de amostragem, mas um milissegundo é um bom equilíbrio entre precisão e a sobrecarga de execução.

Segundo, a execução do relatório de perfil com o seu modo de exibição de árvore de chamada de amostragem é um recurso importante que pode ajudá-lo a entender onde é gasto o tempo de execução. Esse recurso pode ser acessado clicando-se a execução item da legenda ativa. O perfil de execução fornece um exemplo de relatório para todos os habilitados (não-oculto) segmentos no modo de exibição atual filtradas por intervalo de tempo na janela.

Gráfico de linha do tempo

O gráfico de linha do tempo mostra a atividade de todos os segmentos no processo e todos os dispositivos de disco físico no computador host. Você pode aplicar zoom na linha da tempo, arrastando o ponteiro do mouse ou usando o controle deslizante de zoom na barra de ferramentas da janela ou pressionando a tecla CTRL enquanto girando a roda do mouse. Faça uma pausa em uma das barras horizontais, ou segmentos, para ver a categoria, a hora de início e duração para esse ponto no thread. Clique em um dos segmentos para ver a pilha de chamadas na parte inferior da tela de a pilha atual guia.

No gráfico de linha do tempo, a cor indica o estado de um thread em determinado momento. Por exemplo, verdes segmentos estão em execução, vermelhos segmentos são bloqueados para sincronização, segmentos amarelos tem sido superados e roxos segmentos estão envolvidos em e/S de dispositivo. Essa exibição é útil para examinar o equilíbrio de trabalho para um grupo de threads está envolvido em um loop paralelo ou tarefas simultâneas. Se um ou mais segmentos estão levando mais tempo para concluir que as outras, isso pode indicar uma carga de trabalho desbalanceado e uma oportunidade para melhorar o desempenho do seu programa distribuindo o trabalho mais uniforme entre os threads.

Você também pode usar o gráfico de linha de tempo para examinar as dependências de inter-thread e as relações temporais entre bloqueio e bloqueado threads. Você pode ver quantos segmentos estão executando a qualquer momento, observando a fatia vertical naquele ponto na linha da tempo. Se apenas um thread estiver verde (executando) nesse momento, o aplicativo não é tirando total proveito da simultaneidade está disponível no sistema. Na barra de ferramentas, clique em cima e para baixo botões para classificar e mover segmentos individuais ou usar o Ocultar Threads botão para ocultar informações irrelevantes threads.

Relatórios de perfil

Abaixo da linha do tempo o gráfico é uma legenda ativa e a janela com abas que possui vários relatórios. Relatórios de perfil atualizado automaticamente à medida que o modo de exibição de Threads é alterado pelo zoom, rolagem, ocultar ou Mostrar threads. Para maiores rastreamentos, a janela relatórios ficará esmaecida enquanto os relatórios atualizados são calculados. Cada relatório possui dois ajustes de filtro: Redução de ruído e Just My Code. Redução de ruído ajuda a filtrar informações irrelevantes chamada árvore onde pouco tempo é gasto de entradas. O valor padrão é 2 por cento, mas pode ser ajustada para qualquer valor de 0 a 99%. A caixa de seleção para Just My Code permite que você filtre ou exibir entradas de árvore diferente do seu próprio de chamada. Os relatórios disponíveis são detalhados na seção a seguir.

Relatório de perfil

O relatório de perfil atual pode ser acessado por meio deste guia. Clicando em uma entrada de legenda ativa determina qual relatório de perfil é mostrado. Relatórios de perfil disponível estão listados na seção a seguir, começando com execução.

Pilha atual

Esta guia mostra as pilhas de chamadas para um segmento do segmento selecionado no gráfico de detalhes. As pilhas de chamadas são cortadas para focalizar a atividade que está diretamente relacionada ao seu programa. Na janela de seleção, as informações de thread em execução no momento são imediatamente visíveis.

Pilha de desbloqueio

Clique em a pilha de Unblocking para ver qual thread desbloqueado este e em qual linha de código.

Execução

O relatório de perfil de execução mostra uma tabela detalhada juntamente com a porcentagem de tempo gasto de cada thread em vários estados, como a execução, o i/O e o gerenciamento de memória.

Clique no controle de árvore próxima a qualquer entrada de árvore de chamada de interesse para aprofundar e localize a linha de código no qual o tempo de execução é gasto. Depois que tiver sido identificada uma entrada de árvore de chamada de interesse, com o botão direito essa entrada de um menu de contexto, diz Exibir código-fonte e Exibição de Sites de chamada. Clicando em Exibir código-fonte localiza a linha de origem e, em Exibição de Sites de chamar localiza a linha de código que chamou esta. Se houver de um site de chamada, apenas clique localiza a linha realçada de código para o site de chamada. Se existirem em vários sites de chamada, é apresentada uma caixa de diálogo, na qual uma entrada pode ser selecionada. Clicando no Ir para fonte botão localiza o site de chamada realçado. Geralmente é mais útil para selecionar e localizar a origem para o site de chamada que tem mais instâncias, o tempo maior ou ambos. Para obter mais informações, consulte Relatório de perfil de execução.

Sincronização

O relatório de sincronização mostra as chamadas que são responsáveis por blocos de sincronização, juntamente com a agregação de vezes que cada pilha de chamadas de bloqueio. Você pode usar essas informações para identificar e investigar as áreas de preocupação.

Clique no controle de árvore próxima a qualquer entrada de árvore de chamada de interesse para aprofundar e localize a linha de código no qual o tempo de sincronização é gasto. Depois que tiver sido identificada uma entrada de árvore de chamada de interesse, com o botão direito essa entrada de um menu de contexto, diz Exibir código-fonte e Exibição de Sites de chamada. Clicando em Exibir código-fonte localiza a linha de origem e, em Exibição de Sites de chamar localiza a linha de código que chamou esta. Se houver de um site de chamada, apenas clique conecta-se a linha realçada de código para o site de chamada. Se existirem em vários sites de chamada, é apresentada uma caixa de diálogo do qual uma entrada é selecionada. Clicando no Ir para fonte botão irá localizar o site de chamada realçado. Geralmente é mais útil para selecionar e conexão com a fonte para o site de chamada que tem mais instâncias, o tempo maior ou ambos. Para obter mais informações, consulte Tempo de sincronização.

E/S

O relatório de e/S mostra as chamadas que são responsáveis por blocos de i/O, juntamente com a agregação de vezes que cada pilha de chamadas de bloqueio. Você pode usar essas informações para identificar e investigar as áreas de preocupação.

Clique no controle de árvore próxima a qualquer pilha de chamadas de interesse para aprofundar e localize a linha de código no qual o tempo de i/O é gasto. Depois de uma entrada de árvore de chamada de interesse tiver sido identificada, com o botão direito essa entrada de um menu de contexto, diz Exibir fonte e Exibir o Site de chamada. Clicando em Exibir fonte localiza a linha de origem e, em Exibir o Site de chamada localiza a linha de código que chamou esta. Se houver de um site de chamada, apenas clique conecta-se a linha realçada de código para o site de chamada. Se existirem em vários sites de chamada, é apresentada uma caixa de diálogo do qual uma entrada é selecionada. Clicando no Ir para fonte botão localiza o site de chamada realçado. Geralmente é mais útil para selecionar e conexão com a fonte para o site de chamada que tem mais instâncias, o tempo maior ou ambos. Para obter mais informações, consulte Tempo de i/O (visualização de Threads).

Suspensão

O relatório de suspensão mostra as chamadas que são responsáveis por blocos de suspensão, juntamente com a agregação de vezes que cada pilha de chamadas de bloqueio. Você pode usar essas informações para identificar e investigar as áreas de preocupação.

Clique no controle de árvore próxima a qualquer pilha de chamadas de interesse para aprofundar e localize a linha de código no qual o tempo de suspensão é gasto. Depois de uma entrada de árvore de chamada de interesse tiver sido identificada, com o botão direito essa entrada de um menu de contexto, diz Exibir fonte e Exibir o Site de chamada. Clicando em Exibir fonte localiza a linha de origem e, em Exibir o Site de chamada localiza a linha de código que chamou esta. Se apenas um site de chamada estiver disponível, clique em conecta-se a linha realçada de código para o site de chamada. Se houver vários sites de chamada, é apresentada uma caixa de diálogo do qual uma entrada é selecionada. Clicando no Ir para fonte botão irá localizar o site de chamada realçado. Geralmente é mais útil para selecionar e conexão com a fonte para o site de chamada que tem mais instâncias, o tempo maior ou ambos. Para obter mais informações, consulte Tempo de suspensão.

Paginação

O relatório de paginação mostra as chamadas onde ocorreram a blocos de preempção, juntamente com a agregação de vezes que cada pilha de chamadas de bloqueio. Você pode usar essas informações para identificar e investigar as áreas de preocupação. Este relatório de bloqueio é menos acionável de que as outras porque a preempção é normalmente imposta ao seu processo pelo sistema operacional em vez de resultantes do seu código. Ele mostra ocorreram de quais tipos de preemptions, onde ocorreu e quanto tempo seu processo permaneceu em um estado determinado preempção.

Clique no controle de árvore próxima a qualquer entrada de árvore de chamada de interesse para aprofundar e localize a linha de código no qual o tempo de preempção foi gasto. Depois que tiver sido identificada uma entrada de árvore de chamada de interesse, com o botão direito essa entrada de um menu de contexto, diz Exibir código-fonte e Exibição de Sites de chamada. Clicando em Exibir código-fonte navega para a linha de origem e, em Exibição de Sites de chamar direciona a navegação para a linha de código que chamou esta. Se apenas um site de chamada estiver disponível, clique em navega diretamente para a linha realçada de código para o site de chamada. Se houver vários sites de chamada, é apresentada uma caixa de diálogo do qual uma entrada é selecionada. Clicando no Ir para fonte botão irá localizar o site de chamada realçado. Geralmente é mais útil para selecionar e conexão com a fonte para o site de chamada que tem mais instâncias, o tempo maior ou ambos. Para obter mais informações, consulte Tempo de gerenciamento de memória.

Preempção

O relatório de paginação mostra as chamadas onde ocorreram a blocos de preempção, juntamente com a agregação de vezes que cada pilha de chamadas de bloqueio. Você pode usar essas informações para identificar e investigar as áreas de preocupação. Este relatório de bloqueio é menos acionável de que as outras porque a preempção é normalmente imposta ao seu processo pelo sistema operacional em vez de resultantes do seu código. Ele mostra ocorreram de quais tipos de preemptions, onde ocorreu e quanto tempo seu processo permaneceu em um estado determinado preempção.

Clique no controle de árvore próxima a qualquer pilha de chamadas de interesse para aprofundar e localize a linha de código no qual o tempo de preempção foi gasto. Depois de uma entrada de árvore de chamada de interesse tiver sido identificada, com o botão direito essa entrada de um menu de contexto, diz Exibir fonte e Exibir o Site de chamada. Clicando em Exibir fonte navega para a linha de origem e, em Exibir o Site de chamada direciona a navegação para a linha de código que chamou esta. Se apenas um site de chamada estiver disponível, clique em navega diretamente para a linha realçada de código para o site de chamada. Se houver vários sites de chamada, é apresentada uma caixa de diálogo do qual uma entrada é selecionada. Clicando no Ir para fonte botão irá localizar o site de chamada realçado. Geralmente é mais útil para selecionar e conexão com a fonte para o site de chamada que tem mais instâncias, o maior tempo ou ambos. Para obter mais informações, consulte Tempo de preempção.

Processamento de interface do usuário

O relatório de processamento de interface do usuário mostra as chamadas que são responsáveis pela interface do usuário, blocos, juntamente com a agregação de vezes que cada pilha de chamadas de bloqueio de processamento. Você pode usar essas informações para identificar e investigar as áreas de preocupação.

Clique no controle de árvore próxima a qualquer entrada de árvore de chamada de interesse para aprofundar e localize a linha de código no qual o tempo de processamento de interface do usuário é gasto. Depois que tiver sido identificada uma entrada de árvore de chamada de interesse, com o botão direito essa entrada de um menu de contexto, diz Exibir código-fonte e Exibição de Sites de chamada. Clicando em Exibir código-fonte localiza a linha de origem e, em Exibição de Sites de chamar localiza a linha de código que chamou esta. Se apenas um site de chamada estiver disponível, clique em conecta-se a linha realçada de código para o site de chamada. Se houver vários sites de chamada, é apresentada uma caixa de diálogo do qual uma entrada é selecionada. Clicando no Ir para fonte botão irá localizar o site de chamada realçado. Geralmente é mais útil para selecionar e conexão com a fonte para o site de chamada que tem mais instâncias, o tempo maior ou ambos. Para obter mais informações, consulte Tempo de processamento de interface do usuário.

Por que o resumo de Thread

Esta guia mostra uma exibição de coluna codificados por cor do tempo total que cada thread gasto em cada estado, como execução, é bloqueado e e/S. As colunas são rotuladas na parte inferior. Nível de zoom no padrão, o thread principal é a coluna mais à esquerda. Quando você ajusta o nível de zoom no gráfico de detalhes, os relatórios guia atualizará automaticamente para refletir a nova escala de tempo. Para oferecer suporte a escalabilidade neste gráfico, podemos limitar o número de segmentos que são exibidos. Portanto, em alguns casos o gráfico não pode mostrar dados para todos os segmentos do aplicativo, mas indicará essa limitação exibindo elipses na posição mais à direita. Se o thread que você deseja ver neste gráfico não estiver presente, você pode ocultar informações irrelevantes threads, até que o segmento desejado apareça no gráfico. Para obter mais informações, consulte Por relatório de resumo do Thread.

Operações de arquivo

Esta guia mostra quais segmentos estavam envolvidos na e/S de disco e quais arquivos tocados por eles. Isso inclui as DLLs carregadas, quantos bytes foram lidas e outras informações. Este relatório pode ser útil para avaliar o tempo é gasto acessando arquivos durante a execução, especialmente quando o processo parece ser acoplado de e/S. Para obter mais informações, consulte Relatório de operações de arquivo (modo de exibição de Threads).

Consulte também

Conceitos

Visualizador de simultaneidade