2009-07-30 27 views
17

Bir uygulama için bazı özel performans sayaçları oluşturuyorum. Kategoriler ve sayaçlar oluşturmak için basit bir C# yazdım. Örneğin, aşağıdaki kod snippet'i temelde çalışıyorum. Ardından, sayacın ham değerini sınırsızca yenileyen ayrı bir uygulama çalıştırıyorum. Bu çalışır iken, sayaç ve kukla örneği, yerel olarak perfmonda görülür.Neden özel performans sayacımın örneklerini perfmon göremiyor?

Kullanmakta olduğum sorun şu ki, kullandığımız izleme sistemi, başka bir sunucudan uzaktan görüntülendiğinde oluşturduğum çok örnekli sayacıdaki örnekleri göremiyor. Sayaçları taramak için perfmon kullanıldığında, kategori ve sayaçları görebiliyorum, ancak örnekler kutusunun grileştiği ve "Tüm örnekler" i seçemediğim gibi "Ekle" yi de tıklayamıyorum. [typeperf][1] gibi diğer erişim yöntemlerini kullanmak benzer sorunları gösterir. Bu bir sunucu veya kod sorunu olup olmadığından emin değilim. Bu sadece ihtiyacım olan üretim ortamında tekrarlanabilir. Masaüstü ve geliştirme sunucularında harika çalışıyor. Tüm sunucularda yerel bir yöneticiyim. Ben gerçek bilgisayarda deneyin (uzaktan erişim sorunu olduğunu düşünüyorum

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

mı? –

+0

Bir süredir var, ama o zaman ya .NET 2.0 ya da 3.5 kullanıyordum. – spoulson

+0

Bunu hiç yanıtladı mı? Özel bir performans sayacı sınıfı oluşturduysanız ve seri hale getirilemiyor mu merak ediyorum? –

cevap

1

(karalamalar önceki metin dışarı) :

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

Sonra ayrı bir app, bu kukla örneği verilerini oluşturmak için çalıştırın). Değilse, test bilgisayarına başka bir şey bağlamanın bir yolunu bulun (ekranlı bir pencerede basit basit performans sayacı). Ayrıca test etmek için kukla uygulamada ham değeri düzenleyin.

+0

belki izinler veya başka bir şey? – rogerdpack

0

.: Uzak sistemde sayaçları kayıt Bu işe yaramazsa, bir izin sorunu olabilir lodctr

/M:manifest.man

yani deneyin.

5

Programınız, Windows 2008 R2 veya başka bir 64 bit Windows işletim sisteminde çalışan 32 bit bir program mı? Eğer öyleyse, "Performance Counter DLL Host" hizmetinin çalıştığını kontrol etmek isteyebilirsiniz. Bu hizmet, 64 bit ve uzak işlemlerin, 32 bit işlemlerle sağlanan sayaçları sorgulamasını sağlar.

1

Buna baktığımdan beri bir süre geçti, ancak değeri ayarlamadan ve çalışıp çalışmadığını görmeden önce NextValue'u aramayı denemek isteyebilirsiniz. Neden bazı makineler üzerinde çalıştığını açıklamıyor ama bazılarına değil.

Bakmanız gereken başka bir şey de örnek adınızda gerçekte ne olup bittiğidir. Saklı karakterlerin içeri girmediğinden emin olun, aksi takdirde her türlü kötü şey gerçekleşir.

Gerçekten de sayacı okuyan başka bir uygulama döndürerek adlandırma sorunu olup olmadığına dair bir fikir edinebilirsiniz. Eğer başarılı bir şekilde okuyabiliyor ve perfmon yapamıyorsanız, PerfMon'un doğru bir şekilde yorumlamasını engelleyecek şekilde biçimlendirilmiş bir adınız var demektir.

0

Bu, bir güvenlik duvarı sorunu da olabilir. Windows Güvenlik Duvarı

  • , iş istasyonu sınıfı bilgisayarlar, "Performans Günlükleri tarih: Uzak bilgisayar (çok örnekli performans sayacı uygulaması barındıran bir), emin olun günü

    Firewall yazılımı gelen bağlantılara izin verdiğinden ve Uyarılar "istisnasının etkinleştirilmesi gerekiyor.
  • Gelişmiş Güvenlik Özellikli Windows Güvenlik Duvarı'nda, sunucu sınıfı bilgisayarlarda "Performans Günlükleri ve Uyarıları (DCOM Giriş)" ve "Performans Günlükleri ve Uyarıları (TCP-In)" gelen kurallarının etkinleştirilmesi gerekir. Eğer güvenlik duvarı doğru yapılandırılmış var olmadığını kontrol etmek için Buraya

... bir çalışma C# konsol örnek

// 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(); 
     } 
    } 
} 
İlgili konular