Partilhar via


Coletar diagnósticos em contêineres

As mesmas ferramentas de diagnóstico que são úteis para diagnosticar problemas do .NET em outros cenários também funcionam em contêineres do Docker. No entanto, algumas das ferramentas requerem etapas especiais para funcionar em um contêiner. Este artigo aborda como as ferramentas para coletar rastreamentos de desempenho e coletar dumps podem ser usadas em contêineres do Docker.

Usar ferramentas da CLI do .NET em um contêiner

Essas ferramentas se aplicam a: ✔️ SDK do .NET Core 3.1 e versões posteriores

As ferramentas de diagnóstico da CLI global do .NET (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor e dotnet-trace) são projetadas para funcionar em uma ampla variedade de ambientes e devem funcionar diretamente em contêineres do Docker. Por isso, essas ferramentas são o método preferencial de coleta de informações de diagnóstico para cenários .NET destinados ao .NET Core 3.1 ou posterior em contêineres.

Você também pode instalar essas ferramentas sem o SDK do .NET baixando as variantes de arquivo único dos links no parágrafo anterior. Essas instalações exigem uma instalação global do .NET runtime versão 3.1 ou posterior, que você pode adquirir seguindo qualquer um dos métodos prescritos na documentação de instalação do .NET ou consumindo qualquer um dos contêineres oficiais de tempo de execução.

Usar ferramentas globais da CLI do .NET em um contêiner de sidecar

Se você quiser usar as ferramentas de diagnóstico da CLI global do .NET para diagnosticar processos em um contêiner diferente, tenha em mente os seguintes requisitos adicionais:

  1. Os contêineres devem compartilhar um namespace de processo (para que as ferramentas no contêiner sidecar possam acessar processos no contêiner de destino).
  2. As ferramentas de diagnóstico da CLI global do .NET precisam acessar os arquivos que o tempo de execução do .NET grava no diretório /tmp, portanto, o diretório /tmp deve ser compartilhado entre o contêiner de destino e sidecar por meio de uma montagem de volume. Isso pode ser feito, por exemplo, fazendo com que os contêineres compartilhem um volume comum ou um volume emptyDir do Kubernetes. Se você tentar usar as ferramentas de diagnóstico de um contêiner sidecar sem compartilhar o diretório /tmp, receberá um erro sobre o processo "não está executando o tempo de execução compatível do .NET".

Utilização PerfCollect num recipiente

Esta ferramenta aplica-se a: ✔️ .NET Core 2.1 e versões posteriores

O PerfCollect script é útil para coletar rastreamentos de desempenho e é a ferramenta recomendada para coletar rastreamentos anteriores ao .NET Core 3.0. Se utilizar PerfCollect num recipiente, tenha em mente os seguintes requisitos:

  • PerfCollect requer recursos adicionais para executar a perf ferramenta. O conjunto mínimo de capacidades necessárias é PERFMON e SYS_PTRACE. Alguns ambientes requerem SYS_ADMIN. Certifique-se de iniciar o contêiner com os recursos necessários. Se o conjunto mínimo não funcionar, tente com o conjunto completo.

  • PerfCollect requer que algumas variáveis de ambiente sejam definidas antes do início do perfil do aplicativo. Eles podem ser definidos em um Dockerfile ou quando você inicia o contêiner. Como essas variáveis não devem ser definidas em ambientes normais de produção, é comum apenas adicioná-las ao iniciar um contêiner que será perfilado. As duas variáveis que o PerfCollect requer são:

    • DOTNET_PerfMapEnabled=1
    • 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.

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.

Utilização PerfCollect num contentor para sidecar

Se você quiser executar PerfCollect em um contêiner para criar o perfil de um processo .NET em um contêiner diferente, a experiência é quase a mesma. As diferenças são:

  • As variáveis de ambiente mencionadas anteriormente (DOTNET_PerfMapEnabled e DOTNET_EnableEventLog) devem ser definidas para o contêiner de destino (não para o que está sendo executado PerfCollect).
  • O contêiner em execução PerfCollect deve ter a SYS_ADMIN capacidade (não o contêiner de destino).
  • Os dois contêineres devem compartilhar um namespace de processo.