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 trueolarak ayarlayarak enabled CLR başlangıcında ARM'yi etkinleştirebilirsiniz.> değeri false (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'yi trueetkinleş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şturmaya AppDomainResourceManagementKeyword 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üğüyle ThreadingKeyword 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.

  • 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 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.

  • İş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.

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.

Ayrıca bkz.