Share via


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:

  1. De containers moeten een procesnaamruimte delen (zodat hulpprogramma's in de sidecar-container toegang hebben tot processen in de doelcontainer).
  2. 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 het perf hulpprogramma uit te voeren. De minimale set mogelijkheden die vereist zijn, is PERFMON en SYS_PTRACE. Voor sommige omgevingen is vereist SYS_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 en DOTNET_EnableEventLog) moeten worden ingesteld voor de doelcontainer (niet de omgevingscontainer die wordt uitgevoerd PerfCollect).
  • De container die wordt uitgevoerd PerfCollect , moet de SYS_ADMIN mogelijkheid hebben (niet de doelcontainer).
  • De twee containers moeten een procesnaamruimte delen.