Dela via


Övervakning av programdomänresurser

Med övervakning av programdomänresurser (ARM) kan värdar övervaka processor- och minnesanvändning per programdomän. Detta är användbart för värdar som ASP.NET som använder många programdomäner i en tidskrävande process. Värden kan ta bort programdomänen för ett program som påverkar hela processens prestanda negativt, men bara om det kan identifiera det problematiska programmet. ARM tillhandahåller information som kan användas för att fatta sådana beslut.

En värdtjänst kan till exempel ha många program som körs på en ASP.NET server. Om ett program i processen börjar förbruka för mycket minne eller för mycket processortid kan värdtjänsten använda ARM för att identifiera den programdomän som orsakar problemet.

ARM är tillräckligt lätt att använda i live-program. Du kan komma åt informationen med hjälp av händelsespårning för Windows (ETW) eller direkt via hanterade eller interna API:er.

Aktivera resursövervakning

ARM kan aktiveras på fyra sätt: genom att ange en konfigurationsfil när CLR (Common Language Runtime) startas, med hjälp av ett ohanterat värd-API, med hjälp av hanterad kod eller genom att lyssna på ARM ETW-händelser.

Så snart ARM har aktiverats börjar den samla in data på alla programdomäner i processen. Om en programdomän skapades innan ARM aktiveras startar kumulativa data när ARM är aktiverat, inte när programdomänen skapades. När den är aktiverad kan ARM inte inaktiveras.

  • Du kan aktivera ARM vid CLR-start genom att lägga till elementet <appDomainResourceMonitoring> i konfigurationsfilen och ange enabled attributet till true. false Värdet (standardvärdet) innebär bara att ARM inte är aktiverat vid start. Du kan aktivera det senare med hjälp av någon av de andra aktiveringsmekanismerna.

  • Värden kan aktivera ARM genom att begära värdgränssnittet ICLRAppDomainResourceMonitor . När det här gränssnittet har hämtats är ARM aktiverat.

  • Hanterad kod kan aktivera ARM genom att ange egenskapen static (Shared i Visual Basic) AppDomain.MonitoringIsEnabled till true. Så snart egenskapen har angetts är ARM aktiverat.

  • Du kan aktivera ARM efter start genom att lyssna på ETW-händelser. ARM är aktiverat och börjar höja händelser för alla programdomäner när du aktiverar den offentliga providern Microsoft-Windows-DotNETRuntime med hjälp av nyckelordet AppDomainResourceManagementKeyword . Om du vill korrelera data med programdomäner och trådar måste du även aktivera providern Microsoft-Windows-DotNETRuntimeRundown med nyckelordet ThreadingKeyword .

Använda ARM

ARM ger den totala processortiden som används av en programdomän och tre typer av information om minnesanvändning.

  • Total processortid för en programdomän i sekunder: Detta beräknas genom att lägga till de trådtider som rapporterats av operativsystemet för alla trådar som har ägnat tid åt att köra i programdomänen under dess livslängd. Blockerade eller vilande trådar använder inte processortid. När en tråd anropar intern kod inkluderas den tid som tråden spenderar i intern kod i antalet för programdomänen där anropet gjordes.

  • Totalt antal hanterade allokeringar som gjorts av en programdomän under dess livslängd, i byte: Totala allokeringar återspeglar inte alltid minnesanvändning av en programdomän, eftersom de allokerade objekten kan vara kortvariga. Men om ett program allokerar och frigör ett stort antal objekt kan kostnaden för allokeringarna vara betydande.

  • Hanterat minne, i byte, som refereras av en programdomän och som överlevde den senaste fullständiga, blockerande samlingen: Det här talet är korrekt först efter en fullständig, blockerande samling. (Detta står i kontrast till samtidiga samlingar som förekommer i bakgrunden och inte blockerar programmet.) Metodens överlagring orsakar till exempel GC.Collect() en fullständig, blockerande samling.

  • Totalt hanterat minne, i byte, som refereras av processen och som överlevde den senaste fullständiga, blockerande samlingen: Det bevarade minnet för enskilda programdomäner kan jämföras med det här talet.

Avgöra när en fullständig, blockerande samling inträffar

För att avgöra när antalet bevarade minne är korrekt måste du veta när en fullständig, blockerande samling just har inträffat. Metoden för att göra detta beror på vilket API du använder för att undersöka ARM-statistik.

Hanterat API

Om du använder egenskaperna för AppDomain klassen kan du använda GC.RegisterForFullGCNotification metoden för att registrera dig för meddelanden om fullständiga samlingar. Tröskelvärdet som du använder är inte viktigt eftersom du väntar på att en samling ska slutföras i stället för metoden för en samling. Du kan sedan anropa GC.WaitForFullGCComplete metoden, som blockeras tills en fullständig samling har slutförts. Du kan skapa en tråd som anropar metoden i en loop och gör alla nödvändiga analyser när metoden returnerar.

Du kan också anropa GC.CollectionCount metoden med jämna mellanrum för att se om antalet samlingar av generation 2 har ökat. Beroende på avsökningsfrekvensen kanske den här tekniken inte ger en lika exakt indikation på förekomsten av en fullständig samling.

Värd-API

Om du använder det ohanterade värd-API:et måste värden skicka CLR en implementering av gränssnittet IHostGCManager . CLR anropar metoden IHostGCManager::SuspensionEnding när den återupptar körningen av trådar som har pausats medan en samling inträffar. CLR skickar genereringen av den slutförda samlingen som en parameter för metoden, så att värden kan avgöra om samlingen var fullständig eller partiell. Implementeringen av metoden IHostGCManager::SuspensionEnding kan fråga efter minne som har överlevts för att säkerställa att antalet hämtas så snart de har uppdaterats.

Se även