Счетчик производительности создан, но не работает до перезагрузки Windows - PullRequest
11 голосов
/ 17 сентября 2010

У меня странная проблема с созданием новых счетчиков в существующей группе.У меня есть служба 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<TManager>().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<TManager>().ToArray());

    return installer;
}

Ответы [ 3 ]

13 голосов
/ 24 сентября 2010

Счетчики производительности основаны на сегментах разделяемой памяти.Я видел подобные проблемы, когда у кого-то еще есть дескриптор сегмента общей памяти.Это может включать в себя сам инструмент perfmon.Вы можете использовать утилиту handle, чтобы увидеть, кто держит общую память.Вам не нужно перезагружаться, поэтому попробуйте посмотреть, исчезнет ли эта проблема, сначала отключите perfmon, а затем заново создайте счетчики.Также убедитесь, что ваш сервис не работает.

3 голосов
/ 24 сентября 2010

До ответа Майка я сам решил проблему.Но у меня нет времени, чтобы выяснить причину проблемы.Я решил эту проблему, выполнив следующие действия:

  1. остановка ведения журнала perfmon (я зарегистрировал все свои счетчики через регистратор perfmon)
  2. close perfmon
  3. служба удаления (удаление службыудалить счетчики производительности всей группы)
  4. установить службу с добавленными счетчиками производительности

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

1 голос
/ 14 июля 2014

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

К моему удивлению, решение было ЗАКРЫТЬ Performance Monitor инструмент Windows, а затем создать счетчики.Проблема заключалась в использовании общей памяти, которая была заблокирована.

...