Почему perfmon не видит экземпляры моего пользовательского счетчика производительности? - PullRequest
17 голосов
/ 30 июля 2009

Я создаю несколько пользовательских счетчиков производительности для приложения. Я написал простой инструмент на C # для создания категорий и счетчиков. Например, приведенный ниже фрагмент кода - это в основном то, что я запускаю. Затем я запускаю отдельное приложение, которое бесконечно обновляет исходное значение счетчика. Пока это выполняется, счетчик и фиктивный экземпляр локально отображаются в 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);
}

Ответы [ 6 ]

5 голосов
/ 10 ноября 2010

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

2 голосов
/ 09 декабря 2010

Вы можете попытаться настроить разрешения WMI с помощью этого инструмента: http://www.codeproject.com/KB/system/WmiSecurity.aspx

Использование:

WmiSecurity.exe /C="%computername%" /A /N=Root/CIMV2 /M=" DOMAIN\USER:REMOTEACCESS" /R
1 голос
/ 24 ноября 2010

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

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

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

1 голос
/ 20 октября 2010

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

0 голосов
/ 26 ноября 2010

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

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

  • В брандмауэре 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();
        }
    }
}
0 голосов
/ 28 октября 2010

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

lodctr /M:manifest.man

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

...