Raccogliere i dati di diagnostica in contenitori
Gli stessi strumenti di diagnostica utili per diagnosticare i problemi .NET in altri scenari funzionano anche nei contenitori Docker. Tuttavia, alcuni degli strumenti richiedono passaggi speciali per funzionare in un contenitore. Questo articolo illustra come usare gli strumenti per raccogliere tracce delle prestazioni e dump nei contenitori Docker.
Usare gli strumenti dell'interfaccia della riga di comando di .NET in un contenitore
Questi strumenti si applicano a: ✔️ .NET Core 3.1 SDK e versioni successive
Gli strumenti di diagnostica dell'interfaccia della riga di comando globale .NET (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor e dotnet-trace sono progettati per funzionare in un'ampia gamma di ambienti e dovrebbero funzionare tutti direttamente nei contenitori Docker. Per questo motivo, questi strumenti sono il metodo preferito per raccogliere informazioni di diagnostica per gli scenari .NET destinati a .NET Core 3.1 o versione successiva nei contenitori.
È anche possibile installare questi strumenti senza .NET SDK scaricando le varianti a file singolo dai collegamenti nel paragrafo precedente. Queste installazioni richiedono un'installazione globale del runtime .NET versione 3.1 o successiva, che è possibile acquisire seguendo uno dei metodi indicati nella documentazione di installazione di .NET o usando uno dei contenitori di runtime ufficiali.
Usare gli strumenti dell'interfaccia della riga di comando globali .NET in un contenitore sidecar
Se si desidera utilizzare gli strumenti di diagnostica dell'interfaccia della riga di comando globali .NET per diagnosticare i processi in un contenitore diverso, tenere presenti i requisiti aggiuntivi seguenti:
- I contenitori devono condividere uno spazio dei nomi dei processi, in modo che gli strumenti nel contenitore sidecar possano accedere ai processi nel contenitore di destinazione.
- Gli strumenti di diagnostica dell'interfaccia della riga di comando globale .NET devono accedere ai file che il runtime .NET scrive nella directory /tmp, quindi la directory /tmp deve essere condivisa tra il contenitore di destinazione e sidecar tramite un montaggio del volume. A tale scopo, ad esempio, è possibile fare in modo che i contenitori condividano un volume comune o un volume emptyDir Kubernetes. Se si tenta di usare gli strumenti di diagnostica da un contenitore sidecar senza condividere la directory /tmp, verrà visualizzato un errore che indica che il processo non esegue un runtime .NET compatibile.
Usare PerfCollect
in un contenitore
Questo strumento si applica a: ✔️ .NET Core 2.1 e versioni successive
Lo script PerfCollect
è utile per raccogliere tracce delle prestazioni ed è lo strumento consigliato per la raccolta di tracce prima di .NET Core 3.0. Se si usa PerfCollect
in un contenitore, tenere presenti i requisiti seguenti:
PerfCollect
richiede funzionalità aggiuntive per eseguire lo strumentoperf
. Il set minimo di funzionalità necessarie èPERFMON
eSYS_PTRACE
. Alcuni ambienti richiedonoSYS_ADMIN
. Assicurarsi di avviare il contenitore con le funzionalità necessarie. Se il set minimo non funziona, provare con il set completo.PerfCollect
Richiede l'impostazione di alcune variabili di ambiente prima dell'avvio dell'app che sta profilando. Questi possono essere impostati in un Dockerfile o all'avvio del contenitore. Poiché queste variabili non devono essere impostate in ambienti di produzione normali, è comune aggiungerle solo all'avvio di un contenitore che verrà profilato. Le due variabili richieste da PerfCollect sono:DOTNET_PerfMapEnabled=1
DOTNET_EnableEventLog=1
Nota
Quando si esegue l'app con .NET 7, è anche necessario impostare DOTNET_EnableWriteXorExecute=0
oltre alle variabili di ambiente precedenti.
Nota
.NET 6 standardizza il prefisso DOTNET_
anziché quello di COMPlus_
per le variabili di ambiente che configurano il comportamento in fase di esecuzione di .NET. Tuttavia, il prefisso diCOMPlus_
continuerà a funzionare. Se si usa una versione precedente del runtime .NET, è comunque consigliabile usare il prefisso COMPlus_
per le variabili di ambiente.
Usare PerfCollect
in un contenitore sidecar
Se si desidera eseguire PerfCollect
in un contenitore per profilare un processo .NET in un contenitore diverso, l'esperienza è quasi la stessa. Le differenze sono le seguenti:
- Le variabili di ambiente indicate in precedenza (
DOTNET_PerfMapEnabled
eDOTNET_EnableEventLog
) devono essere impostate per il contenitore di destinazione (non quello che eseguePerfCollect
). - Il contenitore che esegue
PerfCollect
deve avere la funzionalitàSYS_ADMIN
(non il contenitore di destinazione). - I due contenitori devono condividere uno spazio dei nomi dei processi.