2009-07-30 21 views
17

मैं एक आवेदन के लिए कुछ कस्टम प्रदर्शन काउंटर बना रहा हूँ। मैंने श्रेणियों और काउंटर बनाने के लिए एक सरल सी # टूल लिखा था। उदाहरण के लिए, नीचे कोड स्निपेट मूल रूप से मैं चल रहा हूं। फिर, मैं एक अलग ऐप चलाता हूं जो काउंटर के कच्चे मूल्य को अंतहीन रूप से रीफ्रेश करता है। हालांकि यह चलता है, काउंटर और डमी उदाहरण पेर्फॉन में स्थानीय रूप से देखा जाता है।क्यों मेरे कस्टम प्रदर्शन काउंटर के उदाहरण देखने के लिए perfmon नहीं कर सकते हैं?

मेरी समस्या यह है कि हमारे द्वारा उपयोग की जाने वाली निगरानी प्रणाली किसी अन्य सर्वर से दूरस्थ रूप से देखने पर बनाए गए बहु-उदाहरण काउंटर में उदाहरण नहीं देख सकती है। काउंटर ब्राउज़ करने के लिए पेर्फॉन का उपयोग करते समय, मैं श्रेणी और काउंटर देख सकता हूं, लेकिन इंस्टेंस बॉक्स ग्रे हो गया है और मैं "सभी उदाहरण" भी नहीं चुन सकता, और न ही मैं "जोड़ें" पर क्लिक कर सकता हूं। अन्य एक्सेस विधियों का उपयोग करना, जैसे [typeperf][1] समान मुद्दों को प्रदर्शित करते हैं।

मुझे यकीन नहीं है कि यह एक सर्वर या कोड समस्या है या नहीं। यह केवल उत्पादन वातावरण में पुनरुत्पादित है जहां मुझे इसकी आवश्यकता है। मेरे डेस्कटॉप और विकास सर्वर पर, यह बहुत अच्छा काम करता है। मैं सभी सर्वरों पर एक स्थानीय व्यवस्थापक हूँ।

var pc = new PerformanceCounter(category_name, counter_name, instance_name, false); 
while (true) { 
    pc.RawValue = 0; 
    Thread.Sleep(1000); 
} 
+0

नेट का कौन सा संस्करण है? –

+0

यह थोड़ी देर हो गया है, लेकिन मुझे यकीन है कि मैं उस समय .NET 2.0 या 3.5 का उपयोग कर रहा था। – spoulson

+0

क्या आपने कभी यह उत्तर दिया है? मैं सोच रहा हूं कि क्या आपने एक कस्टम प्रदर्शन काउंटर क्लास बनाया है और यह धारावाहिक नहीं था? –

उत्तर

1

(आड़ी-तिरछी रेखाएं पिछला टेक्स्ट बाहर) मुझे लगता है कि दूरदराज के उपयोग की समस्या नहीं है (वास्तविक कंप्यूटर पर प्रयास करें:

CounterCreationDataCollection collection = new CounterCreationDataCollection(); 

var category_name = "My Application"; 
var counter_name = "My counter name"; 
CounterCreationData ccd = new CounterCreationData(); 
ccd.CounterType = PerformanceCounterType.RateOfCountsPerSecond64; 
ccd.CounterName = counter_name; 
ccd.CounterHelp = counter_name; 
collection.Add(ccd); 

PerformanceCounterCategory.Create(category_name, category_name, PerformanceCounterCategoryType.MultiInstance, collection); 

फिर, एक अलग अनुप्रयोग में, मैं इस डमी उदाहरण डेटा उत्पन्न करने के लिए चलाने के)। यदि नहीं, तो परीक्षण कंप्यूटर पर कुछ और कनेक्ट करने के लिए कुछ तरीका ढूंढें (प्रदर्शन के साथ खिड़की पर मूल सरल प्रदर्शन काउंटर)। परीक्षण करने के लिए डमी ऐप पर कच्चे मूल्य को भी संपादित करें।

+0

शायद अनुमतियां या कुछ? – rogerdpack

0

दूरस्थ सिस्टम पर काउंटर दर्ज की यानी की कोशिश करें, .:

lodctr /M:manifest.man

यदि वह काम नहीं करता है, यह एक अनुमतियाँ मुद्दा हो सकता है।

5

क्या आपका प्रोग्राम 32-बिट प्रोग्राम Windows 2008 R2 या किसी अन्य 64 बिट विंडोज ओएस पर चल रहा है? यदि ऐसा है तो आप यह जांचना चाहेंगे कि सेवा "प्रदर्शन काउंटर डीएलएल होस्ट" चल रही है। यह सेवा 32-बिट प्रक्रियाओं द्वारा प्रदान किए गए काउंटर क्वेरी करने के लिए 64-बिट और दूरस्थ प्रक्रियाओं को सक्षम करती है।

1

यह कुछ समय हो गया है क्योंकि मैंने इसे देखा है, लेकिन आप मूल्य को सेट करने से पहले NextValue को कॉल करने और यह काम करने से पहले देखना चाह सकते हैं। यह समझा नहीं जाएगा कि यह कुछ मशीनों पर क्यों काम करता है लेकिन दूसरों को नहीं।

एक और मजेदार बात यह है कि वास्तव में आपके इंस्टेंस नाम में क्या चल रहा है। सुनिश्चित करें कि वहां कोई आरक्षित पात्र नहीं जा रहे हैं अन्यथा सभी प्रकार की बुरी चीजें होती हैं।

यदि आप वास्तव में काउंटर को पढ़ते हैं तो एक और एप्लिकेशन कताई करके नामकरण समस्या हो सकती है, तो आप एक विचार प्राप्त करने में सक्षम हो सकते हैं। यदि आप इसे सफलतापूर्वक पढ़ सकते हैं और परफॉर्म नहीं कर सकते हैं, तो इसका मतलब है कि आपके पास एक नाम स्वरूपित है जो PerfMon को सही तरीके से व्याख्या करने से रोकता है।

0

यह फ़ायरवॉल समस्या भी हो सकती है।

  • Windows फ़ायरवॉल में, कार्य केंद्र वर्ग कंप्यूटर, "प्रदर्शन लॉग्स पर:

    दूरस्थ कंप्यूटर (एक बहु उदाहरण प्रदर्शन काउंटर एप्लिकेशन होस्टिंग), यह सुनिश्चित कर लें पर फ़ायरवॉल सॉफ़्टवेयर इनकमिंग कनेक्शन की अनुमति देता है कि और अलर्ट "अपवाद को सक्षम करने की आवश्यकता है।

  • उन्नत सुरक्षा के साथ विंडोज फ़ायरवॉल में, सर्वर क्लास कंप्यूटर पर, "प्रदर्शन लॉग और अलर्ट (DCOM-In)" और "प्रदर्शन लॉग और अलर्ट (टीसीपी-इन)" इनबाउंड नियमों को सक्षम करने की आवश्यकता है।

यहाँ आप की जाँच करने के लिए आप फ़ायरवॉल ठीक से कॉन्फ़िगर किया गया है कि एक काम सी # कंसोल उदाहरण है ...

// Based on the MSDN-supplied C# example from: 
// Adding and Removing Performance Counter Instances 
// http://msdn.microsoft.com/en-us/library/8t39y5k1%28v=VS.71%29.aspx 
using System; 
using System.Diagnostics; 
using System.Threading; 

namespace CustomPerformanceCounters 
{ 
    class Program 
    { 
     private const string categoryName = "Instance Category"; 
     private const string categoryHelp = "Instanced counter demonstration for StackOverflow."; 
     private const string counterName = "Instance Counter"; 
     private const string counterHelp = "Instanced counter demonstration for StackOverflow."; 

     static void RegisterCounter() 
     { 
      if (!PerformanceCounterCategory.CounterExists(counterName, categoryName)) 
      { 
       PerformanceCounterCategory.Create(
        categoryName 
        , categoryHelp 
        , PerformanceCounterCategoryType.MultiInstance 
        , counterName 
        , counterHelp 
        ); 
      } 

     } 

     static void RunCounter() 
     { 
      const string instance1 = "instance1"; 
      const string instance2 = "instance2"; 
      const string instance3 = "instance3"; 

      // Assumes category and counter have been created. 
      PerformanceCounter myCounter = new PerformanceCounter(
       categoryName 
       ,counterName 
       , instance1 
       , false 
       ); 

      int currentValue = 0; 
      int currentIncrement = 1; 
      while (true) 
      { 
       currentValue += currentIncrement; 
       if (currentValue > 99) 
       { 
        currentIncrement = -1; 
       } 
       else if (currentValue < 1) 
       { 
        currentIncrement = 1; 
       } 
       int instance1Value = currentValue; 
       int instance2Value = 100 - currentValue; 
       int instance3Value = Math.Abs(instance1Value - instance2Value); 
       Console.WriteLine("Current values: {0}, {1}, {2}", instance1Value, instance2Value, instance3Value); 

       myCounter.InstanceName = instance1; 
       myCounter.RawValue = instance1Value; 
       myCounter.InstanceName = instance2; 
       myCounter.RawValue = instance2Value; 
       myCounter.InstanceName = instance3; 
       myCounter.RawValue = instance3Value; 

       Thread.Sleep(1000); 
      } 
     } 

     static void Main(string[] args) 
     { 
      RegisterCounter(); 
      RunCounter(); 
     } 
    } 
} 
2

आप इस उपकरण का उपयोग WMI अनुमतियों को समायोजित करने की कोशिश कर सकते हैं: http://www.codeproject.com/KB/system/WmiSecurity.aspx

उपयोग:

WmiSecurity.exe /C="%computername%" /A /N=Root/CIMV2 /M=" DOMAIN\USER:REMOTEACCESS" /R