Подтвердить что ты не робот

Почему 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);
}
4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

lodctr/M:manifest.man

Если это не сработает, это может быть проблема с правами доступа.

Ответ 6

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

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

  • В брандмауэре Windows на компьютерах класса рабочей станции необходимо включить исключение "Журналы производительности и оповещения".
  • В брандмауэре Windows с расширенной безопасностью на компьютерах класса класса необходимо включить правила входящего и исходящего трафика ( "DCOM-In" ) и "Performance Logs and Alerts (TCP-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();
        }
    }
}