2010-04-09 19 views
7

C# kullanarak özel çalışma kümesini nasıl hesaplarım? Ben ilgileniyorum taskmgr.exe ile aynı rakam üretir.Özel çalışma kümesini (bellek) nasıl hesaplarsınız?

İşlem ad alanını ve WorkingSet64 ve PrivateMemorySize64 gibi yöntemleri/verileri kullanıyorum ancak bu rakamlar 100 MB veya daha fazla zaman diliminde kapalı.

cevap

23

Bu son derece değişken bir sayıdır, bunu hesaplayamaz. Windows bellek yöneticisi, sayfaları RAM'in içinde ve dışında sürekli olarak değiştirir. TaskMgr.exe bir performans sayacından alır. Aynı numara böyle alabilirsiniz:

using System; 
using System.Diagnostics; 

class Program { 
    static void Main(string[] args) { 
     string prcName = Process.GetCurrentProcess().ProcessName; 
     var counter = new PerformanceCounter("Process", "Working Set - Private", prcName); 
     Console.WriteLine("{0}K", counter.RawValue/1024); 
     Console.ReadLine(); 
    } 
} 

, sayı gerçekten çok anlamına gelmez dikkat musunuz Diğer süreçlerin başlamak zaman bırakın ve RAM için yarışacak.

+0

Bunun anlamı nedir, "sayı gerçekten çok fazla değil"? Bu rakam, sürecin başka bir süreçle paylaşılamayan ne kadar belleğini temsil etmiyor? Ben süreci "art niyetli" süreçlerini öldürecek bir hizmet binası ilgilendiğim - "art niyetli" bellek birçok MB x daha fazlasını kullanarak süreçler olarak tanımlanmaktadır. Kullandığım rakamın gerçekten çok fazla bir şey ifade etmemesi durumunda hizmeti yazmaktan nefret ediyorum. Ne önerirsiniz? – sholsapp

+0

Hayır, rakamın anlamı bu değil. Diğer işlemler tarafından paylaşılamayan bir işlem tarafından alınan "Özel Bayt", * sanal * bellek miktarını arıyorsunuz. –

+7

Tüm söylenenler doğru olsa da, eklemek istedim, eşleşen işlem örneğini aramak için 'ProcessName' kullanmak yeterli değildir. Eğer (örneğin svchost.exe) aynı olan birden çok işlem varsa o zaman sayaç adları da parçasıdır "Kimlik Süreci" sayaç aracılığıyla eşleşmeleri gerekir vs. "svchost # 1", "svchost # 2" olacak işlem kategorisi ve 'Process.ID'. değeri önbelleğe "eski" süreç kudreti kapatma ve ınstancename olarak, çalışmaz –

0

gelecek kullanıcılar için, burada birden fazla örnek olabilir süreçleri için özel çalışma kümesi almak için emin olmak için yapmak zorunda budur. GetNameToUseForMemory'dan uygun işlem adını alan CurrentMemoryUsage'u arıyorum. Bu döngüyü, olabildiğince sonuçlara göre filtrelemede bile yavaş buldum. Bu nedenle, bu nedenle, adı önbelleğe almak için bir sözlük kullanarak GetNameToUseForMemory'u görüyorsunuz.

private static long CurrentMemoryUsage(Process proc) 
{ 
    long currentMemoryUsage; 
    var nameToUseForMemory = GetNameToUseForMemory(proc); 
    using (var procPerfCounter = new PerformanceCounter("Process", "Working Set - Private", nameToUseForMemory)) 
    { 
    //KB is standard 
    currentMemoryUsage = procPerfCounter.RawValue/1024; 
    } 
    return currentMemoryUsage; 
} 

private static string GetNameToUseForMemory(Process proc) 
{ 
    if (processId2MemoryProcessName.ContainsKey(proc.Id)) 
    return processId2MemoryProcessName[proc.Id]; 
    var nameToUseForMemory = String.Empty; 
    var category = new PerformanceCounterCategory("Process"); 
    var instanceNames = category.GetInstanceNames().Where(x => x.Contains(proc.ProcessName)); 
    foreach (var instanceName in instanceNames) 
    { 
    using (var performanceCounter = new PerformanceCounter("Process", "ID Process", instanceName, true)) 
    { 
     if (performanceCounter.RawValue != proc.Id) 
     continue; 
     nameToUseForMemory = instanceName; 
     break; 
    } 
    } 
    if(!processId2MemoryProcessName.ContainsKey(proc.Id)) 
    processId2MemoryProcessName.Add(proc.Id, nameToUseForMemory); 
    return nameToUseForMemory; 
} 
+0

Not "yeniden anahtarlı" http://blogs.technet.com/b/askperf/archive/2010/03/30/perfmon alır -hisse-process-by-pid yerine-yerine-as.aspx – Andre

+0

@Herhangi doğru konum! tks –

İlgili konular