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:
- 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).
- 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 aperf
ferramenta. O conjunto mínimo de capacidades necessárias éPERFMON
eSYS_PTRACE
. Alguns ambientes requeremSYS_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
eDOTNET_EnableEventLog
) devem ser definidas para o contêiner de destino (não para o que está sendo executadoPerfCollect
). - O contêiner em execução
PerfCollect
deve ter aSYS_ADMIN
capacidade (não o contêiner de destino). - Os dois contêineres devem compartilhar um namespace de processo.