Shromažďování diagnostických dat v kontejnerech
Stejné diagnostické nástroje, které jsou užitečné pro diagnostiku problémů s .NET v jiných scénářích, fungují také v kontejnerech Dockeru. Některé nástroje ale vyžadují, aby v kontejneru fungovaly speciální kroky. Tento článek popisuje, jak lze nástroje pro shromažďování trasování výkonu a shromažďování výpisů paměti použít v kontejnerech Dockeru.
Použití nástrojů .NET CLI v kontejneru
Tyto nástroje platí pro: ✔️ .NET Core 3.1 SDK a novější verze.
Globální diagnostické nástroje rozhraní příkazového řádku .NET (dotnet-counters, dotnet-dump, dotnet-gcdump, dotnet-monitor a dotnet-trace) jsou navržené tak, aby fungovaly v široké škále prostředí a měly by fungovat přímo v kontejnerech Dockeru. Z tohoto důvodu jsou tyto nástroje upřednostňovanou metodou shromažďování diagnostických informací pro scénáře .NET, které cílí na .NET Core 3.1 nebo novější v kontejnerech.
Tyto nástroje můžete nainstalovat i bez sady .NET SDK stažením variant s jedním souborem z odkazů v předchozím odstavci. Tyto instalace vyžadují globální instalaci modulu runtime .NET verze 3.1 nebo novější, kterou můžete získat podle některé z uvedených metod v instalační dokumentaci k .NET nebo použitím některého z oficiálních kontejnerů modulu runtime.
Použití globálních nástrojů rozhraní příkazového řádku .NET v kontejneru sajdkáře
Pokud chcete k diagnostice procesů v jiném kontejneru použít globální diagnostické nástroje rozhraní příkazového řádku .NET, mějte na paměti následující další požadavky:
- Kontejnery musí sdílet obor názvů procesu (aby nástroje v kontejneru sajdkáře mohly přistupovat k procesům v cílovém kontejneru).
- Globální diagnostické nástroje rozhraní příkazového řádku .NET potřebují přístup k souborům, které modul runtime .NET zapisuje do adresáře /tmp, takže adresář /tmp musí být sdílený mezi cílovým kontejnerem a kontejnerem sidecar prostřednictvím připojení svazku. Můžete to udělat například tak, že kontejnery sdílejí společný svazek nebo prázdný svazek Kubernetes. Pokud se pokusíte použít diagnostické nástroje z kontejneru sajdkára bez sdílení adresáře /tmp, zobrazí se chyba týkající se procesu nespouštět kompatibilní modul runtime .NET.
Použití PerfCollect
v kontejneru
Tento nástroj se vztahuje na: ✔️ .NET Core 2.1 a novější verze
Skript PerfCollect
je užitečný pro shromažďování trasování výkonu a je doporučeným nástrojem pro shromažďování trasování před .NET Core 3.0. Při použití PerfCollect
v kontejneru mějte na paměti následující požadavky:
PerfCollect
vyžaduje další možnosti pro spuštěníperf
nástroje. Minimální požadovaná sada funkcí jePERFMON
aSYS_PTRACE
. Některá prostředí vyžadujíSYS_ADMIN
. Nezapomeňte kontejner spustit s potřebnými možnostmi. Pokud minimální sada nefunguje, zkuste použít úplnou sadu.PerfCollect
vyžaduje, aby se před spuštěním profilace nastavily některé proměnné prostředí. Můžete je nastavit buď v souboru Dockerfile , nebo při spuštění kontejneru. Vzhledem k tomu, že tyto proměnné by neměly být nastavené v normálních produkčních prostředích, je běžné je při spuštění kontejneru, který bude profilovaný, jednoduše přidat. Mezi dvě proměnné, které perfCollect vyžaduje, patří:DOTNET_PerfMapEnabled=1
DOTNET_EnableEventLog=1
Poznámka:
Při spouštění aplikace s .NET 7 musíte také nastavit DOTNET_EnableWriteXorExecute=0
kromě předchozích proměnných prostředí.
Poznámka:
.NET 6 standardizuje předponu DOTNET_
místo COMPlus_
proměnných prostředí, které konfigurují chování za běhu .NET. Předpona COMPlus_
ale bude i nadále fungovat. Pokud používáte předchozí verzi modulu runtime .NET, měli byste stále používat předponu COMPlus_
pro proměnné prostředí.
Použití PerfCollect
v kontejneru sajdkáře
Pokud chcete spustit PerfCollect
v jednom kontejneru a profilovat proces .NET v jiném kontejneru, prostředí je téměř stejné. Rozdíly jsou:
- Proměnné prostředí uvedené dříve (
DOTNET_PerfMapEnabled
aDOTNET_EnableEventLog
) musí být nastaveny pro cílový kontejner (ne pro ten spuštěnýPerfCollect
). - Spuštěný kontejner
PerfCollect
musí mítSYS_ADMIN
schopnost (nikoli cílový kontejner). - Dva kontejnery musí sdílet obor názvů procesu.