Raccogliere i dati di diagnostica in contenitori
Gli stessi strumenti di diagnostica utili per la diagnosi dei problemi di .NET Core 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.
Uso degli 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 globali di .NET Core (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor e dotnet-trace) sono progettati per funzionare in un'ampia gamma di ambienti e dovrebbero tutti funzionare direttamente nei contenitori Docker. Per questo motivo, questi strumenti sono il metodo preferito per raccogliere informazioni di diagnostica per gli scenari .NET Core destinati a .NET Core 3.1 o versioni successive 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.
Uso degli strumenti dell'interfaccia della riga di comando globali di .NET Core in un contenitore sidecar
Per usare gli strumenti di diagnostica dell'interfaccia della riga di comando globali di .NET Core 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 globali di .NET Core devono accedere ai file che il runtime di .NET Core scrive nella directory /tmp, pertanto 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.
Uso di 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 che alcune variabili di ambiente vengano impostate prima dell'avvio della profilatura dell'app. Queste variabili possono essere impostate 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.
Uso di PerfCollect
in un contenitore sidecar
Se si vuole eseguire PerfCollect
in un contenitore per profilare un processo .NET Core in un contenitore diverso, l'esperienza è quasi identica ad eccezione di queste differenze:
- 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.
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per