Resourcebewaking van toepassingsdomein
Met ARM (Application Domain Resource Monitoring) kunnen hosts het CPU- en geheugengebruik per toepassingsdomein bewaken. Dit is handig voor hosts zoals ASP.NET die veel toepassingsdomeinen gebruiken in een langlopend proces. De host kan het toepassingsdomein van een toepassing die de prestaties van het hele proces nadelig beïnvloedt, maar alleen als het de problematische toepassing kan identificeren. ARM biedt informatie die kan worden gebruikt om dergelijke beslissingen te nemen.
Een hostingservice kan bijvoorbeeld veel toepassingen hebben die worden uitgevoerd op een ASP.NET-server. Als één toepassing in het proces te veel geheugen of te veel processortijd verbruikt, kan de hostingservice ARM gebruiken om het toepassingsdomein te identificeren dat het probleem veroorzaakt.
ARM is voldoende licht voor gebruik in livetoepassingen. U kunt toegang krijgen tot de informatie met behulp van gebeurtenistracering voor Windows (ETW) of rechtstreeks via beheerde of systeemeigen API's.
Resourcebewaking inschakelen
ARM kan op vier manieren worden ingeschakeld: door een configuratiebestand op te geven wanneer de COMMON Language Runtime (CLR) wordt gestart, door een niet-beheerde hosting-API te gebruiken, door beheerde code te gebruiken of door te luisteren naar ARM ETW-gebeurtenissen.
Zodra ARM is ingeschakeld, begint het met het verzamelen van gegevens op alle toepassingsdomeinen in het proces. Als er een toepassingsdomein is gemaakt voordat ARM is ingeschakeld, worden cumulatieve gegevens gestart wanneer ARM is ingeschakeld, niet wanneer het toepassingsdomein is gemaakt. Zodra de functie is ingeschakeld, kan ARM niet worden uitgeschakeld.
U kunt ARM bij het opstarten van CLR inschakelen door het element appDomainResourceMonitoring> toe te voegen aan het configuratiebestand en het
enabled
kenmerk in te stellen optrue
.< Een waarde vanfalse
(de standaardinstelling) betekent alleen dat ARM niet is ingeschakeld bij het opstarten. U kunt deze later activeren met behulp van een van de andere activeringsmechanismen.De host kan ARM inschakelen door de hostinginterface van ICLRAppDomainResourceMonitor aan te vragen. Zodra deze interface is verkregen, is ARM ingeschakeld.
Beheerde code kan ARM inschakelen door de statische eigenschap (
Shared
in Visual Basic) AppDomain.MonitoringIsEnabled in te stellen optrue
. Zodra de eigenschap is ingesteld, is ARM ingeschakeld.U kunt ARM inschakelen na het opstarten door te luisteren naar ETW-gebeurtenissen. ARM is ingeschakeld en begint met het genereren van gebeurtenissen voor alle toepassingsdomeinen wanneer u de openbare provider
Microsoft-Windows-DotNETRuntime
inschakelt met behulp van hetAppDomainResourceManagementKeyword
trefwoord. Als u gegevens wilt correleren met toepassingsdomeinen en threads, moet u ook deMicrosoft-Windows-DotNETRuntimeRundown
provider met hetThreadingKeyword
trefwoord inschakelen.
ARM gebruiken
ARM biedt de totale processortijd die wordt gebruikt door een toepassingsdomein en drie soorten informatie over geheugengebruik.
Totale processortijd voor een toepassingsdomein, in seconden: dit wordt berekend door de threadtijden op te tellen die door het besturingssysteem zijn gerapporteerd voor alle threads die tijdens de levensduur tijd hebben besteed aan het uitvoeren van het toepassingsdomein. Geblokkeerde of slaapthreads gebruiken geen processortijd. Wanneer een thread systeemeigen code aanroept, wordt de tijd die de thread in systeemeigen code besteedt, opgenomen in het aantal voor het toepassingsdomein waar de aanroep is gedaan.
Beheerde API: AppDomain.MonitoringTotalProcessorTime eigenschap.
Hosting-API: methode ICLRAppDomainResourceMonitor::GetCurrentCpuTime .
ETW-gebeurtenissen:
ThreadCreated
,ThreadAppDomainEnter
enThreadTerminated
gebeurtenissen. Zie AppDomain Resource Monitoring Events in CLR ETW Events voor informatie over providers en trefwoorden.
Totaal aantal beheerde toewijzingen van een toepassingsdomein tijdens de levensduur, in bytes: Totale toewijzingen weerspiegelen niet altijd het geheugengebruik door een toepassingsdomein, omdat de toegewezen objecten mogelijk kort duren. Als een toepassing echter enorme aantallen objecten toewijst en vrijgeeft, kunnen de kosten van de toewijzingen aanzienlijk zijn.
Beheerde API: AppDomain.MonitoringTotalAllocatedMemorySize eigenschap.
Hosting-API: methode ICLRAppDomainResourceMonitor::GetCurrentAllocated .
ETW-gebeurtenissen:
AppDomainMemAllocated
gebeurtenis,Allocated
veld.
Beheerd geheugen, in bytes, waarnaar wordt verwezen door een toepassingsdomein en die de meest recente volledige, blokkerende verzameling heeft overleefd: dit getal is pas nauwkeurig na een volledige, blokkerende verzameling. (Dit is in tegenstelling tot gelijktijdige verzamelingen, die op de achtergrond voorkomen en de toepassing niet blokkeren.) De overbelasting van de GC.Collect() methode veroorzaakt bijvoorbeeld een volledige, blokkerende verzameling.
Beheerde API: AppDomain.MonitoringSurvivedMemorySize eigenschap.
Hosting-API: methode ICLRAppDomainResourceMonitor::GetCurrentSurvived method,
pAppDomainBytesSurvived
parameter.ETW-gebeurtenissen:
AppDomainMemSurvived
gebeurtenis,Survived
veld.
Totaal beheerd geheugen, in bytes, waarnaar wordt verwezen door het proces en die de meest recente volledige, blokkerende verzameling heeft overleefd: het overlevende geheugen voor afzonderlijke toepassingsdomeinen kan worden vergeleken met dit aantal.
Beheerde API: AppDomain.MonitoringSurvivedProcessMemorySize eigenschap.
Hosting-API: methode ICLRAppDomainResourceMonitor::GetCurrentSurvived method,
pTotalBytesSurvived
parameter.ETW-gebeurtenissen:
AppDomainMemSurvived
gebeurtenis,ProcessSurvived
veld.
Bepalen wanneer een volledige, blokkerende verzameling plaatsvindt
Om te bepalen wanneer het aantal overlevende geheugen nauwkeurig is, moet u weten wanneer er een volledige, blokkerende verzameling is opgetreden. De methode hiervoor is afhankelijk van de API die u gebruikt om ARM-statistieken te onderzoeken.
Beheerde API
Als u de eigenschappen van de AppDomain klasse gebruikt, kunt u de GC.RegisterForFullGCNotification methode gebruiken om u te registreren voor meldingen van volledige verzamelingen. De drempelwaarde die u gebruikt, is niet belangrijk, omdat u wacht op de voltooiing van een verzameling in plaats van op de benadering van een verzameling. Vervolgens kunt u de GC.WaitForFullGCComplete methode aanroepen, die wordt geblokkeerd totdat een volledige verzameling is voltooid. U kunt een thread maken die de methode in een lus aanroept en elke benodigde analyse doet wanneer de methode wordt geretourneerd.
U kunt de GC.CollectionCount methode ook periodiek aanroepen om te zien of het aantal verzamelingen van generatie 2 is toegenomen. Afhankelijk van de pollingfrequentie kan deze techniek mogelijk niet zo nauwkeurig zijn als een indicatie van het optreden van een volledige verzameling.
Hosting-API
Als u de niet-beheerde hosting-API gebruikt, moet uw host de CLR doorgeven aan een implementatie van de IHostGCManager-interface . De CLR roept de methode IHostGCManager::SuspensionEnding aan wanneer de uitvoering wordt hervat van threads die zijn onderbroken terwijl een verzameling plaatsvindt. De CLR geeft de generatie van de voltooide verzameling door als een parameter van de methode, zodat de host kan bepalen of de verzameling volledig of gedeeltelijk is. Uw implementatie van de methode IHostGCManager::SuspensionEnding kan query's uitvoeren op het overlevende geheugen om ervoor te zorgen dat de aantallen worden opgehaald zodra ze worden bijgewerkt.