Partilhar via


Rastreie aplicativos .NET com PerfCollect

Este artigo aplica-se a: ✔️ SDK do .NET Core 2.1 e versões posteriores

Quando problemas de desempenho são encontrados no Linux, a coleta de um rastreamento pode perfcollect ser usada para coletar informações detalhadas sobre o que estava acontecendo na máquina no momento do problema de desempenho.

perfcollect é um script bash que usa Linux Trace Toolkit: next generation (LTTng) para coletar eventos escritos a partir do tempo de execução ou qualquer EventSource, bem como perf para coletar amostras de CPU do processo de destino.

Prepare a sua máquina

Siga estas etapas para preparar sua máquina para coletar um rastreamento de desempenho com perfcollecto .

Nota

Se você estiver capturando de dentro de um contêiner, ele deve ter os recursos apropriados. As capacidades mínimas necessárias são PERFMON e SYS_PTRACE. Se a captura falhar com o conjunto mínimo, adicione a SYS_ADMIN capacidade ao contêiner. Para obter mais informações sobre como rastrear aplicativos dentro de contêineres usando PerfCollect, consulte Coletar diagnósticos em contêineres.

  1. Baixar perfcollect.

    curl -OL https://aka.ms/perfcollect
    
  2. Torne o script executável.

    chmod +x perfcollect
    
  3. Pré-requisitos de rastreamento de instalação - estas são as bibliotecas de rastreamento reais.

    sudo ./perfcollect install
    

    Isso instalará os seguintes pré-requisitos em sua máquina:

    1. perf: o subsistema Linux Performance Events e o aplicativo complementar de coleção/visualizador de modo de usuário. perf faz parte da fonte do kernel Linux, mas geralmente não é instalado por padrão.

    2. LTTng: Usado para capturar dados de eventos emitidos em tempo de execução pelo CoreCLR. Esses dados são usados para analisar o comportamento de vários componentes de tempo de execução, como GC, JIT e pool de threads.

As versões recentes do .NET Core e da ferramenta Linux perf suportam a resolução automática de nomes de método para código de estrutura.

Para resolver nomes de método de DLLs de tempo de execução nativas (como libcoreclr.so), perfcollect resolverá símbolos para eles quando converter os dados, mas somente se os símbolos para esses binários estiverem presentes. Consulte Obtendo símbolos para a seção Native Runtime para obter detalhes.

Recolher um vestígio

  1. Tenha dois shells disponíveis - um para controlar o rastreamento, referido como [Trace], e outro para executar o aplicativo, referido como [App].

  2. [Rastreio] Inicie a recolha.

    sudo ./perfcollect collect sampleTrace
    

    Saída Esperada:

    Collection started.  Press CTRL+C to stop.
    
  3. [Aplicação] Configure o shell do aplicativo com as seguintes variáveis de ambiente - isso permite a configuração de rastreamento do CoreCLR.

    export DOTNET_PerfMapEnabled=1
    export DOTNET_EnableEventLog=1
    

    Nota

    Ao executar o aplicativo com o .NET 7, você também deve definir DOTNET_EnableWriteXorExecute=0 além das variáveis de ambiente anteriores. Por exemplo:

    export DOTNET_EnableWriteXorExecute=0
    

    Nota

    O .NET 6 padroniza o prefixo DOTNET_ em vez de variáveis de ambiente que configuram o comportamento em tempo de execução do COMPlus_ .NET. No entanto, o prefixo COMPlus_ continuará a funcionar. Se você estiver usando uma versão anterior do tempo de execução do .NET, ainda deverá usar o prefixo COMPlus_ para variáveis de ambiente.

  4. [Aplicação] Execute o aplicativo - deixe-o funcionar o tempo que você precisar para capturar o problema de desempenho. O comprimento exato pode ser tão curto quanto você precisa, desde que capture suficientemente a janela de tempo onde o problema de desempenho que você deseja investigar ocorre.

    dotnet run
    
  5. [Rastreio] Parar coleta - pressione CTRL+C.

    ^C
    ...STOPPED.
    
    Starting post-processing. This may take some time.
    
    Generating native image symbol files
    ...SKIPPED
    Saving native symbols
    ...FINISHED
    Exporting perf.data file
    ...FINISHED
    Compressing trace files
    ...FINISHED
    Cleaning up artifacts
    ...FINISHED
    
    Trace saved to sampleTrace.trace.zip
    

    O arquivo de rastreamento compactado agora é armazenado no diretório de trabalho atual.

Ver um rastreio

Há várias opções para visualizar o rastreamento que foi coletado. Os rastreamentos são melhor visualizados usando o PerfView no Windows, mas podem ser visualizados diretamente no Linux usando PerfCollect ele mesmo ou TraceCompass.

Use PerfCollect para exibir o arquivo de rastreamento

Você pode usar o próprio perfcollect para exibir o rastreamento coletado. Para fazer isso, use o seguinte comando:

./perfcollect view sampleTrace.trace.zip

Por padrão, isso mostrará o rastreamento da CPU do aplicativo usando perfo .

Para ver os eventos que foram coletados via LTTng, você pode passar na bandeira -viewer lttng para ver os eventos individuais:

./perfcollect view sampleTrace.trace.zip -viewer lttng

Isso usará babeltrace o visualizador para imprimir a carga útil dos eventos:

# [01:02:18.189217659] (+0.020132603) ubuntu-xenial DotNETRuntime:ExceptionThrown_V1: { cpu_id = 0 }, { ExceptionType = "System.Exception", ExceptionMessage = "An exception happened", ExceptionEIP = 139875671834775, ExceptionHRESULT = 2148734208, ExceptionFlags = 16, ClrInstanceID = 0 }
# [01:02:18.189250227] (+0.020165171) ubuntu-xenial DotNETRuntime:ExceptionCatchStart: { cpu_id = 0 }, { EntryEIP = 139873639728404, MethodID = 139873626968120, MethodName = "void [helloworld] helloworld.Program::Main(string[])", ClrInstanceID = 0 }

Use PerfView para abrir o arquivo de rastreamento

Para ver uma exibição agregada do exemplo de CPU e dos eventos, você pode usar PerfView em uma máquina Windows.

  1. Copie o arquivo trace.zip do Linux para uma máquina Windows.

  2. Baixar PerfView de https://aka.ms/perfview.

  3. Execute o PerfView.exe

    PerfView.exe <path to trace.zip file>
    

O PerfView exibirá a lista de modos de exibição suportados com base nos dados contidos no arquivo de rastreamento.

  • Para investigações de CPU, escolha pilhas de CPU.

  • Para obter informações detalhadas sobre GC, escolha GCStats.

  • Para obter informações JIT por processo/módulo/método, escolha JITStats.

  • Se não houver uma exibição para as informações necessárias, você pode tentar procurar os eventos na visualização de eventos brutos. Escolha Eventos.

Para obter mais informações sobre como interpretar modos de exibição no PerfView, consulte os links de ajuda no próprio modo de exibição ou, na janela principal do PerfView, escolha Guia do usuário da Ajuda>.

Nota

Os eventos escritos via System.Diagnostics.Tracing.EventSource API (incluindo os eventos do Framework) não aparecerão sob o nome do provedor. Em vez disso, eles são escritos como EventSourceEvent eventos sob Microsoft-Windows-DotNETRuntime o provedor e suas cargas úteis são serializadas JSON.

Nota

Se você observar [unknown] /memfd:doublemapper quadros em nomes de método e pilhas de chamadas, defina DOTNET_EnableWriteXorExecute=0 antes de executar o aplicativo que você está rastreando com perfcollect.

Use o TraceCompass para abrir o arquivo de rastreamento

O Eclipse TraceCompass é outra opção que você pode usar para visualizar os rastreamentos. TraceCompass funciona também em máquinas Linux, por isso não precisa de mover o seu rastreio para uma máquina Windows. Para usar TraceCompass para abrir o arquivo de rastreamento, você precisará descompactar o arquivo.

unzip myTrace.trace.zip

perfcollect salvará o rastreamento LTTng coletado em um formato de arquivo CTF em um subdiretório no lttngTrace. Especificamente, o arquivo CTF estará localizado em um diretório que se parece lttngTrace/auto-20201025-101230\ust\uid\1000\64-bit\com .

Você pode abrir o arquivo de rastreamento CTF selecionando e selecionando TraceCompassFile -> Open Trace o metadata arquivo.

Para obter mais detalhes, consulte a TraceCompass documentação.

Obter símbolos para o tempo de execução nativo

Na maioria das vezes você está interessado em seu próprio código, que perfcollect resolve por padrão. Às vezes, é útil ver o que está acontecendo dentro das DLLs .NET (que é o que a última seção foi sobre), mas às vezes o que está acontecendo nas dlls de tempo de execução nativas (normalmente libcoreclr.so), é interessante. perfcollect resolverá os símbolos para estes quando converter seus dados, mas somente se os símbolos para essas DLLs nativas estiverem presentes (e estiverem ao lado da biblioteca para a qual eles estão).

Há um comando global chamado dotnet-symbol que faz isso. Para usar dotnet-symbol para obter símbolos de tempo de execução nativos:

  1. Instalar dotnet-symbol:

    dotnet tool install -g dotnet-symbol
    
  2. Faça o download dos símbolos. Se sua versão instalada do tempo de execução do .NET Core for 2.1.0, o comando para fazer isso é:

    mkdir mySymbols
    dotnet symbol --symbols --output mySymbols  /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0/lib*.so
    
  3. Copie os símbolos para o local correto.

    sudo cp mySymbols/* /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.0
    

    Se isso não puder ser feito porque você não tem acesso de gravação ao diretório apropriado, você pode usar perf buildid-cache para adicionar os símbolos.

Depois disso, você deve obter nomes simbólicos para as dlls nativas quando executar perfcollecto .

Coletar em um contêiner do Docker

Para obter mais informações sobre como usar perfcollect em ambientes de contêiner, consulte Coletar diagnósticos em contêineres.

Saiba mais sobre as opções de coleção

Você pode especificar os seguintes sinalizadores opcionais para perfcollect melhor atender às suas necessidades de diagnóstico.

Recolher por uma duração específica

Quando você deseja coletar um rastreamento para uma duração específica, você pode usar -collectsec a opção seguida por um número especificando o total de segundos para coletar um rastreamento.

Coletar rastreamentos de threadtime

A especificação -threadtime com perfcollect permite coletar dados de uso da CPU por thread. Isso permite que você analise onde cada thread estava gastando seu tempo de CPU.

Colete rastreamentos para memória gerenciada e desempenho do coletor de lixo

As opções a seguir permitem coletar especificamente os eventos GC do tempo de execução.

  • perfcollect collect -gccollectonly

Colete apenas um conjunto mínimo de eventos GC Collection. Este é o perfil de coleta de eventos de GC menos detalhado com o menor impacto no desempenho do aplicativo de destino. Este comando é análogo ao PerfView.exe /GCCollectOnly collect comando no PerfView.

  • perfcollect collect -gconly

Colete mais eventos detalhados de coleta de GC com eventos JIT, Loader e Exception. Isso solicita eventos mais detalhados (como as informações de alocação e as informações de associação de GC) e terá mais impacto no desempenho do aplicativo de destino do que -gccollectonly a opção. Este comando é análogo ao PerfView.exe /GCOnly collect comando no PerfView.

  • perfcollect collect -gcwithheap

Colete os eventos de coleta de GC mais detalhados, que também rastreiam a sobrevivência e os movimentos da pilha. Isso fornece uma análise aprofundada do comportamento do GC, mas incorrerá em alto custo de desempenho, pois cada GC pode levar mais de duas vezes mais. É recomendável entender a implicação de desempenho do uso dessa opção de rastreamento ao rastrear em ambientes de produção.