Diagnostische gegevens verzamelen in containers
Dezelfde diagnostische hulpprogramma's die handig zijn voor het diagnosticeren van .NET-problemen in andere scenario's, werken ook in Docker-containers. Voor sommige hulpprogramma's zijn echter speciale stappen vereist om in een container te werken. In dit artikel wordt beschreven hoe hulpprogramma's voor het verzamelen van prestatietraceringen en het verzamelen van dumps kunnen worden gebruikt in Docker-containers.
.NET CLI-hulpprogramma's gebruiken in een container
Deze hulpprogramma's zijn van toepassing op: ✔️ .NET Core 3.1 SDK en latere versies
De globale CLI-hulpprogramma's van .NET (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor en dotnet-trace) zijn ontworpen om te werken in een groot aantal omgevingen en moeten allemaal rechtstreeks in Docker-containers werken. Daarom zijn deze hulpprogramma's de voorkeursmethode voor het verzamelen van diagnostische gegevens voor .NET-scenario's die gericht zijn op .NET Core 3.1 of hoger in containers.
U kunt deze hulpprogramma's ook installeren zonder de .NET SDK door de varianten met één bestand te downloaden via de koppelingen in de vorige alinea. Voor deze installaties is een globale installatie van .NET Runtime versie 3.1 of hoger vereist, die u kunt verkrijgen volgens een van de voorgeschreven methoden in de .NET-installatiedocumentatie of door een van de officiële runtimecontainers te gebruiken.
Globale CLI-hulpprogramma's van .NET gebruiken in een sidecar-container
Als u globale CLI-hulpprogramma's van .NET wilt gebruiken om processen in een andere container te diagnosticeren, moet u rekening houden met de volgende aanvullende vereisten:
- De containers moeten een procesnaamruimte delen (zodat hulpprogramma's in de sidecar-container toegang hebben tot processen in de doelcontainer).
- De globale CLI-hulpprogramma's van .NET hebben toegang nodig tot bestanden die door de .NET-runtime naar de map /tmp worden geschreven, dus moet de map /tmp worden gedeeld tussen de doel- en sidecarcontainer via een volumekoppeling. Dit kan bijvoorbeeld worden gedaan door de containers een gemeenschappelijk volume of een LeegDir-volume van Kubernetes te laten delen. Als u probeert de diagnostische hulpprogramma's uit een sidecar-container te gebruiken zonder de map /tmp te delen, krijgt u een foutmelding over het proces 'not running compatible .NET runtime'.
Gebruiken PerfCollect
in een container
Dit hulpprogramma is van toepassing op: ✔️ .NET Core 2.1 en latere versies
Het PerfCollect
script is handig voor het verzamelen van prestatietraceringen en is het aanbevolen hulpprogramma voor het verzamelen van traceringen vóór .NET Core 3.0. Als u PerfCollect
in een container gebruikt, moet u rekening houden met de volgende vereisten:
PerfCollect
vereist extra mogelijkheden om hetperf
hulpprogramma uit te voeren. De minimale set mogelijkheden die vereist zijn, isPERFMON
enSYS_PTRACE
. Voor sommige omgevingen is vereistSYS_ADMIN
. Zorg ervoor dat u de container start met de benodigde mogelijkheden. Als de minimale set niet werkt, kunt u het proberen met de volledige set.PerfCollect
vereist dat sommige omgevingsvariabelen worden ingesteld voordat de app wordt geprofileerd. Deze kunnen worden ingesteld in een Dockerfile of wanneer u de container start. Omdat deze variabelen niet moeten worden ingesteld in normale productieomgevingen, is het gebruikelijk om ze toe te voegen wanneer u een container start die wordt geprofileerd. De twee variabelen die PerfCollect nodig heeft, zijn:DOTNET_PerfMapEnabled=1
DOTNET_EnableEventLog=1
Notitie
Bij het uitvoeren van de app met .NET 7 moet u ook naast de voorgaande omgevingsvariabelen instellen DOTNET_EnableWriteXorExecute=0
.
Notitie
.NET 6 standaardiseert het voorvoegsel DOTNET_
in plaats van COMPlus_
voor omgevingsvariabelen die .NET-runtimegedrag configureren. COMPlus_
Het voorvoegsel blijft echter werken. Als u een eerdere versie van de .NET-runtime gebruikt, moet u nog steeds het COMPlus_
voorvoegsel voor omgevingsvariabelen gebruiken.
Gebruiken PerfCollect
in een sidecarcontainer
Als u in één container wilt uitvoeren PerfCollect
om een .NET-proces in een andere container te profilen, is de ervaring bijna hetzelfde. De verschillen zijn:
- De eerder genoemde omgevingsvariabelen (
DOTNET_PerfMapEnabled
enDOTNET_EnableEventLog
) moeten worden ingesteld voor de doelcontainer (niet de omgevingscontainer die wordt uitgevoerdPerfCollect
). - De container die wordt uitgevoerd
PerfCollect
, moet deSYS_ADMIN
mogelijkheid hebben (niet de doelcontainer). - De twee containers moeten een procesnaamruimte delen.