2009-07-30 12 views
17

Tworzę niestandardowe liczniki wydajności dla aplikacji. Napisałem proste narzędzie C# do tworzenia kategorii i liczników. Na przykład poniższy fragment kodu to w zasadzie to, co używam. Następnie uruchamiam oddzielną aplikację, która bez końca odświeża surową wartość licznika. Podczas gdy to działa, licznik i sztuczna instancja są widoczne lokalnie w perfmon.Dlaczego perfmon nie może zobaczyć wystąpień mojego niestandardowego licznika wydajności?

Problem polega na tym, że system monitorowania, którego używamy, nie widzi wystąpień w liczniku wielu instancji, który utworzyłem podczas zdalnego przeglądania z innego serwera. Używając narzędzia perfmon do przeglądania liczników, widzę kategorię i liczniki, ale pole instancji jest wyszarzone i nie mogę nawet wybrać "Wszystkie wystąpienia" ani kliknąć "Dodaj". Korzystanie z innych metod dostępu, takich jak [typeperf][1], powoduje podobne problemy.

Nie jestem pewien, czy jest to problem z serwerem czy kodem. Jest to powtarzalne tylko w środowisku produkcyjnym, gdzie jest to potrzebne. Na moim komputerze i serwerach programistycznych działa świetnie. Jestem administratorem lokalnym na wszystkich serwerach.

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

Następnie, w oddzielnej aplikacji, biegnę to wygenerować manekina instancji dane:

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

Która wersja .Net to jest? –

+0

Minęło trochę czasu, ale jestem pewien, że korzystałem z .NET 2.0 lub 3.5 w tym czasie. – spoulson

+0

Czy kiedykolwiek otrzymałeś odpowiedź? Zastanawiam się, czy utworzyłeś niestandardową klasę licznika wydajności i nie można jej przekształcać do postaci szeregowej? –

Odpowiedz

1

(literkami poprzednim tekście out) myślę zdalnego dostępu jest problem (spróbuj od rzeczywistego komputera). Jeśli nie, znajdź jakiś sposób podłączenia czegoś innego do komputera testowego (podstawowy prosty licznik wydajności w oknie z wyświetlaczem). Edytuj także wartość nieprzetworzoną w atrapie aplikacji do przetestowania.

+0

może uprawnienia czy coś takiego? – rogerdpack

0

Spróbuj rejestracji liczników w systemie zdalnym, tj .:

lodctr /M:manifest.man

Jeśli to nie zadziała, to może być problem uprawnienia.

5

Czy Twój program jest 32-bitowym programem działającym na Windows 2008 R2 lub innym 64-bitowym systemie operacyjnym Windows? Jeśli tak, możesz sprawdzić, czy usługa "Host licznika wydajności licznika" jest uruchomiona. Ta usługa umożliwia procesom 64-bitowym i zdalnym odpytywanie liczników dostarczanych przez procesy 32-bitowe.

1

Minęło trochę czasu, odkąd na to patrzyłem, ale możesz spróbować wywołać NextValue przed ustawieniem wartości i sprawdzeniem, czy to działa. Nie wyjaśniłoby, dlaczego działa na niektórych maszynach, ale nie na innych.

Kolejną fajną rzeczą, na którą warto zwrócić uwagę, jest faktyczna nazwa instancji. Upewnij się, że żadne zarezerwowane postacie się tam nie pojawią, w przeciwnym razie wydarzy się wiele złych rzeczy.

Możesz być w stanie uzyskać pomysł, jeśli jest to problem z nazewnictwem, poprzez obrócenie innej aplikacji, która odczytuje licznik. Jeśli możesz go poprawnie odczytać, a perfmon nie, oznacza to, że masz nazwę sformatowaną w sposób uniemożliwiający jej prawidłową interpretację przez PerfMon.

0

Może to być również problem z zaporą.

Na komputerze zdalnym (jednego hostingu aplikacji multi-instancja licznika wydajności), upewnić się, że oprogramowanie Firewall pozwala na połączenia przychodzące:

  • w Zaporze systemu Windows na komputerach klasy stacji roboczej „Dzienniki wydajności i wyjątek Alerts musi być włączony.
  • W Zaporze systemu Windows z zabezpieczeniami zaawansowanymi na komputerach klasy serwerów należy włączyć reguły przychodzące "Dzienniki wydajności i alerty (DCOM-In)" i "Dzienniki wydajności i alerty (TCP-In)".

Oto przykład konsola robocza C#, aby sprawdzić, czy masz poprawnie skonfigurowany firewall ...

// 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(); 
     } 
    } 
} 
Powiązane problemy