Alkalmazástartomány erőforrás-monitorozása

Az alkalmazástartomány erőforrás-monitorozása (ARM) lehetővé teszi, hogy a gazdagépek alkalmazástartományonként monitorozzák a processzor- és memóriahasználatot. Ez olyan gazdagépek esetében hasznos, mint például a ASP.NET, amelyek hosszú ideig futó folyamat során számos alkalmazástartományt használnak. A gazdagép eltávolíthatja egy olyan alkalmazás alkalmazástartományát, amely hátrányosan befolyásolja a teljes folyamat teljesítményét, de csak akkor, ha képes azonosítani a problémás alkalmazást. Az ARM olyan információkat nyújt, amelyek felhasználhatók az ilyen döntések meghozatalához.

Egy üzemeltetési szolgáltatás például számos alkalmazással rendelkezhet, amelyek egy ASP.NET kiszolgálón futnak. Ha a folyamat egyik alkalmazása túl sok memóriát vagy túl sok processzoridőt kezd el használni, az üzemeltetési szolgáltatás arm használatával azonosíthatja a problémát okozó alkalmazástartományt.

Az ARM elég könnyű az élő alkalmazásokban való használathoz. Az információkhoz a Windows (ETW) eseménykövetésével vagy közvetlenül felügyelt vagy natív API-kkal férhet hozzá.

Erőforrás-figyelés engedélyezése

Az ARM négy módon engedélyezhető: egy konfigurációs fájl megadásával a közös nyelvi futtatókörnyezet (CLR) indításakor, nem felügyelt üzemeltetési API használatával, felügyelt kód használatával vagy ARM ETW-események figyelésével.

Amint az ARM engedélyezve van, megkezdi az adatok gyűjtését a folyamat összes alkalmazástartományán. Ha egy alkalmazástartományt az ARM engedélyezése előtt hoztak létre, az összesítő adatok az ARM engedélyezésekor kezdődnek, nem pedig az alkalmazástartomány létrehozásakor. Ha engedélyezve van, az ARM nem tiltható le.

  • A CLR indításakor engedélyezheti az ARM-t úgy, hogy hozzáadja az <appDomainResourceMonitoring> elemet a konfigurációs fájlhoz, és az attribútumot a enabled következőre trueállítja. Az (alapértelmezett) érték false csak azt jelenti, hogy az ARM nincs engedélyezve indításkor; később a többi aktiválási mechanizmus egyikével aktiválhatja.

  • A gazdagép az ICLRAppDomainResourceMonitor üzemeltetési felület kérésével engedélyezheti az ARM-t. A felület sikeres beszerzése után az ARM engedélyezve lesz.

  • A felügyelt kód a statikus (Shared Visual Basic) AppDomain.MonitoringIsEnabled tulajdonság truebeállításával engedélyezheti az ARM-t. A tulajdonság beállítása után az ARM engedélyezve van.

  • Az ARM az indítás után ETW-események figyelésével engedélyezhető. Az ARM engedélyezve van, és elkezd eseményeket emelni az összes alkalmazástartományban, amikor a kulcsszó használatával engedélyezi a nyilvános szolgáltatót Microsoft-Windows-DotNETRuntimeAppDomainResourceManagementKeyword . Az adatok alkalmazástartományokkal és -szálakkal való korrelálásához engedélyeznie kell a szolgáltatót Microsoft-Windows-DotNETRuntimeRundown is a ThreadingKeyword kulcsszóval.

ARM használata

Az ARM az alkalmazástartomány által használt teljes processzoridőt és háromféle információt biztosít a memóriahasználatról.

  • Egy alkalmazástartomány teljes processzorideje másodpercben: Ezt úgy számítjuk ki, hogy összeadja az operációs rendszer által jelentett szálidőket az összes olyan szálhoz, amely az alkalmazástartományban való végrehajtással töltött időt az élettartama során. A blokkolt vagy alvó szálak nem használnak processzoridőt. Ha egy szál natív kódba hív, a szál natív kódban töltött idejét annak az alkalmazástartománynak a száma tartalmazza, ahol a hívást kezdeményezték.

  • Egy alkalmazástartomány által az élettartama során végrehajtott összes felügyelt foglalás bájtban: Az összes foglalás nem mindig tükrözi az alkalmazástartomány memóriahasználatát, mert a lefoglalt objektumok rövid élettartamúak lehetnek. Ha azonban egy alkalmazás rengeteg objektumot foglal le és szabadít fel, a foglalások költsége jelentős lehet.

  • Felügyelt memória bájtban, amelyet egy alkalmazástartomány hivatkozik, és amely túlélte a legutóbbi teljes, blokkoló gyűjteményt: Ez a szám csak a teljes, blokkoló gyűjtemény után pontos. (Ez ellentétben áll az egyidejű gyűjteményekkel, amelyek a háttérben fordulnak elő, és nem tiltják le az alkalmazást.) A metódus túlterhelése GC.Collect() például teljes, blokkoló gyűjteményt okoz.

  • A folyamat által hivatkozott és a legutóbbi teljes, blokkoló gyűjteményt túlélt felügyelt memória bájtban kifejezve: Az egyes alkalmazástartományok túlélt memóriája összehasonlítható ezzel a számmal.

Annak meghatározása, hogy mikor történik meg a teljes, blokkoló gyűjtemény

Annak megállapításához, hogy a túlélt memória száma mikor pontos, tudnia kell, hogy mikor történt meg a teljes, blokkoló gyűjtemény. Ennek módja az ARM-statisztikák vizsgálatához használt API-tól függ.

Felügyelt API

Ha az AppDomain osztály tulajdonságait használja, a GC.RegisterForFullGCNotification metódus használatával regisztrálhat a teljes gyűjtemények értesítésére. A használt küszöbérték nem fontos, mert nem a gyűjtemény megközelítésére, hanem a gyűjtemény befejezésére vár. Ezután meghívhatja a metódust GC.WaitForFullGCComplete , amely letiltja a teljes gyűjtemény befejezését. Létrehozhat egy szálat, amely ciklusban hívja meg a metódust, és elvégzi a szükséges elemzéseket, amikor a metódus visszatér.

Azt is megteheti, hogy rendszeresen meghívja a GC.CollectionCount metódust, hogy megállapítsa, nőtt-e a 2. generációs gyűjtemények száma. A lekérdezés gyakoriságától függően előfordulhat, hogy ez a technika nem nyújt olyan pontos jelzést a teljes gyűjtemény előfordulására.

Az API üzemeltetése

Ha a nem felügyelt üzemeltetési API-t használja, a gazdagépnek át kell adnia a CLR-nek az IHostGCManager felület implementációját. A CLR meghívja az IHostGCManager::SuspensionEnding metódust, amikor folytatja a gyűjtemény során felfüggesztett szálak végrehajtását. A CLR a metódus paramétereként átadja a befejezett gyűjtemény generálását, így a gazdagép meg tudja állapítani, hogy a gyűjtemény teljes vagy részleges volt-e. Az IHostGCManager::SuspensionEnding metódus végrehajtása lekérdezheti az túlélt memóriát, hogy a számokat a frissítés után azonnal lekérje a rendszer.

Lásd még