Compartilhar via


Exibição Threads na Visualização Simultânea

A exibição Threads é a exibição mais detalhada e repleta de funcionalidades da Visualização Simultânea. Na exibição Threads, você pode identificar quais threads estão executando um código durante um segmento de execução e analisar se os threads estão sendo executados ou bloqueados devido à sincronização, à E/S ou a outros motivos. Os relatórios da exibição Threads também analisam threads de desbloqueio e de execução da árvore de pilha de chamadas.

Enquanto os threads estão em execução, a Visualização Simultânea coleta amostras. Quando um thread interrompe a execução, o visualizador examina todos os eventos de alternância de contexto do sistema operacional para o thread. As alternâncias de contexto podem ocorrer porque:

  • Um thread é bloqueado em um primitivo de sincronização.
  • O quantum de um thread expira.
  • Um thread faz uma solicitação de E/S de bloqueio.

A Visualização Simultânea categoriza eventos de thread e de alternância de contexto e pesquisa APIs de bloqueio conhecidas nas pilhas de chamadas de threads. Ela exibe as categorias de thread na legenda ativa no canto inferior esquerdo da exibição Threads. Na maioria dos casos, é possível identificar a causa raiz de um evento de bloqueio examinando as pilhas de chamadas que correspondem aos eventos de alternância de contexto.

Se não houver correspondência de pilha de chamadas, a Visualização Simultânea usará o motivo de espera fornecido pelo Windows. No entanto, a categoria do Windows pode se basear em um detalhe de implementação e pode não refletir a intenção do usuário. Por exemplo, o Windows relata o motivo de espera do bloqueio em um bloqueio de leitor-gravador compacto nativo como E/S em vez de Sincronização.

A exibição Threads também mostra as dependências entre threads. Por exemplo, se você identifica um thread que está bloqueado em um objeto de sincronização, pode encontrar o thread que o desbloqueou. Você pode examinar o thread de desbloqueio na pilha de chamadas no ponto em que ele desbloqueou o outro.

Use a exibição Threads para:

  • Identificar os motivos pelos quais a interface do usuário de um aplicativo não responde durante determinadas fases de execução.
  • Determinar o tempo gasto no bloqueio em sincronização, em E/S, em falhas de página e em outros eventos.
  • Descobrir o grau de interferência de outros processos em execução no sistema.
  • Identifique problemas de balanceamento de carga na execução paralela.
  • Encontrar os motivos de escalabilidade abaixo do ideal ou inexistente. Por exemplo, por que o desempenho de um aplicativo paralelo não melhora quando mais núcleos lógicos estão disponíveis.
  • Entenda o grau de simultaneidade no aplicativo, para ajudar na paralelização.
  • Identificar as dependências entre os threads de trabalho e os caminhos críticos de execução.

Usar a exibição Threads

Para iniciar a Visualização Simultânea, selecione Analisar>Visualização Simultânea e, em seguida, selecione uma opção, como Iniciar Novo Processo.

A Visualização Simultânea inicia o aplicativo e coleta um rastreamento até que você selecione Parar Coleta. Em seguida, o visualizador analisa o rastreamento e exibe os resultados na página do relatório de rastreamento.

Selecione a guia Threads no canto superior esquerdo do relatório para abrir a exibição Threads.

Threads view

Selecione intervalos de tempo e threads para iniciar uma análise de desempenho.

Análise da linha do tempo

A parte superior da exibição Threads é uma linha do tempo. A linha do tempo mostra a atividade de todos os threads no processo e todos os dispositivos de disco físico no computador host. Ele também exibe a atividade da GPU e eventos de marcador.

Na linha do tempo, o eixo X é o tempo e no eixo Y estão vários canais:

  • Dois canais de E/S para cada unidade de disco do sistema, um canal para leituras e outro para gravações.
  • Um canal para cada thread no processo.
  • Canais de marcador, se houver eventos de marcador no rastreamento. Inicialmente, os canais de marcador são exibidos sob os canais de thread que geraram esses eventos.
  • Canais de GPU.

Inicialmente, os threads são classificados na ordem em que são criados, de modo que o thread do aplicativo principal seja o primeiro. Selecione outra opção na lista suspensa Classificar por para classificar threads por outro critério, como Execução.

As cores na linha do tempo indicam o estado de um thread em determinado momento. Os segmentos verdes estão em execução, os segmentos vermelhos estão bloqueados para sincronização, os segmentos amarelos foram impedidos e os segmentos roxos são usados na E/S do dispositivo.

Amplie para exibir mais detalhes ou reduza para exibir um intervalo de tempo mais longo. Selecione segmentos e pontos no grafo para obter detalhes sobre categorias, horas de início, atrasos e estados da pilha de chamadas.

Use a linha do tempo para examinar o equilíbrio de trabalho entre os threads envolvidos em um loop paralelo ou em tarefas simultâneas. Se um thread estiver levando mais tempo para ser concluído do que os outros, o trabalho poderá estar desbalanceado. Melhore o desempenho do aplicativo distribuindo o trabalho de maneira mais uniforme entre os threads.

Se apenas um thread estiver em execução em um ponto no tempo, o aplicativo poderá não estar aproveitando ao máximo a simultaneidade no sistema. É possível usar o grafo de linha do tempo para examinar as dependências entre os threads e os relacionamentos temporais entre os threads de bloqueio e bloqueados. Para reorganizar os threads, selecione um thread e, em seguida, selecione o ícone superior ou inferior na barra de ferramentas.

Oculte os threads que não estão realizando nenhum trabalho ou que estão completamente bloqueados, pois suas estatísticas são irrelevantes e podem obstruir os relatórios. Oculte threads selecionando seus nomes e, em seguida, selecionando o ícones Ocultar threads selecionados ou Ocultar todos os threads, exceto os selecionados na barra de ferramentas. Para identificar os threads a serem ocultados, selecione o link Resumo por Thread no canto inferior esquerdo. Você pode ocultar os threads que não têm nenhuma atividade no grafo Resumo por Thread.

Detalhes de execução de thread

Para obter informações mais detalhadas sobre um segmento de execução, selecione um ponto em um segmento verde da linha do tempo. A Visualização Simultânea exibe um cursor preto acima do ponto selecionado e mostra a pilha de chamadas na guia Atual do painel inferior. É possível selecionar vários pontos no segmento de execução.

Observação

A Visualização Simultânea pode não conseguir resolver uma seleção em um segmento de execução se a duração do segmento é inferior a um milissegundo.

Para obter um perfil de execução de todos os threads não ocultos no intervalo de tempo atualmente selecionado, selecione Execução na legenda no canto inferior esquerdo.

Detalhes de bloqueio de thread

Para obter informações sobre uma região específica em um thread, focalize a região na linha do tempo para exibir uma dica de ferramenta. A dica de ferramenta traz informações como categoria, hora de início e atraso. Selecione a região para exibir a pilha de chamadas nesse ponto no tempo na guia Atual do painel inferior. O painel também mostra a categoria, o atraso, a API de bloqueio, se houver uma, bem como o thread de desbloqueio, se houver um. Examinando a pilha de chamadas, você pode determinar os motivos subjacentes dos eventos de bloqueio de thread.

Um caminho de execução pode ter vários eventos de bloqueio. Para examiná-los por categoria de bloqueio e encontrar áreas com problemas mais rapidamente, selecione uma categoria de bloqueio na legenda à esquerda.

Dependências entre threads

A Visualização Simultânea mostra as dependências entre os threads, para que você possa determinar o que um thread bloqueado estava tentando fazer e qual outro thread habilitou sua execução.

Para determinar qual thread desbloqueou outro thread, selecione o segmento de bloqueio na linha do tempo. Se a Visualização Simultânea conseguir determinar o thread de desbloqueio, ela desenhará uma linha entre o thread de desbloqueio e o segmento de execução que segue o segmento de bloqueio. Selecione a guia Pilha de Desbloqueio no painel inferior para ver a pilha de chamadas relevante.

Relatórios de perfil

Abaixo do grafo de linha do tempo há um painel com as guias de relatório Relatório de Perfil, Atual e Pilha de Desbloqueio. Os relatórios são atualizados automaticamente quando você altera as seleções de linha do tempo e threads. Para rastreamentos grandes, o painel de relatórios pode ficar não disponível temporariamente enquanto as atualizações são calculadas.

Guia Relatório de Perfil

O Relatório de Perfil tem dois filtros:

  • Para filtrar as entradas da árvore de chamadas nas quais pouco tempo foi gasto, digite um valor de filtro entre 0 e 99% no campo Redução de ruído no. O valor padrão é 2%.
  • Para exibir as árvores de chamadas apenas de seu código, marque a caixa de seleção Apenas Meu Código. Para exibir todas as árvores de chamadas, desmarque a caixa de seleção.

A guia Relatório de Perfil mostra relatórios para as categorias e os links na legenda. Para exibir um relatório, selecione uma das entradas à esquerda:

  • Execução O relatório Execução mostra o detalhamento do tempo gasto pelo aplicativo na execução.

    Para encontrar a linha de código em que o tempo de execução é gasto, expanda a árvore de chamadas e, no menu de atalho da entrada da árvore de chamadas, selecione Exibir Fonte ou Exibir Sites de Chamada. Exibir Fonte localiza a linha de código executada. Exibir Sites de Chamada localiza a linha de código que chamou a linha executada. Se houver apenas uma única linha de site de chamada, o código será realçado. Se houver vários sites de chamada, selecione aquele desejado na caixa de diálogo e, em seguida, selecione Ir para fonte. Geralmente, é mais útil localizar o site de chamada que tem a maioria das instâncias, mais tempo ou ambos. Para obter mais informações, confira Relatório de perfil de execução.

  • Sincronização O relatório Sincronização mostra as chamadas responsáveis por blocos de sincronização, junto com os tempos de bloqueio totais de cada pilha de chamadas. Para obter mais informações, confira Tempo de sincronização.

  • E/S O relatório E/S mostra as chamadas responsáveis por blocos de E/S, junto com os tempos de bloqueio totais de cada pilha de chamadas. Para obter mais informações, confira Tempo de E/S (exibição Threads).

  • Suspensão O relatório Suspensão mostra as chamadas responsáveis por blocos de suspensão, junto com os tempos de bloqueio totais de cada pilha de chamadas. Para saber mais, confira Tempo de suspensão.

  • Gerenciamento de Memória O relatório Gerenciamento de Memória mostra as chamadas em que ocorreram blocos de gerenciamento de memória, junto com os tempos de bloqueio totais de cada pilha de chamadas. Use essas informações para identificar as áreas que apresentam problemas de coleta de lixo ou de paginação em excesso. Para saber mais, confira Tempo de gerenciamento de memória.

  • Preempção O relatório Preempção mostra em que momentos os processos do sistema impediram o processo atual, bem como os threads individuais que substituíram os threads no processo atual. É possível usar essas informações para identificar os processos e os threads que são mais responsáveis pela preempção. Para saber mais, confira Tempo de preempção.

  • Processamento de interface do usuário O relatório Processamento de interface do usuário mostra as chamadas responsáveis por blocos de processamento de interface do usuário, junto com os tempos de bloqueio totais de cada pilha de chamadas. Para saber mais, confira Tempo de processamento de interface do usuário.

  • Resumo por Thread Selecione Resumo por Thread para exibir um grafo que mostra o estado de threads para o intervalo de tempo atualmente selecionado. As colunas codificadas por cores mostram o tempo total gasto por cada thread nos estados de execução, bloqueio, E/S e outros. Os threads são rotulados na parte inferior. Quando você ajusta o nível de zoom no grafo de linha do tempo, esse grafo é atualizado automaticamente.

    Em alguns níveis de zoom, alguns threads podem não ser mostrados no grafo. Quando isso acontece, são exibidas reticências (...) à direita. Se o thread desejado não for exibido, será possível ocultar outros threads. Para obter mais informações, confira Relatório de resumo por thread.

  • Operações de Disco Selecione Operações de Disco para mostrar os processos e os threads envolvidos na E/S de disco do processo atual, os arquivos cobertos (por exemplo, as DLLs carregadas por eles), o número de bytes lidos e outras informações. Use esse relatório para avaliar o tempo gasto no acesso a arquivos durante a execução, especialmente quando o processo parece estar associado à E/S. Para obter mais informações, confira Relatório de operações de disco.

Guia atual

Esta guia mostra a pilha de chamadas de um ponto selecionado em um segmento de thread no gráfico de linha do tempo. As pilhas de chamadas são cortadas para mostrar somente a atividade que está relacionada ao aplicativo.

Guia Pilha de Desbloqueio

Esta guia mostra qual thread desbloqueou o thread selecionado e a pilha de chamadas de desbloqueio.

Canais (exibição de threads)

A Visualização Simultânea mostra quatro tipos de canais: canais de thread, canais de disco, canais de marcador e canais da GPU.

Canais de thread

Um canal de thread mostra o estado do thread, por cor, para apenas um thread. Quando você pausa no nome do canal, a função de início para o thread determinado é exibida. A Visualização Simultânea detecta vários tipos de threads. Os tipos mais comuns são mostrados na tabela a seguir.

Thread Descrição
Thread principal O thread que iniciou o aplicativo.
Thread de trabalho Um thread que foi criado pelo thread principal do aplicativo.
Thread de trabalho CLR Um thread de trabalho que foi criado pelo CLR (Common Language Runtime).
Depurador Auxiliar Um thread de trabalho que foi criado pelo depurador do Visual Studio.
Thread ConcRT Um thread que foi criado pelo Runtime de Simultaneidade Microsoft.
Thread GDI Um thread que foi criado por GDIPlus.
Thread OLE/RPC Um thread que foi criado como um Thread de Trabalho do RPC.
Thread RPC Um thread que foi criado como um Thread do RPC.
Thread de Winsock Um thread que foi criado como um Thread do Winsock.
Pool de Threads Um thread que foi criado pelo Pool de Threads do CLR.

Canais de disco

Canais de disco correspondem a unidades físicas no computador. Uma vez que existem canais separados para operações de Leitura e Gravação para cada unidade física no sistema, cada unidade tem dois canais. Os números de disco correspondem aos nomes de dispositivo de kernel. Um canal de disco será mostrado somente se tiver ocorrido atividade no disco.

Canais do marcador

Canais do marcador correspondem aos eventos gerados pelo aplicativo e às bibliotecas que ele usa. Por exemplo, a Biblioteca de Paralelismo de Tarefas, a Biblioteca de Padrões Paralelos e o AMP C++ geram eventos exibidos como marcadores. Cada canal de marcador é associado uma ID de thread, que é exibido ao lado da descrição do canal. A ID identifica o thread que gerou o evento. A descrição do canal inclui o nome do provedor ETW (Rastreamento de Eventos para Windows ) que gerou os eventos. Se o canal exibir eventos do SDK da Visualização Simultânea, o nome da série também será exibido.

Canais de GPU

Canais da GPU exibem informações sobre a atividade do DirectX 11 no sistema. Cada mecanismo DirectX associado à placa gráfica tem um canal separado. Os segmentos individuais representam o tempo gasto no processamento de um pacote DMA.

Copiar seleção

Para copiar toda a pilha de chamadas por meio da guia de relatório, clique em Copiar. Em seguida, é possível colar a pilha de chamadas em qualquer programa que dá suporte a essa ação.

Guia atual

Ao clicar na guia Atual, é possível ver uma pilha de chamadas (se disponível) que está próxima ao ponto de seleção atual na linha do tempo se um segmento de thread da CPU está selecionado. Nesse caso, o ponto de seleção é representado por uma seta preta ou um cursor, acima da linha do tempo. Quando um segmento de bloqueio é selecionado, o cursor do sistema não é exibido porque não houve nenhuma execução. No entanto, o segmento ainda está realçado e uma pilha de chamadas é exibida.

A guia Atual também exibe informações sobre segmentos de atividade do DirectX, marcadores e acesso de E/S. Para segmentos de atividade do DirectX, são exibidas informações sobre a forma como os pacotes DMA são processados pela fila de hardware. Para os marcadores, são exibidas informações sobre a descrição e o tipo de marcador. Para o acesso de E/S, são exibidas informações sobre o arquivo e o número de bytes lidos ou gravados.

Segmento vazio da linha do tempo

Na Visualização Simultânea, o motivo pelo qual uma seção da linha do tempo está vazia (tem uma tela de fundo branca) depende do tipo de canal.

  • Para um canal de thread de CPU, isso significa que o thread não existia durante esta parte da linha do tempo. Se estiver interessado no thread, você poderá encontrar sua seção de execução usando o controle de aplicação de zoom ou rolando horizontalmente.

  • Para um canal de E/S, significa que nenhum acesso ao disco ocorreu em nome do processo de destino no momento.

  • Para um canal do DirectX, significa que nenhum trabalho de GPU foi executado em nome do processo de destino durante esta parte da linha do tempo.

  • Para um canal de marcador, significa que nenhum marcador foi gerado.

Botão Exportar (Visualização Simultânea)

O botão Exportar permite que você exporte a pilha de chamadas como um arquivo .csv para seus próprios registros ou para uso com outra ferramenta como o Microsoft Excel.

Apenas meu código (exibição de threads)

Ao selecionar essa opção, a pilha de chamadas será filtrada para mostrar apenas o seu código e um nível das funções chamadas.

Ao ativar essa opção, é possível reduzir significativamente a complexidade da pilha de chamadas e talvez facilitar o diagnóstico de um problema específico.

Em alguns casos, a seleção dessa opção pode filtrar a chamada de bloqueio. Caso sejam necessários mais detalhes da pilha de chamadas completa para tomar essa decisão, desmarque essa opção para expor a pilha de chamadas completa.

Gerenciar canais

Em Exibição de Threads na Visualização Simultânea, você pode organizar os canais para o seu processo, de forma que você possa examinar padrões específicos. Você pode classificar os canais, movê-los para cima e para baixo, ocultá-los ou mostrá-los.

Classificar Por

Você pode usar o controle Classificar por para classificar os threads por critérios diferentes, com base no nível de zoom atual. Isso é especialmente útil quando você estiver procurando por um determinado padrão. Você pode classificar por estes critérios:

Critérios Definição
Hora de início Classifica os threads de acordo com os horários de início. Essa é a ordem de classificação padrão.
Hora de término Classifica os threads de acordo com os horários de término.
Execução Classifica os threads de acordo com o percentual de tempo gasto na execução.
Sincronização Classifica os threads de acordo com o percentual de tempo gasto na sincronização.
E/S Classifica os threads de acordo com o percentual de tempo gasto na entrada/saída (leitura e gravação de dados).
Modo de suspensão Classifica os threads de acordo com o percentual de tempo gasto no modo de suspensão.
Paginamento Classifica os threads de acordo com o percentual de tempo gasto na paginação.
Preempção Classifica os threads de acordo com o percentual de tempo gasto na preempção.
Processamento de interface do usuário Classifica os threads de acordo com o percentual de tempo gasto no processamento da interface do usuário.

Mover o canal selecionado para cima ou para baixo

Você pode usar esses controles para mover um canal para cima ou para baixo na lista. Por exemplo, você pode posicionar os canais relacionados próximos uns dos outros para ajudar você a examinar um padrão específico ou uma relação entre threads.

Mover o canal selecionado para a parte superior ou inferior

Você pode mover os canais selecionados para a parte superior ou inferior da lista para que você pode examinar um determinado padrão ou mover alguns canais para fora do caminho enquanto examina outros.

Ocultar canais selecionados

Escolha este controle quando quiser ocultar canais. Por exemplo, se um thread tiver 100 por cento da sincronização da vida útil de seu processo gerenciado, você poderá ocultá-lo ao analisar outros threads.

Observação

Ocultar um thread também o remove do horário de cálculo, que é mostrado na legenda ativa e nos relatórios do perfil.

Mostrar todos os canais

Esse controle é ativado quando um ou mais canais estão ocultos. Se você clicar nele, todos os elementos ocultos serão mostrados e retornados aos cálculos de tempo.

Mover marcadores para cima

Se um rastreamento tiver eventos de marcador, você poderá usar esse comando para mover os canais de marcador para o início da linha do tempo. Sua ordem relativa é preservada.

Agrupar marcadores por thread

Se um rastreamento tiver eventos de marcador, você poderá usar esse comando para os canais do marcador de grupo sob o thread que gerou os eventos do marcador. Os canais de disco são movidos para a parte superior da lista de canais e os canais GPU são movidos para a parte inferior.

Ativar/desativar modo de medida

Com essa ferramenta, é possível medir com precisão um período de tempo na linha do tempo. Para habilitar o modo de medida, clique no botão de medida (que tem um ícone de régua) e, em seguida, arraste a linha do tempo. Ao arrastar, observe que a área abaixo do ponteiro será realçada em amarelo e o tempo medido aparecerá na barra de ferramentas à direita do botão. Esse valor é calculado dinamicamente conforme você arrasta a fim de que seja possível ver imediatamente o quanto um determinado evento está demorando. Quando você soltar o botão do mouse, o valor temporal permanecerá visível.

É possível repetir o processo de medição, mas apenas a medida mais recente será mostrada. Clique no botão de medida novamente para desativar o modo de medida.

Porcentagem de redução do ruído

Por padrão, o valor da configuração de Percentual de Redução do Ruído é 2. Somente as entradas que têm um percentual de tempo inclusivo maior ou igual a essa configuração são mostradas na árvore de chamadas. Ao alterar a configuração, é possível controlar a quantidade de entradas mostradas na árvore de chamadas. Por exemplo, alterar o valor para 10 mostrará apenas as entradas da árvore chamada que têm um tempo inclusivo maior ou igual a 10%. Ao aumentar o valor da configuração, é possível se concentrar em entradas que têm maior impacto sobre o desempenho do processo.

Relatório com base no intervalo de tempo visível

O modo de exibição de perfil exibe relatórios com base no intervalo de tempo visível no momento e canais. Para ver detalhes de subconjuntos diferentes de dados, clique em itens na legenda.

Você pode encontrar mais informações sobre os dados nos Relatórios da tela Threads.

Conector pronto para thread

Ao clicar em um segmento de bloqueio para ver uma pilha de chamadas e sua pilha de desbloqueio, o conector pronto thread também pode aparecer. Se o evento desbloqueio ocorreu em outro thread no processo atual, o conector pronto para thread identificará visualmente o thread e o segmento de execução que habilitou o thread bloqueado para retomar a execução.

Cursor da linha do tempo

Ao selecionar um ponto na linha do tempo de um segmento de thread em execução, um cursor da Linha do tempo é exibido acima dele. A pilha de chamadas exibida na guia da pilha atual é a mais próxima em tempo ao local em que você clicou no segmento. O cursor é usado para associar a pilha de chamadas, que é exibida sob a guia Atual, com o instante em que uma amostra dela foi coletada. O cursor mostra o local exato da pilha de chamadas, que é a pilha de chamadas mais próxima ao local que o usuário selecionou.

Desbloquear pilha

Se o elemento de thread atualmente selecionado representa um segmento bloqueado que mais tarde começou a ser executado depois que foi desbloqueado por outro thread no processo atual, a pilha de chamadas do thread que fez o desbloqueio é mostrada nesta guia.

Perfil da linha do tempo visível

O Perfil da Linha de Tempo Visível para a Exibição de Bloqueio de Thread fornece informações estatísticas e links para relatórios. Conforme você amplia, reduz, rola horizontalmente, oculta ou mostra canais, os números na legenda ativa são alterados para refletir o que está atualmente no modo de exibição. Para exibir um relatório sobre um item na legenda, clique no item.

Controle de zoom (exibição de threads)

O controle de zoom é um controle deslizante que ajuda você a ampliar e reduzir a linha do tempo para que seja possível focar áreas de interesse específico. Uma vez que esse controle amplia o centro da exibição da linha do tempo, centralize a área de interesse antes de ampliá-la.

Ampliar arrastando a exibição da linha do tempo

Ampliar arrastando na exibição da linha do tempo cria uma área realçada em amarelo. Ao soltar o botão do mouse, a exibição da linha do tempo ampliará o intervalo selecionado.

Ampliar e reduzir usando a roda do mouse

Clique em qualquer ponto na linha do tempo (para garantir que tenha o foco do mouse), pressione Ctrl e mova a roda do mouse (para frente amplia; para trás reduz).