Установка общего экземпляра для счетчиков производительности - PullRequest
6 голосов
/ 27 июня 2009

VS 2005, C # 2.0, .NET 2.0 / 3.0, Win2003

Я пытаюсь установить набор счетчиков производительности для MultiInstance. Я заметил, что некоторым категориям счетчиков производительности системы удается поддерживать " total ", даже когда других экземпляров нет. ASP.NET Apps 2.0.50727 является примером.

Так что я пытался повторить это. Я создал следующую процедуру в классе Installer, который затем добавляю в Custom Action в проекте установки.

public override void Install(System.Collections.IDictionary stateSaver)
{
    //Debugger.Break();
    CounterCreationData data = new CounterCreationData("ZCounter", "ZCtrHelp", PerformanceCounterType.NumberOfItems32);
    PerformanceCounterCategory.Create("ZCategory", "ZCatHelp", PerformanceCounterCategoryType.MultiInstance, new CounterCreationDataCollection(new CounterCreationData[] { data }));
    PerformanceCounter counter = new PerformanceCounter();
    counter.CategoryName = "ZCategory";
    counter.CounterName = "ZCounter";
    counter.InstanceName = "ZTotal";
    counter.InstanceLifetime = PerformanceCounterInstanceLifetime.Global;
    counter.ReadOnly = false;
    counter.RawValue = 0;
    base.Install(stateSaver);
}

Если я раскомментирую строку Debugger.Break() и перейду к следующему шагу, я вижу, что счетчик действительно создан с правильным именем экземпляра, и Visual Studio Server Explorer показывает экземпляр вместе с InstanceLifetime, для которого установлено значение Global. Я не вызываю метод RemoveInstance () в программе установки.

Тем не менее, через несколько секунд после завершения программы установки этот экземпляр исчезает из системного монитора и из VS Server Explorer. Как мне заставить его придерживаться? Или я могу?

Ответы [ 4 ]

7 голосов
/ 02 ноября 2009

Некоторый код должен активно поддерживать счетчик. Во всех случаях, о которых вы можете подумать, таких как ASP.Net, есть служба, которая поддерживает счетчик.

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

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

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

1 голос
/ 01 ноября 2009

AFAIK категория Global Performance Counter будет оставаться активной, пока любой процесс имеет активный дескриптор, ссылающийся на нее. Системные счетчики достигают этого, сохраняя дескриптор общего экземпляра счетчика в некоторой службе.

0 голосов
/ 30 июня 2009

Просто предложение, но попробуйте сделать

Counter.ReadOnly = true;

первый проход и установка его в False только когда вам нужно увеличить счетчик.

А также, если вы делаете Counter Readonly, вам необходимо закомментировать строку:

Counter.RawData = 0;

Я полагаю, что по умолчанию он установлен на 0 при первом проходе.

Надеюсь, это поможет ...

0 голосов
/ 29 июня 2009

Попробуйте создать категорию с помощью «PerformanceCounterCategoryType.SingleInstance».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...