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
natrue
. Hodnotafalse
(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 natrue
hodnotu . 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éhoAppDomainResourceManagementKeyword
slova. Pokud chcete korelovat data s doménami aplikací a vlákny, musíte u zprostředkovateleThreadingKeyword
povolitMicrosoft-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.
Spravované rozhraní API: AppDomain.MonitoringTotalProcessorTime vlastnost
Rozhraní API pro hostování: ICLRAppDomainResourceMonitor::GetCurrentCpuTime – metoda.
Události Trasování událostí pro Windows:
ThreadCreated
,ThreadAppDomainEnter
aThreadTerminated
události. Informace o zprostředkovatelích a klíčových slovech najdete v tématu Události monitorování prostředků AppDomain v událostech TRASOVÁNÍ událostí CLR pro Windows.
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é rozhraní API: AppDomain.MonitoringTotalAllocatedMemorySize vlastnost
Rozhraní API pro hostování: ICLRAppDomainResourceMonitor::GetCurrentAllocated – metoda.
Události Trasování událostí pro Windows:
AppDomainMemAllocated
událost,Allocated
pole.
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.
Spravované rozhraní API: AppDomain.MonitoringSurvivedMemorySize vlastnost
Rozhraní API pro hostování: ICLRAppDomainResourceMonitor::GetCurrentSurvived – metoda,
pAppDomainBytesSurvived
parametr.Události Trasování událostí pro Windows:
AppDomainMemSurvived
událost,Survived
pole.
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.
Spravované rozhraní API: AppDomain.MonitoringSurvivedProcessMemorySize vlastnost
Rozhraní API pro hostování: ICLRAppDomainResourceMonitor::GetCurrentSurvived – metoda,
pTotalBytesSurvived
parametr.Události Trasování událostí pro Windows:
AppDomainMemSurvived
událost,ProcessSurvived
pole.
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.