2011-01-16 18 views
9

के लिए प्रदर्शन काउंटर एक्सेस करना मैं प्रदर्शन काउंटर क्लास का उपयोग कर ".NET CLR Memory category" में C# के प्रदर्शन प्रदर्शन काउंटर तक पहुंचने का प्रयास कर रहा हूं। हालांकि एक मैं क्या उम्मीद करेंगे के साथ श्रेणियों था सही श्रेणी/काउंटर नाम का दृष्टांत नहीं कर सकतेसी #: ".NET CLR मेमोरी श्रेणी"

new PerformanceCounter(".NET CLR Memory", "# bytes in all heaps", Process.GetCurrentProcess().ProcessName); 

मैं निम्नलिखित कोड

string[] categories = PerformanceCounterCategory.GetCategories().Select(c => c.CategoryName).OrderBy(s => s).ToArray(); 
string toInspect = string.Join(",\r\n", categories); 

System.Text.StringBuilder interestingToInspect = new System.Text.StringBuilder(); 
string[] interestingCategories = categories.Where(s => s.StartsWith(".NET") || s.Contains("Memory")).ToArray(); 
foreach (string interestingCategory in interestingCategories) 
{ 
    PerformanceCounterCategory cat = new PerformanceCounterCategory(interestingCategory); 
    foreach (PerformanceCounter counter in cat.GetCounters()) 
    { 
     interestingToInspect.AppendLine(interestingCategory + ":" + counter.CounterName); 
    } 
} 
toInspect = interestingToInspect.ToString(); 

का उपयोग कर श्रेणियों और काउंटरों के माध्यम से पाशन की कोशिश की लेकिन कुछ भी है कि लगता है नहीं पा सके मैच के लिए। क्या इन मूल्यों को सीएलआर के भीतर से देखना संभव नहीं है या क्या मैं कुछ गलत कर रहा हूं।

पर्यावरण, चाहे यह महत्वपूर्ण हो, .NET 4.0 64-बिट विंडोज 7 बॉक्स पर चल रहा है।

+0

क्या यह केवल ओलेग के उत्तर में व्यवस्थापक विशेषाधिकार के साथ चलने का मामला था? यह मेरे लिए तय किया गया। – Rob

उत्तर

6

आप .NET CLR मेमोरी श्रेणी का उपयोग करने के प्रशासक के रूप में कार्यक्रम चलाने की जरूरत है।

जब प्रशासक

[Diagnostics.PerformanceCounterCategory] :: मौजूद है के रूप में चल (":

powershell का उपयोग कर यह साधारण परीक्षण की कोशिश करो,।नेट CLR मेमोरी ")

सच

जब प्रशासनिक विशेषाधिकार के बिना चल रहा है:

[Diagnostics.PerformanceCounterCategory] :: मौजूद है ("। नेट CLR मेमोरी ")

झूठी

+0

+1 यह सही जवाब है, धन्यवाद! – MattDavey

+0

+1 हां, यह खोजना आसान बनाने के लिए उत्तर के रूप में चिह्नित करने के लिए अच्छा होगा। मैंने इसे पहले नजरअंदाज कर दिया, क्योंकि यह नीचे था। – Rob

+2

यह गलत है। प्रशासक पहुंच के लिए पर्याप्त है लेकिन आपको * प्रशासक पहुंच की आवश्यकता नहीं है। Http://stackoverflow.com/a/20174576/834521 देखें: समूह * प्रदर्शन मॉनीटर उपयोगकर्ता * में स्वयं को जोड़ें, और फिर लॉग आउट करें और लॉग इन करें। – TooTone

1

काउंटर प्रति उदाहरण हैं। जोड़ने का प्रयास करें:

foreach (var instance in cat.GetInstanceNames()) 
{ 
    foreach (PerformanceCounter counter in cat.GetCounters(instance)) 
    { 
     interestingToInspect.AppendLine(interestingCategory + ":" + counter.CounterName); 
    } 
} 
3

यह काम करना चाहिए। ध्यान दें कि जैसे ही अन्य पहले से सेट हैं, सीएलआर काउंटर प्रति उदाहरण काउंटर हैं, इस प्रकार आपको उस प्रक्रिया के लिए इंस्टेंस नाम निर्दिष्ट करने की आवश्यकता है जिसके लिए आप काउंटर से पूछना चाहते हैं।

तो आपके पोस्ट के शीर्ष पर निर्दिष्ट बयान कार्य करना चाहिए। हालांकि, अगर आप भी निर्माता अधिभार आपके द्वारा निर्दिष्ट करने के लिए है कि आप "केवल पढ़ने के लिए" मोड में उदाहरण का उपयोग करना चाहते हैं अनुमति देता है का उपयोग करना चाहिए:

new PerformanceCounter(".NET CLR Memory", "# bytes in all heaps", Process.GetCurrentProcess().ProcessName, true); 

दूसरा कोड टुकड़ा तुम्हें तैनात काम नहीं करता है, जैसा कि आप नहीं था ' GetCounters() ऑपरेशन के लिए एक इंस्टेंस नाम निर्दिष्ट करें। इसके बजाए GetCounters(string instanceName) ओवरलोड का उपयोग करें और इसे काम करना चाहिए।

अंत में, ध्यान दें कि उदाहरण नाम Process.ProcessName (या Process.GetCurrentProcess().ProcessName उस मामले के लिए आवश्यक नहीं है)। यदि किसी प्रक्रिया के कई उदाहरण हैं, यानी निष्पादन योग्य, प्रक्रिया का नाम #<number> जोड़कर बनाया गया है। किसी प्रक्रिया के वास्तविक उदाहरण नाम को जानने के लिए आपको .NET CLR Memory\Process ID काउंटर से पूछना चाहिए।

उदाहरण:

public static string GetInstanceNameForProcessId(int pid) 
    { 
     var cat = new PerformanceCounterCategory(".NET CLR Memory"); 
     foreach (var instanceName in cat.GetInstanceNames()) 
     { 
      try 
      { 
       using (var pcPid = new PerformanceCounter(cat.CategoryName, "Process ID", instanceName)) 
       { 
        if ((int)pcPid.NextValue() == pid) 
        { 
         return instanceName; 
        } 
       } 
      } 
      catch (InvalidOperationException) 
      { 
       // This may happen, if the PC-instance no longer exists between the 
       // time we called GetInstanceNames() and the time we come around actually 
       // try and use the instance. 
       // In this situation that is not an error, so ignore it. 
      } 
     } 

     throw new ArgumentException(
      string.Format("No performance counter instance found for process id '{0}'", pid), 
      "pid"); 
    } 

उदाहरण के नाम आप इस विधि द्वारा इकट्ठा अन्य ".NET CLR" वर्ग में प्रदर्शन काउंटरों रूप में अच्छी तरह के लिए अच्छा है।

अद्यतन: उस समय के बीच संभावित दौड़ की स्थिति के लिए शमन जोड़ा गया जब हम संभावित उदाहरण नाम एकत्र करते हैं और जिस समय हम उन्हें समझते हैं। जब हम इसका उपयोग करने का प्रयास करते हैं तो एक .NET प्रक्रिया (जिसके लिए हमने एक इंस्टेंस नाम देखा है) अब और नहीं हो सकता है (और ऐसा उदाहरण भी चला गया है)।

संबंधित मुद्दे