Uygulama Etki Alanı Kaynak İzleme
Uygulama etki alanı kaynak izleme (ARM), konakların uygulama etki alanına göre CPU ve bellek kullanımını izlemesini sağlar. Bu, uzun süre çalışan bir işlemde birçok uygulama etki alanı kullanan ASP.NET gibi konaklar için kullanışlıdır. Konak, işlemin tamamının performansını olumsuz etkileyen bir uygulamanın uygulama etki alanını kaldırabilir, ancak yalnızca sorunlu uygulamayı tanımlayabilir. ARM, bu tür kararlar alma konusunda yardımcı olmak için kullanılabilecek bilgiler sağlar.
Örneğin, bir barındırma hizmetinin ASP.NET sunucusunda çalışan birçok uygulaması olabilir. İşlemdeki bir uygulama çok fazla bellek veya çok fazla işlemci süresi tüketmeye başlarsa, barındırma hizmeti soruna neden olan uygulama etki alanını belirlemek için ARM kullanabilir.
ARM, canlı uygulamalarda kullanmak için yeterince hafiftir. Bilgilere Windows için olay izleme (ETW) kullanarak veya doğrudan yönetilen veya yerel API'ler aracılığıyla erişebilirsiniz.
Kaynak İzlemeyi Etkinleştirme
ARM dört şekilde etkinleştirilebilir: ortak dil çalışma zamanı (CLR) başlatıldığında bir yapılandırma dosyası sağlayarak, yönetilmeyen bir barındırma API'sini kullanarak, yönetilen kodu kullanarak veya ARM ETW olaylarını dinleyerek.
ARM etkinleştirildikten hemen sonra işlemdeki tüm uygulama etki alanlarında veri toplamaya başlar. ARM etkinleştirilmeden önce bir uygulama etki alanı oluşturulduysa, toplu veriler uygulama etki alanı oluşturulduğunda değil ARM etkinleştirildiğinde başlar. Etkinleştirildikten sonra ARM devre dışı bırakılamaz.
YAPıLANDıRMA dosyasına appDomainResourceMonitoring öğesini ekleyerek <ve özniteliğini
true
olarak ayarlayarakenabled
CLR başlangıcında ARM'yi etkinleştirebilirsiniz.> değerifalse
(varsayılan) yalnızca BAŞLANGıÇTA ARM'nin etkinleştirilmediği anlamına gelir; daha sonra diğer etkinleştirme mekanizmalarından birini kullanarak etkinleştirebilirsiniz.Konak, ICLRAppDomainResourceMonitor barındırma arabirimini isteyerek ARM'yi etkinleştirebilir. Bu arabirim başarıyla elde edildikten sonra ARM etkinleştirilir.
Yönetilen kod, statik (
Shared
Visual Basic'te) AppDomain.MonitoringIsEnabled özelliğini olarak ayarlayarak ARM'yitrue
etkinleştirebilir. Özellik ayarlanır ayarlanmaz ARM etkinleştirilir.ETW olaylarını dinleyerek başlangıçtan sonra ARM'yi etkinleştirebilirsiniz. ARM etkindir ve anahtar sözcüğünü kullanarak genel sağlayıcıyı
Microsoft-Windows-DotNETRuntime
etkinleştirdiğinizde tüm uygulama etki alanları için olaylar oluşturmayaAppDomainResourceManagementKeyword
başlar. Verileri uygulama etki alanları ve iş parçacıklarıyla ilişkilendirmek için sağlayıcıyıMicrosoft-Windows-DotNETRuntimeRundown
anahtar sözcüğüyleThreadingKeyword
de etkinleştirmeniz gerekir.
ARM kullanma
ARM, bir uygulama etki alanı tarafından kullanılan toplam işlemci süresini ve bellek kullanımı hakkında üç tür bilgi sağlar.
Bir uygulama etki alanı için saniye cinsinden toplam işlemci süresi: Bu, kullanım ömrü boyunca uygulama etki alanında yürütülürken zaman harcayan tüm iş parçacıkları için işletim sistemi tarafından bildirilen iş parçacığı süreleri eklenerek hesaplanır. Engellenen veya uyuyan iş parçacıkları işlemci süresini kullanmaz. Bir iş parçacığı yerel koda çağrı yaptığında, iş parçacığının yerel kodda harcadığı süre, çağrının yapıldığı uygulama etki alanının sayısına eklenir.
Yönetilen API: AppDomain.MonitoringTotalProcessorTime özelliği.
Barındırma API'si: ICLRAppDomainResourceMonitor::GetCurrentCpuTime yöntemi.
ETW olayları:
ThreadCreated
,ThreadAppDomainEnter
veThreadTerminated
olayları. Sağlayıcılar ve anahtar sözcükler hakkında bilgi için CLR ETW Olayları'nda "AppDomain Kaynak İzleme Olayları" konusuna bakın.
Bir uygulama etki alanı tarafından kullanım ömrü boyunca yapılan toplam yönetilen ayırma sayısı bayt cinsinden: Ayrılan nesneler kısa ömürlü olabileceğinden, toplam ayırmalar her zaman bir uygulama etki alanı tarafından bellek kullanımını yansıtmaz. Ancak, bir uygulama çok sayıda nesne ayırıp serbest kalırsa ayırmaların maliyeti önemli olabilir.
Yönetilen API: AppDomain.MonitoringTotalAllocatedMemorySize özelliği.
Barındırma API'si: ICLRAppDomainResourceMonitor::GetCurrentAllocated yöntemi.
ETW olayları:
AppDomainMemAllocated
olay,Allocated
alan.
Yönetilen bellek, bir uygulama etki alanı tarafından başvuruda bulunan ve en son dolu durumdan kurtulan bayt cinsinden, engelleme koleksiyonu: Bu sayı yalnızca tam ve engelleyici bir koleksiyondan sonra doğrudur. (Bu, arka planda gerçekleşen ve uygulamayı engellemeyen eşzamanlı koleksiyonların aksinedir.) Örneğin, GC.Collect() yöntem aşırı yüklemesi tam ve engelleyici bir koleksiyona neden olur.
Yönetilen API: AppDomain.MonitoringSurvivedMemorySize özelliği.
Barındırma API'si: ICLRAppDomainResourceMonitor::GetCurrentSurvived yöntemi,
pAppDomainBytesSurvived
parametre.ETW olayları:
AppDomainMemSurvived
olay,Survived
alan.
İşlem tarafından başvuruda bulunup en son tam ve engelleyici koleksiyonun devamını sağlayan toplam yönetilen bellek bayt cinsinden: Tek tek uygulama etki alanları için hayatta kalan bellek bu sayıyla karşılaştırılabilir.
Yönetilen API: AppDomain.MonitoringSurvivedProcessMemorySize özelliği.
Barındırma API'si: ICLRAppDomainResourceMonitor::GetCurrentSurvived yöntemi,
pTotalBytesSurvived
parametre.ETW olayları:
AppDomainMemSurvived
olay,ProcessSurvived
alan.
Tam, Engelleyen Koleksiyonun Ne Zaman Gerçekleşdiğini Belirleme
Hayatta kalan bellek sayısının ne zaman doğru olduğunu belirlemek için tam, engelleyici bir koleksiyonun ne zaman gerçekleştiğini bilmeniz gerekir. Bunu yapmanın yöntemi, ARM istatistiklerini incelemek için kullandığınız API'ye bağlıdır.
Yönetilen API
sınıfının özelliklerini AppDomain kullanırsanız, tam koleksiyonların bildirimine kaydolmak için yöntemini kullanabilirsiniz GC.RegisterForFullGCNotification . Bir koleksiyonun yaklaşımı yerine bir koleksiyonun tamamlanmasını beklediğiniz için kullandığınız eşik önemli değildir. Ardından tam koleksiyon tamamlanana GC.WaitForFullGCComplete kadar engelleyen yöntemini çağırabilirsiniz. Bir döngüde yöntemini çağıran ve yöntem her döndürdüğünde gerekli tüm çözümlemeleri yapar bir iş parçacığı oluşturabilirsiniz.
Alternatif olarak, 2. nesil koleksiyon sayısının arttığını görmek için yöntemini düzenli aralıklarla çağırabilirsiniz GC.CollectionCount . Yoklama sıklığına bağlı olarak, bu teknik tam koleksiyonun oluştuğuna ilişkin doğru bir gösterge sağlamayabilir.
Barındırma API'si
Yönetilmeyen barındırma API'sini kullanıyorsanız, konağınızın CLR'ye IHostGCManager arabiriminin bir uygulamasını geçirmesi gerekir. CLR, bir koleksiyon gerçekleşirken askıya alınmış iş parçacıklarının yürütülmesini sürdürürken IHostGCManager::SuspensionEnding yöntemini çağırır. CLR, tamamlanan koleksiyonun neslini yönteminin parametresi olarak geçirir, böylece konak koleksiyonun dolu mu yoksa kısmi mi olduğunu belirleyebilir. IHostGCManager::SuspensionEnding yöntemi uygulamanız, sayımların güncelleştirildikleri anda alındığından emin olmak için hayatta kalan belleği sorgulayabilir.