Analisar o desempenho ao usar a criação de perfil de CPU no Criador de Perfil de Desempenho (C#, Visual Basic, C++ e F#)

Uma boa maneira de começar a investigação de problemas de desempenho nos aplicativos é compreender a utilização da CPU ao usar um criador de perfil da CPU. A ferramenta de desempenho Uso da CPU mostra o tempo de CPU e o percentual gasto executando código em C++, C#/Visual Basic.

A ferramenta Uso da CPU pode ajudá-lo a:

  • Diagnosticar uma lentidão ou um travamento de processo na base de código da sua equipe. A ferramenta pode ajudá-lo a diagnosticar o problema com o código de produção da sua equipe. A ferramenta fornece insights automáticos e várias exibições de seus dados para que você possa analisar e diagnosticar problemas de desempenho.

  • Identificar problemas de desempenho em cenários de DevOps, como quando um cliente relata que algumas solicitações ou ordens não estão chegando ao site de varejo durante a alta temporada. Muitas vezes, os problemas estão na produção e é desafiador depurar naquele momento, mas essa ferramenta pode ajudá-lo a capturar informações e evidências suficientes do problema. Depois de coletar um arquivo de rastreamento, a análise pode ajudá-lo rapidamente a entender possíveis causas e fornecer sugestões dentro do contexto do código para que você possa executar as próximas etapas para corrigir o problema.

  • Se o problema de latência não estiver dentro de uma solicitação de API, você poderá verificar se há alta utilização da CPU e outros problemas relacionados com a ferramenta Uso da CPU. A ferramenta Uso da CPU pode ajudá-lo a identificar gargalos para que você possa restringir onde otimizar.

A ferramenta Uso da CPU é útil para as sessões de rastreamento locais e para a produção. A ferramenta Uso da CPU também pode ser iniciada usando o atalho de teclado Alt+F2 e, em seguida, escolhendo Uso da CPU ou abrindo um rastreamento já coletado usando uma ferramenta como dotnet-trace ou dotnet-monitor. (Para o código de produção .NET, é mais provável que você colete rastreamentos.)

A ferramenta Uso da CPU pode ser executada em um projeto aberto do Visual Studio, em um aplicativo instalado da Microsoft Store ou anexada a um aplicativo ou a um processo em execução. É possível executar a ferramenta Uso da CPU com ou sem depuração. Para obter mais informações, confira Executar ferramentas de criação de perfil com ou sem o depurador.

As instruções a seguir mostram como usar a ferramenta Uso da CPU sem o depurador, usando o Criador de Perfil de Desempenho do Visual Studio. Os exemplos usam um build de versão em um computador local. Builds de versão fornecem a melhor exibição do desempenho real do aplicativo. Para obter um tutorial que demonstra como melhorar o desempenho ao usar a ferramenta Uso da CPU, confira Guia para iniciantes sobre como otimizar o código.

Geralmente, o computador local replica melhor a execução do aplicativo instalado. Para coletar dados de um dispositivo remoto, execute o aplicativo diretamente no dispositivo, não por meio de uma Conexão de Área de Trabalho Remota.

Coleção de dados de utilização da CPU

  1. No projeto do Visual Studio, defina a configuração da solução como Versão e selecione Depurador Local do Windows (ou Computador local) como o destino de implantação.

    Captura de tela que mostra Select Release e Local Machine.

    Captura de tela que mostra Selecionar lançamento e Computador local.

  2. Selecione Depurar>Criador de Perfil de Desempenho.

  3. Em Ferramentas disponíveis, selecione Uso da CPU e, em seguida, selecione Iniciar.

    Captura de tela mostrando Selecionar uso da CPU.

    Captura de tela mostrando Selecionar uso da CPU.

    Se você habilitar a opção Iniciar com a coleção pausada antes de iniciar o criador de perfil, os dados não serão coletados até que você selecione o botão Gravar no modo de exibição de sessão de diagnóstico.

    Observação

    Para obter mais informações sobre como tornar a ferramenta mais eficiente, consulte Otimizando as configurações do Criador de Perfil.

  4. Depois que o aplicativo for iniciado, a sessão de diagnóstico será iniciada e exibirá os dados de utilização da CPU. Quando tiver terminado de coletar os dados, selecione Interromper Coleta.

    Captura de tela mostrando a coleta de dados Interromper o uso da CPU.

    Captura de tela que mostra a coleta de dados Interromper o uso da CPU.

    A ferramenta Uso da CPU analisa os dados e exibe o relatório. Se você tiver problemas para coletar ou exibir dados, confira Solucionar erros de criação de perfil e corrigir problemas.

    Captura de tela mostrando o relatório de uso da CPU.

    Captura de tela que mostra o relatório de uso da CPU.

    Use o menu suspenso Filtrar para marcar ou desmarcar os threads a serem exibidos e use a caixa Pesquisar para procurar um thread ou um nó específico.

Colunas de dados de utilização da CPU

Nome Descrição
CPU total [unidade, %] Total % data equation

Os milissegundos e o percentual da CPU usados por chamadas à função e as funções chamadas por ela, no intervalo de tempo selecionado. Isso é diferente do grafo de linha de tempo Uso da CPU, que compara a atividade total da CPU em um intervalo de tempo com a CPU total disponível.
CPU própria [unidade, %] Equação %

Os milissegundos e o percentual da CPU usados por chamadas à função no intervalo de tempo selecionado, excluindo funções chamadas pela função.
Módulo Em alguns modos de exibição, a coluna Módulo é mostrada, a qual mostra o nome do módulo que contém a função.

Analisar insights da CPU

Para analisar os principais insights, as principais funções e o caminho crítico, consulte Insights da CPU.

Análise da utilização da CPU

Para analisar o relatório de Uso da CPU, clique em Abrir detalhes ou clique em uma das principais funções para abrir a visualização Funções.

O relatório fornece diferentes exibições dos dados de diagnóstico:

  • Chamador/Computador chamado
  • Árvore de chamadas
  • Módulos
  • Funções
  • Grafo de chama

Para analisar o relatório, clique em Criar relatório detalhado.

O relatório fornece diferentes exibições dos dados de diagnóstico:

  • Chamador/Computador chamado
  • Árvore de chamadas

Em todos os modos de exibição, exceto Chamador/Computador chamado, o relatório de diagnóstico é classificado pela CPU Total, da mais alta para a mais baixa. Altere a ordem de classificação ou a coluna de classificação selecionando os cabeçalhos de coluna. Você pode clicar duas vezes em uma função na qual está interessado e verá a fonte da função, bem como realçar que mostra onde o tempo é gasto nessa função. A tabela mostra colunas com dados como o tempo gasto na função, incluindo funções chamadas (CPU total) e uma segunda coluna que mostra o tempo gasto em uma função, excluindo as funções chamadas (Auto CPU).

Esses dados podem ajudá-lo a avaliar se a própria função é um gargalo de desempenho. Determine quantos dados o método está exibindo para ver se o código de terceiros ou as bibliotecas de runtime são o motivo para seus pontos de extremidade estarem lentos ou pesados no consumo de recursos.

Para obter mais informações sobre como usar o Flame Graph, consulte Identificar caminhos críticos com o Flame Graph.

Árvore de chamadas de uso da CPU

Para exibir a árvore de chamadas, selecione o nó pai no relatório. Por padrão, a página Uso da CPU é aberta no modo de exibição Chamador/Computador chamado. Na lista suspensa Exibição Atual, selecione Árvore de Chamadas.

Você pode clicar nos botões Expandir Caminho crítico e Mostrar Caminho crítico para ver as chamadas de função que usam a porcentagem mais alta da CPU no modo de exibição de árvore de chamadas.

Estrutura da árvore de chamadas

Captura de tela mostrando a estrutura da árvore de chamadas.

Captura de tela mostrando a estrutura da árvore de chamadas.

Imagem Descrição
Etapa 1 O nó de nível superior nas árvores de chamadas de Uso da CPU é um pseudonó.
Etapa 2 Na maioria dos aplicativos, quando a opção Mostrar Código Externo está desabilitada, o nó de segundo nível é um [Código Externo]. O nó contém o código do sistema e do framework que inicia e interrompe o aplicativo, elabora a interface do usuário, controla o agendamento de threads e fornece ao aplicativo outros serviços de nível baixo.
Etapa 3 Os filhos do nó de segundo nível são métodos e rotinas assíncronas do código de usuário que são chamados ou criados pelo sistema de segundo nível e código do framework.
Etapa 4 Os nós filhos de um método só têm dados das chamadas do método pai. Quando Mostrar Código Externo é desabilitado, os métodos de aplicativo também podem conter um nó [Código Externo].

Código externo

As funções do sistema e do framework executadas pelo seu código são chamadas código externo. As funções do código externo iniciam e interrompem o aplicativo, elaboram a interface do usuário, controlam o threading e fornecem ao aplicativo outros serviços de nível inferior. Na maioria dos casos, você não se interessa pelo código externo, então, a árvore de chamadas de Uso da CPU coleta as funções externas de um método de usuário em um nó [Código Externo].

Para exibir os caminhos de chamada do código externo, alterne o modo de exibição atual para o modo de exibição Árvore de Chamadas ou clique com o botão direito do mouse e selecione Exibir na Árvore de Chamadas.

Captura de tela mostrando Exibir na árvore de chamada.

Para exibir os caminhos de chamada do código externo, na página principal do relatório de diagnóstico (painel direito), selecione Mostrar Código Externo na lista suspensa Filtrar e, em seguida, selecione Aplicar. O modo de exibição de Árvore de Chamadas da página Uso da CPU expande as chamadas de código externo. (A lista suspensa Filtrar está disponível na página principal do diagnóstico, não nas exibições detalhadas.)

Captura de tela mostrando Exibir código externo.

Muitas cadeias de chamadas de código externo são muito aninhadas; portanto, a largura da cadeia pode exceder a largura de exibição da coluna Nome da Função. Em seguida, os nomes de função aparecem conforme mostrado na imagem a seguir.

Captura de tela mostrando o código externo aninhado na árvore de chamadas.

Muitas cadeias de chamadas de código externo são muito aninhadas; portanto, a largura da cadeia pode exceder a largura de exibição da coluna Nome da Função. Os nomes de função são exibidos como ....

Captura de tela mostrando o código externo aninhado na árvore de chamadas.

Para localizar um nome de função que você está procurando, use a caixa de pesquisa. Passe o mouse sobre a linha selecionada ou use a barra de rolagem horizontal para exibir os dados.

Captura de tela mostrando Pesquisar código externo aninhado.

Captura de tela mostrando Pesquisar código externo aninhado.

Funções assíncronas na árvore de chamadas do Uso da CPU

Quando o compilador encontra um método assíncrono, ele cria uma classe oculta para controlar a execução do método. Conceitualmente, a classe é uma máquina de estado. A classe tem funções geradas por compilador que chamam os métodos originais de maneira assíncrona e os retornos de chamada, agendadores e iteradores necessários para executá-los. Quando um método pai chama o método original, o compilador remove o método do contexto de execução do pai e executa os métodos de classe ocultos no contexto do código do sistema e da estrutura que controla a execução do aplicativo. Os métodos assíncronos são geralmente, mas nem sempre, executados em uma ou mais segmentos diferentes. Esse código é exibido na árvore de chamadas Uso da CPU como filhos do nó [Código Externo] imediatamente embaixo do nó superior da árvore.

No exemplo a seguir, os primeiros dois nós em [Código Externo] são os métodos gerados por compilador da classe da máquina de estado. O terceiro nó é a chamada ao método original.

Captura de tela mostrando o nó assíncrono.

Expanda os métodos gerados para mostrar o que está acontecendo:

Captura de tela mostrando o nó assíncrono expandido.

Captura de tela mostrando o nó assíncrono expandido.

  • MainPage::GetMaxNumberAsyncButton_Click apenas gerencia uma lista de valores da tarefa, calcula o máximo de resultados e exibe a saída.

  • MainPage+<GetMaxNumberAsyncButton_Click>d__3::MoveNext mostra a atividade necessária para agendar e iniciar as 48 tarefas que encapsulam a chamada para GetNumberAsync.

  • MainPage::<GetNumberAsync>b__b mostra a atividade das tarefas que chamam GetNumber.

Coletar contagens de chamadas (.NET)

Para visualizar as contagens de chamadas na exibição Funções, ative a configuração antes de iniciar o criador de perfil. Essa configuração é compatível com os tipos de projeto do .NET e requer a inicialização do processo no criador de perfil. O cenário de anexação não é compatível.

  1. Selecione o ícone Configurações para Uso da CPU no Criador de Perfil de Desempenho.

    Captura de tela mostrando o ícone de configurações para uso da CPU.

  2. Habilite a opção Coletar contagens de chamadas (somente .NET).

    Captura de tela mostrando as configurações de uso da CPU.

  3. Coletar dados de uso da CPU.

  4. Abra a exibição de Funções e verifique se a coluna Contagem de chamadas está definida como visível.

    Se você não vir a coluna, clique com o botão direito do mouse em um título de coluna para escolher colunas visíveis.

    Captura de tela mostrando dados de contagem de chamadas.