Sledování prostředků domény aplikace

Monitorování prostředků domény aplikace (ARM) umožňuje hostitelům monitorovat využití procesoru a paměti podle domény aplikace. To je užitečné pro hostitele, jako je ASP.NET, které používají mnoho domén aplikace v dlouhotrvajícím procesu. Hostitel může uvolnit doménu aplikace aplikace, která nepříznivě ovlivňuje výkon celého procesu, ale pouze v případě, že dokáže identifikovat problematickou aplikaci. ARM poskytuje informace, které je možné použít k usnadnění při rozhodování.

Například hostitelská služba může mít mnoho aplikací spuštěných na ASP.NET serveru. Pokud jedna aplikace v procesu začne spotřebovávat příliš mnoho paměti nebo příliš mnoho času procesoru, může hostitelská služba použít ARM k identifikaci domény aplikace, která problém způsobuje.

ARM je dostatečně jednoduché pro použití v živých aplikacích. K informacím můžete přistupovat pomocí trasování událostí pro Windows (ETW) nebo přímo prostřednictvím spravovaných nebo nativních rozhraní API.

Povolení monitorování prostředků

ARM je možné povolit čtyřmi způsoby: zadáním konfiguračního souboru při spuštění modulu CLR (Common Language Runtime) pomocí nespravovaného hostitelského rozhraní API, pomocí spravovaného kódu nebo naslouchání událostem TRASOVÁNÍ událostí ARM.

Jakmile je ARM povolený, začne shromažďovat data ve všech doménách aplikace v procesu. Pokud byla doména aplikace vytvořena před povolením ARM, spustí se kumulativní data při povolení ARM, ne při vytvoření domény aplikace. Po povolení se ARM nedá zakázat.

  • ARM můžete povolit při spuštění CLR přidáním elementu <appDomainResourceMonitoring> do konfiguračního souboru a nastavením atributu enabled na true. Hodnota false (výchozí) znamená, že arm není při spuštění povolené. Později ji můžete aktivovat pomocí některého z dalších aktivačních mechanismů.

  • Hostitel může povolit ARM vyžádáním hostitelského rozhraní ICLRAppDomainResourceMonitor . Jakmile se toto rozhraní úspěšně získá, povolí se ARM.

  • Spravovaný kód může povolit ARM nastavením statické vlastnosti (Shared v jazyce Visual Basic) AppDomain.MonitoringIsEnabled na truehodnotu . Jakmile je vlastnost nastavená, JE ARM povolena.

  • Arm můžete povolit po spuštění nasloucháním událostem Trasování událostí pro Windows. ARM je povolené a začne zvyšovat události pro všechny domény aplikace, když povolíte veřejného poskytovatele Microsoft-Windows-DotNETRuntime pomocí klíčového AppDomainResourceManagementKeyword slova. Pokud chcete korelovat data s doménami aplikací a vlákny, musíte u zprostředkovatele ThreadingKeyword povolit Microsoft-Windows-DotNETRuntimeRundown také klíčové slovo.

Použití ARM

ARM poskytuje celkový čas procesoru používaný doménou aplikace a tři druhy informací o využití paměti.

  • Celková doba procesoru pro doménu aplikace v sekundách: Vypočítá se tak, že se sečte časy vláken hlášené operačním systémem pro všechna vlákna, která strávila časem prováděním v doméně aplikace během své životnosti. Blokované nebo spící vlákna nepoužívají čas procesoru. Při volání vlákna do nativního kódu je doba, po kterou vlákno stráví v nativním kódu, zahrnut do počtu pro doménu aplikace, ve které bylo volání provedeno.

  • Celkové spravované přidělení provedené doménou aplikace během své životnosti v bajtech: Celkové přidělení neodráží vždy využití paměti doménou aplikace, protože přidělené objekty můžou být krátkodobé. Pokud ale aplikace přidělí a uvolní obrovský počet objektů, mohou být náklady na přidělení významné.

  • Spravovaná paměť v bajtech, na kterou odkazuje doména aplikace a která přežila nejnovější úplnou kolekci: Toto číslo je přesné až po úplném blokování kolekce. (To je na rozdíl od souběžných kolekcí, ke kterým dochází na pozadí a neblokují aplikaci.) Přetížení metody například GC.Collect() způsobí úplné blokování kolekce.

  • Celková spravovaná paměť v bajtech, na kterou odkazuje proces a které přežily nejnovější úplnou kolekci, blokující kolekci: Přeživocená paměť pro jednotlivé domény aplikace se dá porovnat s tímto číslem.

Určení, kdy dojde k úplnému blokování kolekce

Pokud chcete zjistit, kdy jsou počty přeživší paměti přesné, potřebujete vědět, kdy došlo k úplnému blokování kolekce. Tato metoda závisí na rozhraní API, které používáte k prozkoumání statistik ARM.

Spravované rozhraní API

Pokud používáte vlastnosti AppDomain třídy, můžete použít metodu GC.RegisterForFullGCNotification k registraci pro oznámení úplných kolekcí. Prahová hodnota, kterou použijete, není důležitá, protože čekáte na dokončení kolekce, a ne na přístup kolekce. Pak můžete volat metodu GC.WaitForFullGCComplete , která blokuje, dokud se nedokončí úplná kolekce. Můžete vytvořit vlákno, které volá metodu ve smyčce a provede jakoukoli potřebnou analýzu pokaždé, když metoda vrátí.

Případně můžete metodu GC.CollectionCount volat pravidelně, abyste zjistili, jestli se zvýšil počet kolekcí generace 2. V závislosti na frekvenci dotazování nemusí tato technika poskytovat tak přesnou informaci o výskytu úplné kolekce.

Rozhraní API pro hostování

Pokud používáte nespravované rozhraní API pro hostování, musí hostitel předat CLR implementaci rozhraní IHostGCManager . CLR volá IHostGCManager::SuspensionEnding metoda, když obnoví provádění vláken, které byly pozastaveny v době, kdy dojde k kolekci. CLR předá generování dokončené kolekce jako parametr metody, aby hostitel mohl určit, jestli byla kolekce úplná nebo částečná. Vaše implementace IHostGCManager::SuspensionEnding metoda může dotazovat na přeživou paměť, aby se zajistilo, že počty budou načteny, jakmile budou aktualizovány.

Viz také