Aprimoramentos de diagnóstico no .NET Core 3.0

No .NET Core 3.0, apresentamos um conjunto de ferramentas que aproveitam os novos recursos do ambiente de tempo de execução .NET que simplificam o diagnóstico e a resolução de problemas de desempenho.

Esses recursos ajudarão você a responder a algumas perguntas comuns de diagnóstico que você possa ter:

  1. Meu aplicativo está operacional?
  2. Por que meu aplicativo tem comportamento anormal?
  3. Por que meu aplicativo falha?



Meu aplicativo está operacional?


Com o tempo, um vazamento de memória pode ocorrer no aplicativo, o que leva a uma OutOfMemoryException. Em outros casos, algum código problemático pode levar a um salto na carga do processador. Esses são apenas alguns dos problemas que você pode identificar ativamente com as métricas .

Métricas


Métricas são dados de medição durante um período de tempo. Essas métricas permitem monitorar o estado do seu sistema em um nível alto. Diferentemente do .NET Framework no Windows, o .NET Core não gera contadores de desempenho. Em vez disso, introduzimos uma nova maneira de gerar métricas no .NET Core por meio da API EventCounter .

Os EventCounters oferecem uma melhoria em relação aos contadores de desempenho do Windows, pois agora são usados ​​em todos os sistemas operacionais que suportam o .NET Core. Além disso, diferentemente dos contadores de desempenho, eles também podem ser usados ​​em ambientes de baixo privilégio (por exemplo, ao implantar o xcopy). Infelizmente, a falta de uma ferramenta como o Performance Monitor (perfmon) dificulta a exibição desses indicadores em tempo real.

contadores de ponto
Na 3.0-preview5, apresentamos uma nova ferramenta de linha de comando para monitorar métricas geradas pelos aplicativos .NET Core em tempo real.

Você pode instalar esta ferramenta executando o seguinte comando

dotnet tool install --global dotnet-counters --version 1.0.3-preview5.19251.2 

No exemplo abaixo, vemos que a carga da CPU e a memória de nosso aplicativo aumentam quando começamos a carregar em nosso aplicativo Web.



Para obter instruções detalhadas sobre como usar essa ferramenta, consulte o arquivo leia - me no projeto com contadores dotnet . Para conhecer as limitações conhecidas dos contadores de dotnet, observe os problemas em aberto no GitHub .

Por que meu aplicativo tem comportamento anormal?


Embora as métricas ajudem a identificar a ocorrência de comportamento anormal, elas oferecem pouca compreensão do que deu errado. Para responder à pergunta por que seu aplicativo tem comportamento anormal, você precisa coletar informações adicionais por meio de rastreios. Por exemplo, os Perfis de CPU coletados usando rastreamentos podem ajudar a determinar o caminho ativo no seu código.

Rastrear


Rastreios são registros de eventos discretos com registro de data e hora fixos. Os rastreamentos contêm um contexto local que permite determinar melhor o destino do sistema. Tradicionalmente, o .NET Framework (e estruturas como o ASP.NET) geram rastreamentos de diagnóstico sobre seus componentes internos usando o ETW (Rastreamento de Eventos para Windows). No .NET Core, esses rastreamentos foram registrados no ETW para Windows e no LTTng para Linux.

dotnet-trace

Na versão 3.0-preview5, cada aplicativo .NET Core abre um canal duplex chamado EventPipe (um soquete de domínio Unix no * nix ou um pipe nomeado no Windows) através do qual pode enviar eventos. Enquanto ainda estamos trabalhando no protocolo do controlador, o dotnet-trace implementa uma versão preliminar deste protocolo.

Você pode instalar esta ferramenta executando o seguinte comando

 dotnet tool install --global dotnet-trace--version 1.0.3-preview5.19251.2 



No exemplo acima, eu executo um rastreamento dotnet com um perfil padrão que inclui eventos de criação de perfil de CPU e eventos .NET de tempo de execução.

Além dos eventos padrão, você pode habilitar provedores adicionais com base no estudo que você está tentando executar.

Como resultado da execução do rastreamento do dotnet, você obtém um arquivo .netperf. Esse arquivo contém eventos de tempo de execução e de busca da pilha da CPU que podem ser visualizados no perfview . A próxima atualização do Visual Studio (16.1) também adicionará suporte para visualizar esses rastreamentos.



Se você estiver executando o OS X ou Linux, poderá converter arquivos .netperf em arquivos .speedscope.json que podem ser renderizados usando o Speedscope.app ao gravar rastreamentos .
Você pode converter um rastreio existente executando o seguinte comando:

 dotnet trace convert <input-netperf-file> 

A imagem abaixo mostra um diagrama que visualiza o rastreamento que acabamos de receber.



Para obter instruções detalhadas sobre como usar essa ferramenta, consulte o arquivo leia - me . Para limitações conhecidas do dotnet-trace, consulte os problemas em aberto no GitHub .

Por que meu aplicativo falha?


Em alguns casos, não é possível estabelecer a causa do comportamento anormal simplesmente monitorando o processo. No caso de uma falha do processo ou de situações em que possamos precisar de informações adicionais, como acesso a todo o heap do processo, um despejo de processo pode ser mais adequado para análise.

Análise de despejo


Um dump é um registro do estado da memória virtual de trabalho de um processo, geralmente capturada quando foi finalizada inesperadamente. Os diagnósticos de despejo do kernel são comumente usados ​​para identificar as causas de falhas do aplicativo ou comportamento inesperado.

Tradicionalmente, você confiava no seu sistema operacional para receber um despejo quando um aplicativo travava (por exemplo, relatórios de erro do Windows) ou usava uma ferramenta como procdump para capturar um despejo quando certos critérios de inicialização eram atendidos.

Até agora, o problema com o dump dump usando o .NET no Linux foi que o dump dump usando o gcore ou o depurador levou a dumps muito grandes, porque as ferramentas existentes não sabiam quais páginas da memória virtual aparar no processo do .NET Core.

Além disso, era difícil analisar esses despejos mesmo depois de coletá-los, porque era necessário comprar um depurador e configurá-lo para carregar o sos, uma extensão de depurador para .NET.

dotnet-dump

No 3.0.0-preview5, apresentamos uma nova ferramenta que permite coletar e analisar despejos de processo no Windows e Linux.

O dotnet-dump ainda está em desenvolvimento ativo, e a tabela abaixo mostra quais recursos são suportados atualmente em quais sistemas operacionais.



Você pode instalar esta ferramenta executando o seguinte comando

 dotnet tool install --global dotnet-dump --version 1.0.3-preview5.19251.2 

Depois de instalar o dotnet-dump, você pode capturar o dump do processo executando o seguinte comando

 sudo $HOME/.dotnet/tools/dotnet-dump collect -p <pid> 

No Linux, o dump resultante pode ser analisado carregando o dump resultante com o seguinte comando

 dotnet dump analyze <dump-name> 

No exemplo a seguir, estou tentando definir um dump do ASP.NET Core Hosting Environment



Para obter instruções detalhadas sobre como usar essa ferramenta, consulte o arquivo leia - me. Para limitações conhecidas do dotnet-dump, consulte os problemas abertos no GitHub .

Conclusão


Obrigado por testar as novas ferramentas de diagnóstico no .NET Core 3.0. Continue nos dando feedback, seja nos comentários ou no GitHub . Ouvimos atentamente e faremos alterações com base nos seus comentários.

Source: https://habr.com/ru/post/pt451372/


All Articles