Dela via


Samla in diagnostik i containrar

Samma diagnostikverktyg som är användbara för att diagnostisera .NET-problem i andra scenarier fungerar också i Docker-containrar. Vissa av verktygen kräver dock särskilda steg för att fungera i en container. Den här artikeln beskriver hur verktyg för att samla in prestandaspårningar och samla in dumpar kan användas i Docker-containrar.

Använda .NET CLI-verktyg i en container

Dessa verktyg gäller för: ✔️ .NET Core 3.1 SDK och senare versioner

De globala CLI-diagnostikverktygen (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor och dotnet-trace) är utformade för att fungera i en mängd olika miljöer och bör alla fungera direkt i Docker-containrar. På grund av detta är dessa verktyg den bästa metoden för att samla in diagnostikinformation för .NET-scenarier som riktar sig mot .NET Core 3.1 eller senare i containrar.

Du kan också installera dessa verktyg utan .NET SDK genom att ladda ned enfilvarianterna från länkarna i föregående stycke. Dessa installationer kräver en global installation av .NET Runtime version 3.1 eller senare, som du kan hämta genom att följa någon av de föreskrivna metoderna i installationsdokumentationen för .NET eller genom att använda någon av de officiella runtime-containrarna.

Använda .NET global CLI-verktyg i en sidovagnscontainer

Om du vill använda .NET globala CLI-diagnostikverktyg för att diagnostisera processer i en annan container bör du ha följande ytterligare krav i åtanke:

  1. Containrarna måste dela ett processnamnområde (så att verktygen i sidovagnscontainern kan komma åt processer i målcontainern).
  2. De globala CLI-diagnostikverktygen för .NET behöver åtkomst till filer som .NET-runtime skriver till katalogen /tmp, så katalogen /tmp måste delas mellan mål- och sidovagnscontainern via en volymmontering. Detta kan till exempel göras genom att containrarna delar en gemensam volym eller en Kubernetes emptyDir-volym . Om du försöker använda diagnostikverktygen från en sidovagnscontainer utan att dela katalogen /tmp får du ett felmeddelande om att processen "inte kör kompatibel .NET-körning".

Använda PerfCollect i en container

Det här verktyget gäller för: ✔️ .NET Core 2.1 och senare versioner

Skriptet PerfCollect är användbart för att samla in prestandaspårningar och är det rekommenderade verktyget för att samla in spårningar före .NET Core 3.0. Tänk på följande om du använder PerfCollect i en container:

  • PerfCollect kräver ytterligare funktioner för att köra perf verktyget. Den minimala uppsättning funktioner som krävs är PERFMON och SYS_PTRACE. Vissa miljöer kräver SYS_ADMIN. Se till att starta containern med nödvändiga funktioner. Om den minimala uppsättningen inte fungerar kan du prova med den fullständiga uppsättningen.

  • PerfCollect kräver att vissa miljövariabler anges innan profileringen startas. Dessa kan anges antingen i en Dockerfile eller när du startar containern. Eftersom dessa variabler inte ska anges i normala produktionsmiljöer är det vanligt att bara lägga till dem när du startar en container som ska profileras. De två variabler som Krävs för PerfCollect är:

    • DOTNET_PerfMapEnabled=1
    • DOTNET_EnableEventLog=1

Kommentar

När du kör appen med .NET 7 måste du också ange DOTNET_EnableWriteXorExecute=0 utöver föregående miljövariabler.

Kommentar

.NET 6 standardiserar på prefixet DOTNET_ i stället COMPlus_ för för miljövariabler som konfigurerar .NET-körningsbeteende. Prefixet COMPlus_ fortsätter dock att fungera. Om du använder en tidigare version av .NET-körningen bör du fortfarande använda prefixet COMPlus_ för miljövariabler.

Använda PerfCollect i en sidovagnscontainer

Om du vill köra PerfCollect i en container för att profilera en .NET-process i en annan container är upplevelsen nästan densamma. Skillnaderna är:

  • Miljövariablerna som nämnts tidigare (DOTNET_PerfMapEnabled och DOTNET_EnableEventLog) måste anges för målcontainern (inte den som kör PerfCollect).
  • Containern som körs PerfCollect måste ha SYS_ADMIN funktionen (inte målcontainern).
  • De två containrarna måste dela ett processnamnområde.