2008-09-22 26 views
13

से प्रदर्शन काउंटर इंस्टेंस नाम (w3wp # XX) प्राप्त करें। मैं .NET/Process प्रदर्शन काउंटर का उपयोग करके किसी वेब पेज पर कुछ मेमोरी आंकड़े (वर्किंग सेट, जीसी इत्यादि) प्रदर्शित करना चाहता हूं। दुर्भाग्यवश, यदि उस सर्वर पर एकाधिक एप्लिकेशन पूल हैं, तो वे इंडेक्स (# 1, # 2 इत्यादि) का उपयोग करके अलग-अलग होते हैं, लेकिन मुझे नहीं पता कि उस #xx इंडेक्स में एक प्रक्रिया आईडी (जो मेरे पास है) से मेल खाना है। क्या कोई प्रोग्रामेटिक तरीका है (एएसपी.नेट वेब पेज से)?एएसपी.NET कार्यकर्ता प्रक्रिया आईडी

+0

यहां एक ब्लॉग पोस्ट है जो इस परिदृश्य पर विस्तार से चर्चा करता है: http://weblog.west-wind.com/posts/2014/Sep/27/Capturing- प्रदर्शन - काउंटर- डेटा-for-a- प्रोसेस-by -Process-ईद। मूल रूप से आपको 'इंस्टेंस नाम' पुनर्प्राप्त करने के लिए एक और प्रदर्शन काउंटर का उपयोग करने की आवश्यकता होती है और फिर उस नाम के साथ अपने प्रक्रिया काउंटर चलाएं। –

उत्तर

11

गूगल पर पहली हिट:

Multiple CLR performance counters appear that have names that resemble "W3wp#1"

कई ASP.NET वर्कर प्रक्रियाओं जब चल रहे हैं, साझा भाषा क्रम (CLR) प्रदर्शन काउंटरों ऐसे नाम हैं जो समान होगा "w3wp # 1 "या " W3sp # 2 "और इसी तरह। यह को .NET Framework 2.0 में काउंटर नामक काउंटर नामक .NET CLR मेमोरी प्रदर्शन ऑब्जेक्ट में शामिल करने के लिए उपचार किया गया था। यह काउंटर उदाहरण के लिए प्रक्रिया आईडी प्रदर्शित करता है। आप इस काउंटर का उपयोग पर कर सकते हैं सीएलआर प्रदर्शन काउंटर जो किसी प्रक्रिया से जुड़ा हुआ है निर्धारित करता है।

डिफ़ॉल्ट रूप से, प्रदर्शन मॉनिटर (Perfmon.msc) प्रदर्शित करता है कई प्रक्रियाओं में प्रक्रियाओं गणना करके एक ही नाम है कि जिस तरह से निम्नलिखित:

इसके अलावा KB 281884

प्रक्रिया # 1 प्रक्रिया # 2 प्रक्रिया # 3

प्रदर्शन मॉनिटर भीप्रदर्शित कर सकता हैरास्ता निम्नलिखित में नाम के लिए प्रक्रिया ID (पीआईडी) जोड़कर इन प्रक्रियाओं:

Process_PID

+1

दरअसल यह सही नहीं है - नामकरण की तरह दिखता है प्रक्रिया, प्रक्रिया # 1, प्रक्रिया # 2। पोस्टफिक्स के साथ वहां एक है। –

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

मुझे लगता है कि यह तेज़ है: प्रक्रिया पी = Process.tGetProcessById (पिड); स्ट्रिंग उदाहरण = प्रक्रिया। प्रोसेसनाम; – pistacchio

+0

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

+0

@pistacchio No से कॉपी किया गया है, जो आपको गलत मान देता है यदि वहां है प्रक्रिया के एक से अधिक उदाहरण। –

1

chiru द्वारा उदाहरण के लिए एक विशिष्ट मामले में काम नहीं करता है - जब आपके पास उसी प्रोग्राम के दो संस्करण, वही नामित हैं, और एक .NET नहीं है और आप non-.net संस्करण के बाद .NET संस्करण प्रारंभ करते हैं। .Net संस्करण को applicaion # 1 नाम दिया जाएगा, लेकिन जब आप इस नाम का उपयोग कर सीएलआर परफ काउंटर तक पहुंचते हैं, तो काउंटर पर इंस्टेंस नामों का नाम # 1 के साथ होता है, इसलिए आपको असफलता मिलती है।

निक।

1

भले ही रजिस्ट्री सेटिंग्स को बदलना काफी आसान लगे, दुर्भाग्यवश हम में से अधिकांश को सर्वर पर ऐसा करने का अधिकार नहीं है (या हम इसे छूना नहीं चाहते हैं!)। उस मामले में, एक छोटा सा कामकाज है। मैंने इस here के बारे में ब्लॉग किया है।

0

मुझे पता है कि इसका उत्तर पहले दिया गया है, लेकिन केवल पूर्ण कार्य कोड के लिए मैं इस समाधान को पोस्ट कर रहा हूं।कृपया विधि इस श्रृंखला में M4N द्वारा प्रस्तुत के आधार पर इस कोड को नोट करें:

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 "); 
} 

इसके अलावा, आप एक ही प्रक्रिया के कई उदाहरण की कुल स्मृति पाने के लिए एक निम्नलिखित के साथ ऊपर तरीकों का उपयोग करना चाहते हैं:

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; 
} 
संबंधित मुद्दे