2015-04-01 38 views
13

Tamam, makinede çalışan belirli bir işlemle ilgili verileri sürekli olarak toplamak için WMI (.net/C#) kullanıyorum. Verileri Win32_PerfFormattedData_PerfProc_Process sınıfı üzerinden aldım. Bu sınıf özelliklerinin bir yeri vardır ama aşağıdaki gibi ilgilenen olanlardır:Görev Yöneticisi olarak bellek kullanımı nasıl hesaplanır?

uint64 PageFileBytes; 

Değer, bayt olarak, bu süreç belleği dosyası (ler) kullanılan bildirildi. Sayfalama dosyaları, başka dosyalar içinde bulunmayan işlem tarafından kullanılan bellek sayfalarını depolar. Sayfalama dosyaları tüm süreçler tarafından paylaşılır ve disk belleği dosyalarındaki alan yetersizliği, diğer işlemlerin bellek ayırmasını engelleyebilir.

uint32 PoolNonpagedBytes; 

Değer, bayt olarak, disk belleği olmayan havuzdaki bir diske yazılamıyor nesneler için sistem belleği (işletim sistemi tarafından kullanılan fiziksel bellek) alanı, ama sürece fiziksel bellekte kalmalıdır onlar tahsis edilir. Win32_PerfFormattedData_PerfOS_Memory'daki PoolNonpagedBytes, Win32_PerfFormattedData_PerfProc_Process dosyasındaki PoolPagedBytes özelliğinden farklı olarak hesaplanır, bu nedenle Win32_PerfFormattedData_PerfProc_Process dosyasının tüm örnekleri için PoolPagedBytes toplamına eşit olmayabilir. Bu özellik sadece son gözlemlenen değeri gösterir; ortalama değil.

uint32 PoolPagedBytes; 

Değer, bayt olarak, disk belleği havuzu, diske yazılabilir nesneler için sistem belleği (işletim sistemi tarafından kullanılan fiziksel bellek) alanıdır kullanılmadıkları zaman. Win32_PerfFormattedData_PerfOS_Memory içinde PoolNonpagedBytes özelliği, Win32_PerfFormattedData_PerfProc_Process dosyasındaki PoolPagedBytes özelliğinden farklı olarak hesaplanır, bu nedenle Win32_PerfFormattedData_PerfProc_Process dosyasının tüm örnekleri için PoolPagedBytes toplamına eşit olmayabilir. Bu özellik sadece son gözlemlenen değeri gösterir; ortalama değil.

uint64 PrivateBytes; 

Geçerli değer, bayt cinsinden, bu işlemin diğer işlemlerle paylaşılamayacak şekilde ayrıldığını.

uint64 VirtualBytes; 

İşlemin kullandığı sanal adres alanının bayt cinsinden geçerli boyutu. Sanal adres alanının kullanılması, disk veya ana bellek sayfalarının karşılık gelen kullanımını zorunlu kılmaz. Sanal alan sonludur ve çok fazla kullanarak süreç kütüphaneleri yükleme kabiliyetini sınırlayabilir.

uint64 WorkingSet; 

Zaman içinde herhangi bir noktada bu işlemin çalışma kümesindeki bayt cinsinden maksimum sayı. Çalışma seti, süreçteki iş parçacıklarının son zamanlarda dokunduğu bellek sayfaları kümesidir. Bilgisayardaki boş bellek eşiğin üzerindeyse, kullanımda olmasa bile sayfalar işlemin çalışma kümesinde kalır. Boş bellek bir eşiğin altına düştüğünde, sayfalar çalışma setlerinden kesilir. Gerekirse, ana bellekten ayrılmadan önce çalışma setine geri gönderilirler.

Şu anda işlemin bellek kullanımını bildirmek için WorkingSet alanını kullanıyorum. Ancak bu, Görev Yöneticisi'nin gösterdiği ile uyuşmuyor. PrivateBytes ile denedim ama bu da "doğru" değil. Uygulamanın izlediği süreç bir .NET işlemidir (eğer önemli ise) ve uygulama tarafından Görev Yöneticisi'nin aynı anda gösterdiğinden en az 100MB daha fazla bellek kullanması bildirilir.

Bu soru, Görev Yöneticisi tarafından gösterildiği gibi işlemin bellek kullanımını en iyi şekilde hesaplamak için "formül" nedir?

enter image description here

cevap

3

Win32_PerfFormattedData_PerfProc_Process doğru sınıftır. Çekildiği mülk WorkingSetPrivate'dur. Formül/hesaplama gerekmez.

İlgili konular