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 perfcollect
o .
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.
Baixar
perfcollect
.curl -OL https://aka.ms/perfcollect
Torne o script executável.
chmod +x perfcollect
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:
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.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
Tenha dois shells disponíveis - um para controlar o rastreamento, referido como [Trace], e outro para executar o aplicativo, referido como [App].
[Rastreio] Inicie a recolha.
sudo ./perfcollect collect sampleTrace
Saída Esperada:
Collection started. Press CTRL+C to stop.
[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 doCOMPlus_
.NET. No entanto, o prefixoCOMPlus_
continuará a funcionar. Se você estiver usando uma versão anterior do tempo de execução do .NET, ainda deverá usar o prefixoCOMPlus_
para variáveis de ambiente.[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
[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 perf
o .
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.
Copie o arquivo trace.zip do Linux para uma máquina Windows.
Baixar PerfView de https://aka.ms/perfview.
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 TraceCompass
File -> 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:
Instalar
dotnet-symbol
:dotnet tool install -g dotnet-symbol
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
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 perfcollect
o .
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.