2008-09-22 11 views
13

.NET/İşlem performans sayaçlarını kullanarak bir web sayfasında bazı bellek istatistiklerini (çalışma kümesi, GC'ler vb.) Görüntülemek istiyorum. Ne yazık ki, bu sunucuda birden çok uygulama havuzu varsa, bunlar bir indeks (# 1, # 2 vb.) Kullanılarak ayırt edilirler ancak bir #. Indeksine (sahip olduğum) bir işlem kimliğini nasıl eşleştireceğimi bilmiyorum. Programlı bir yol var mı (bir ASP.NET web sayfasından)?Performans Sayaç Örnek Adını (w3wp # XX) ASP.NET çalışan işlem kimliğinden edin.

+0

Bu senaryoyu ayrıntılı olarak ele alan bir blog yazısı: http://weblog.west-wind.com/posts/2014/Sep/27/Capturing-Performance-Counterüml-for-a-Process-by -Süreç-id. Temel olarak 'örnek isimlerini' almak için başka bir Performans Sayacını kullanmanız ve işlem sayaçlarınızı bu isimle çalıştırmanız gerekir. –

cevap

11

Google'da ilk hit:

birden ASP.NET alt işler

Multiple CLR performance counters appear that have names that resemble "W3wp#1" çalıştıran, ortak dil çalışma zamanı (CLR) performans sayaçlarını benzer adlara sahip olacak "W3wp # 1 "veya " W3sp # 2 "vb. Bu, .NET CLR Bellek performans nesnesinde İşlem Kimliği adlı bir sayacı dahil etmek için .NET Framework 2.0'da düzeltildi. Bu sayaç, örneğinin işlem kimliğini görüntüler. Bu sayacı, bir işlemle ilişkili olan CLR performans sayacını belirlemek için kullanabilirsiniz.

Varsayılan olarak

, Performans İzleyicisi (Perfmon.msc) ekranda birden çok yolla aşağıdaki süreçleri numaralandırılırken tarafından aynı ada sahip süreçler:

Ayrıca KB 281884

İşlem # 1 İşlem # 2 İşlem # 3

Performans Monitörü ayrıcagörüntüleyebilirşekilde aşağıdaki adla işlem kimliğini (PID) ekleyerek bu süreçler:

Process_PID

+1

Aslında doğru değil - adlandırma İşlem, İşlem # 1, İşlem # 2 gibi görünüyor. İçerde postfix dışında bir tane var. –

11
private static string GetProcessInstanceName(int pid) 
{ 
    PerformanceCounterCategory cat = new PerformanceCounterCategory("Process"); 

    string[] instances = cat.GetInstanceNames(); 
    foreach (string instance in instances) 
    { 

    using (PerformanceCounter cnt = new PerformanceCounter("Process", 
      "ID Process", instance, true)) 
    { 
     int val = (int) cnt.RawValue; 
     if (val == pid) 
     { 
      return instance; 
     } 
    } 
    } 
    throw new Exception("Could not find performance counter " + 
     "instance name for current process. This is truly strange ..."); 
} 
+0

Daha hızlı olduğunu düşünüyorum: Process p = Process.tGetProcessById (pid); string instance = Process.ProcessName; – pistacchio

+0

, http://weblogs.thinktecture.com/ingo/2004/06/getting-the-current-process-your-own-cpu-usage.html –

+0

@pistacchio No'dan kopyalanmıştır, eğer varsa, bu size yanlış bir değer verir. Sürecin birden fazla örneği. –

1

chiru tarafından örnek, belirli bir durumda çalışmıyor - Sahip Aynı programın iki sürümü, aynı isimli ve bir .net değil ve .net sürümü, non -.net sürümünden sonra başlar. .Net sürümü, uygulama # 1 olarak adlandırılacaktır, ancak bu adı kullanarak CLR perf sayaçlarına eriştiğinizde, sayaçtaki örnek adlarının # 1 ile aynı ismi vardır, böylece hatalar oluşur.

Nick.

1

Kayıt defteri ayarlarının değiştirilmesi oldukça kolay gözükse de, maalesef çoğumuz sunucuda yapma hakkımız yok (ya da ona dokunmak istemiyoruz!). Bu durumda, küçük bir çözüm var. Bu here hakkında blog yazdım.

0

Daha önce yanıtlandığını biliyorum, ancak tam çalışma kodu uğruna bu çözümü gönderiyorum.Eğer birine uygunluk yukarıdaki yöntemleri kullanın aynı sürecin birden çok örneği toplam bellek almak istiyorsanız,

public static long GetProcessPrivateWorkingSet64Size(int process_id) 
{ 
    long process_size = 0; 
    Process process = Process.GetProcessById(process_id); 
    if (process == null) return process_size; 
    string instanceName = GetProcessInstanceName(process.Id); 
    var counter = new PerformanceCounter("Process", "Working Set - Private", instanceName, true); 
    process_size = Convert.ToInt32(counter.NextValue())/1024; 
    return process_size; 
} 

public static string GetProcessInstanceName(int process_id) 
{ 
    PerformanceCounterCategory cat = new PerformanceCounterCategory("Process"); 
    string[] instances = cat.GetInstanceNames(); 
    foreach (string instance in instances) 
    { 
    using (PerformanceCounter cnt = new PerformanceCounter("Process", "ID Process", instance, true)) 
    { 
     int val = (int)cnt.RawValue; 
     if (val == process_id) 
     return instance; 
    } 
    } 
    throw new Exception("Could not find performance counter "); 
} 

Ayrıca: Bu zincirdeki M4N tarafından sunulan yöntemine dayalı bu kodu unutmayın

public static long GetPrivateWorkingSetForAllProcesses(string ProcessName) 
{ 
    long totalMem = 0; 
    Process[] process = Process.GetProcessesByName(ProcessName); 
    foreach (Process proc in process) 
    { 
    long memsize = GetProcessPrivateWorkingSet64Size(proc.Id); 
    totalMem += memsize; 
    } 
    return totalMem; 
} 
İlgili konular