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:
- Containrarna måste dela ett processnamnområde (så att verktygen i sidovagnscontainern kan komma åt processer i målcontainern).
- 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öraperf
verktyget. Den minimala uppsättning funktioner som krävs ärPERFMON
ochSYS_PTRACE
. Vissa miljöer kräverSYS_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
ochDOTNET_EnableEventLog
) måste anges för målcontainern (inte den som körPerfCollect
). - Containern som körs
PerfCollect
måste haSYS_ADMIN
funktionen (inte målcontainern). - De två containrarna måste dela ett processnamnområde.