Счетчик производительности создан, но не работает до перезапуска Windows

У меня странная проблема с созданием новых счетчиков в существующей группе. У меня есть служба Windows, которая выполняет некоторую работу и позволяет мне отслеживать ее состояние с помощью счетчика производительности. У меня есть группа счетчиков производительности и несколько счетчиков производительности. Группа создается на этапе установки службы (с правами администратора), а счетчики инициализируются при запуске службы (как пользователь LocalSystem). Все работает нормально, группа есть, счетчик тоже есть, Я могу следить за ними и писать в журнал счетчиков производительности. Сервис работает постоянно.

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

Это конец обычной, неинтересной части истории. Здесь начинаются странные вещи.

Я захожу в PerMon, добавляю все счетчики в представление системного монитора. Я вижу свою группу счетчиков производительности, я вижу все счетчики производительности, включая НОВЫЕ счетчики производительности, которые я только что добавил. Я могу добавить их в просмотр системного монитора. И я вижу, что старые счетчики работают. Но новые счетчики не работают, они не собирают никаких данных. Ну ладно, возможно, это моя ошибка, переключаюсь в режим просмотра журнала и пытаюсь записать данные счетчиков производительности. Старые счетчики регистрируются так же, как и раньше. Но когда я пытаюсь добавить новый счетчик, я нахожу в средстве просмотра событий следующее предупреждение:

Службе не удалось добавить счетчик '\ AGENT \ MyCountersGroupName \ MyNewCounter' в журнал или предупреждение NewCountersLog. Этот журнал или предупреждение будет продолжаться, но данные для этого счетчика не будут собираться. Возвращается следующая ошибка: указанный счетчик не может быть найден.

Я попытался переустановить службу, удалить старые счетчики, добавить их снова, но ничего не изменилось. Старые счетчики работают, а новые счетчики не работают. Потом перезагружаю Windows и новые счетчики заработали! В сервисе ничего не изменилось, только что перезапустил сервер. Я столкнулся с этой проблемой на 2 серверах, оба работают под управлением Windows Server 2003 SP1. Код для всех счетчиков производительности идентичен, потому что я создаю их, используя код с обобщениями.

Вы можете сказать: «Эй, не беспокойтесь, перезагружайте Windows каждый раз, когда вам нужно добавить новые счетчики производительности», но я не могу. Моя служба работает на сервере вместе с другими службами, и нам нужно, чтобы эти службы работали постоянно, мы не можем перезапускать сервер каждый раз, когда я меняю одну службу.

Кто-нибудь может помочь с этой проблемой?

Обновление: Похоже, есть аналогичная проблема: https://stackoverflow.com/questions/2180005/adding-performance-counters-to-existing-category

Обновление Я не думаю, что проблема в моем коде, но если это поможет, я размещаю его здесь.

Код для установки и удаления (вызывается на этапе установки): PerformanceCountersManagerBase.GetCreationData () - это общая оболочка для получения сбора данных для создания счетчиков производительности.

public static void Install()
{
    CounterCreationDataCollection counters = new CounterCreationDataCollection(
    PerformanceCountersManagerBase.GetCreationData().ToArray());

    if (PerformanceCounterCategory.Exists(PerformanceCountersManagerBase.GroupName))
        PerformanceCounterCategory.Delete(PerformanceCountersManagerBase.

    PerformanceCounterCategory.Create(PerformanceCountersManagerBase.GroupName, 
        "Group description",
        PerformanceCounterCategoryType.SingleInstance, counters);
}

public static void Uninstall()
{
    if (!PerformanceCounterCategory.Exists(PerformanceCountersManagerBase.GroupName))
        return;

    PerformanceCounterCategory.Delete(PerformanceCountersManagerBase.GroupName);
}

Код для инициализации счетчиков в обслуживании и обновления:

internal void Initialize(string name, string groupName)
{
    _counter = new PerformanceCounter(groupName, name, false);
    _counter.RawValue = 0;
}

internal void Increment()
{
    if ((_counter == null) || _counter.ReadOnly)
        return;

    lock (_counter)
    {
        _counter.Increment();
    }
}

Обновление 3 Я изменил код для установки счетчиков через .NET-компонент PerformanceCounterInstaller, и ничего не изменилось. Старые счетчики работают так, как работали, а вновь созданные не работают, и попытка их регистрации приводит к точному сообщению об ошибке (предупреждению) в журнале событий. Код создания установщика:

public static PerformanceCounterInstaller GetInstaller()
{
    PerformanceCounterGroupAttribute group
        = PerformanceCountersManagerBase.ExtractGroupSettings(typeof(TManager));

    PerformanceCounterInstaller installer = new PerformanceCounterInstaller();
    installer.CategoryName = group.Name;
    installer.CategoryHelp = group.Description;
    installer.CategoryType = PerformanceCounterCategoryType.SingleInstance;
    installer.UninstallAction = UninstallAction.Remove;
    installer.Counters.AddRange(PerformanceCountersManagerBase.GetCreationData().ToArray());

    return installer;
}

11
задан Community 23 May 2017 в 11:53
поделиться