Sdílet prostřednictvím


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:

  1. 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).
  2. 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í je PERFMON a SYS_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 a DOTNET_EnableEventLog) musí být nastaveny pro cílový kontejner (ne pro ten spuštěný PerfCollect).
  • Spuštěný kontejner PerfCollect musí mít SYS_ADMIN schopnost (nikoli cílový kontejner).
  • Dva kontejnery musí sdílet obor názvů procesu.