Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Stejné diagnostické nástroje, které jsou užitečné pro diagnostiku problémů .NET v jiných scénářích, fungují také v kontejnerech. Nástroje se dají spustit ve stejném kontejneru jako cílový proces, z hostitelského systému nebo z sidecarového kontejneru.
Použití nástrojů .NET CLI v kontejneru
Tyto nástroje platí pro: ✔️ .NET Core 3.1 SDK a novější verze.
Všechny diagnostické nástroje rozhraní příkazového řádku dotnet-* můžou fungovat při spuštění ve stejném kontejneru jako aplikace, kterou kontrolují, ale pozor na tyto potenciální problémy:
- Nástroje spuštěné uvnitř kontejneru musí respektovat omezení prostředků kontejneru. Pokud jsou limity prostředků příliš nízké, nástroje můžou běžet pomalu nebo selžou. Většina nástrojů má skromné požadavky, ale
dotnet-dumpadotnet-gcdumpmohou využít značné množství paměti a diskového prostoru při zpracování procesu s vysokými nároky na paměť.dotnet-traceadotnet-countersmohou také vytvářet velké soubory, pokud jsou nastaveny k zaznamenávání velkého množství trasovacích událostí nebo časově řazených dat metrik. -
dotnet-dumpzpůsobí spuštění pomocného procesu, který potřebuje oprávnění ptrace. Linux má řadu možností konfigurace zabezpečení, které můžou ovlivnit, jestli je to úspěšné, takže v některých případech možná budete muset upravit konfiguraci zabezpečení kontejneru. Další pokyny k diagnostice oprávnění zabezpečení najdete v nejčastějších dotazech k výpisu. - Při spouštění nástrojů v kontejneru je můžete nainstalovat předem při sestavování kontejneru nebo je stáhnout na vyžádání. Jejich instalace předem usnadňuje, když je potřebujete, ale zvětší velikost kontejneru a vytvoří větší prostor pro útok, který by se aktéři se zlými úmysly mohli pokusit zneužít.
Použijte nástroje .NET CLI v sidecar kontejneru nebo z hostu
Diagnostické nástroje rozhraní příkazového řádku dotnet-* podporují také spouštění z hostitele nebo v postranním kontejneru. Tím se do značné míry vyhýbá omezením velikosti, zabezpečení a prostředků spuštěných ve stejném kontejneru, ale jsou zapotřebí některé další požadavky pro úspěšnou komunikaci mezi nástroji.
Při identifikaci cílového procesu pro kontrolu pomocí argumentů příkazového --process-id řádku nebo --name nástroje to vyžaduje:
- Kontejnery musí sdílet obor názvů procesu, aby nástroje ve vedlejším kontejneru mohly přistupovat k procesům v cílovém kontejneru.
- Nástroje potřebují přístup k diagnostickému portu Unix Domain Socket, 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 svazek Kubernetes typu emptyDir. Pokud se pokusíte použít diagnostické nástroje z kontejneru sajdkára bez sdílení adresáře /tmp, zobrazí se chyba, že proces „neběží s kompatibilním modulem runtime .NET“.
Pokud nechcete sdílet obor názvů procesů a adresář /tmp , mnoho nástrojů také podporuje pokročilejší --diagnostic-port možnost příkazového řádku. To vám umožní přímo zadat cestu k diagnostickému portu cílového procesu v rámci souborového systému hostitele nebo vedlejšího kontejneru. Adresář /tmp cílového kontejneru bude potřeba namapovat na nějaké místo, aby tato cesta existovala, ale nemusí se sdílet s hostitelem ani sidecar kontejnerem /tmp.
Poznámka:
I když spustíte diagnostické nástroje z hostitele nebo pomocného kontejneru, může být po cílovém procesu stále požadováno, aby vykonával činnost, což zvyšuje využití prostředků uvnitř cílového kontejneru. Zjistili jsme, že dotnet-dump může způsobit, že cílový proces při shromažďování výpisu paměti načte do paměti značné množství virtuální paměti. Jiné nástroje mohou mít menší vliv, ale neviděli jsme, že by v praxi způsobovaly problémy. Například dotnet-trace požaduje, aby cílový proces přidělil pufr pro události a dotnet-counters požaduje malou oblast paměti, kde jsou agregována data metrik. Doporučujeme otestovat, abyste zajistili, že limity paměti nejsou tak těsné, že spuštění nástrojů způsobí ukončení kontejnerů operačním systémem.
Poznámka:
Při dotnet-dump zápisu souboru s výpisem na disk se výstupní cesta interpretuje v kontextu pohledu cílového procesu na systém souborů. To se může lišit od hostitelského kontejneru nebo od sidecar kontejneru.
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, které obsahují události jádra, jako jsou vzorky procesoru nebo kontextové přepínače. Při použití PerfCollect v kontejneru mějte na paměti následující požadavky:
PerfCollectvyžaduje další možnosti pro spuštěníperfnástroje. Minimální požadovaná sada funkcí jePERFMONaSYS_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.PerfCollectvyžaduje, aby se před spuštěním aplikace, kterou profiluje, 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=1DOTNET_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í.
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_PerfMapEnabledaDOTNET_EnableEventLog) musí být nastaveny pro cílový kontejner (ne pro ten spuštěnýPerfCollect). - Spuštěný kontejner
PerfCollectmusí mítSYS_ADMINschopnost (nikoli cílový kontejner). - Dva kontejnery musí sdílet obor názvů procesu.