2009-07-30 3 views
17

Я создаю некоторые пользовательские счетчики производительности для приложения. Я написал простой инструмент C# для создания категорий и счетчиков. Например, нижеприведенный фрагмент кода - это в основном то, что я запускаю. Затем я запускаю отдельное приложение, которое бесконечно обновляет исходное значение счетчика. Пока это работает, счетчик и фиктивный экземпляр отображаются локально в perfmon.Почему perfmon не может видеть экземпляры моего пользовательского счетчика производительности?

Проблема, с которой я сталкиваюсь, заключается в том, что система мониторинга, которую мы используем, не может видеть экземпляры множителя нескольких экземпляров, которые я создал при удаленном просмотре с другого сервера. Когда вы используете perfmon для просмотра счетчиков, я вижу категорию и счетчики, но окно экземпляров выделено серым цветом, и я даже не могу выбрать «Все экземпляры», и я не могу нажать «Добавить». Использование других методов доступа, таких как [typeperf][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); 

Затем в отдельном приложении, я запускаю это для создания фиктивных данных экземпляра:

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

Какая версия .Net это? –

+0

Прошло некоторое время, но я уверен, что в то время я использовал .NET 2.0 или 3.5. – spoulson

+0

Получили ли вы ответ? Мне интересно, если вы создали собственный класс Counter Counter, и он не был сериализуемым? –

ответ

1

(каракули предыдущего текст из) Я думаю, что удаленный доступ проблема (попробуйте на фактическом компьютере). Если нет, найдите способ подключить к нему что-то еще на тестовом компьютере (простой простой счетчик производительности в окне с дисплеем). Также отредактируйте необработанное значение для фиктивного приложения для тестирования.

+0

могут быть разрешения или еще что-то? – rogerdpack

0

Попробуйте регистрации счетчики на удаленной системе, т.е .:

lodctr /M:manifest.man

Если это не сработает, это может быть проблема с разрешениями.

5

Есть ли в вашей программе 32-разрядная программа, работающая под Windows 2008 R2 или другая 64-битная ОС Windows? Если это так, вы можете проверить, работает ли служба «Счетчик DLL производительности». Эта служба позволяет 64-битным и удаленным процессам запрашивать счетчики, предоставляемые 32-битными процессами.

1

Прошло некоторое время с тех пор, как я посмотрел на это, но вы можете попробовать позвонить в NextValue перед установкой значения и посмотреть, работает ли это. Это не объясняет, почему это работает на некоторых машинах, но не на других.

Еще одна интересная вещь, которая стоит посмотреть на то, что на самом деле происходит в имени вашего экземпляра. Удостоверьтесь, что никакие зарезервированные символы не идут, иначе могут возникнуть всевозможные плохие вещи.

Возможно, у вас возникнет проблема, если это проблема именования, развернув другое приложение, которое фактически читает счетчик. Если вы можете успешно прочитать его, а perfmon не может, это означает, что у вас есть имя, отформатированное таким образом, который не позволяет PerfMon правильно интерпретировать его.

0

Это может быть проблема с брандмауэром.

На удаленном компьютере (один хостинг несколько экземпляра счетчик производительности приложения в), убедитесь, что брандмауэр программного обеспечения позволяет входящие соединения:

  • В брандмауэре Windows, на класс рабочих станций компьютеров, «Журналы производительности и предупреждений "необходимо включить.
  • В брандмауэре Windows с расширенной безопасностью на компьютерах класса класса необходимо включить «входящие правила» журналов производительности и предупреждений (DCOM-In) и «Журналы производительности и предупреждения (TCP-In)».

Вот рабочий пример C# консоль для вас, чтобы убедиться, что у вас есть брандмауэр настроен правильно ...

// 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 

 Смежные вопросы

  • Нет связанных вопросов^_^