Почему вызов PerformanceCounter является медленным?

Я работаю на сервере, который читает "% CPU" и "Available memory" из PerformanceCounters. Это хорошо работает на моей машине разработки. Но на реальных серверах очень медленно читать с этих двух PerformanceCounters. по крайней мере, на первых двух операциях чтения.
Выполнение кода ниже может занять до 4-6 минут:

        Stopwatch watch = new Stopwatch();

        Log.Instance.Debug("Going to initialize Diagnostic's PerformanceCounters");

        watch.Start();

        m_CPUPerformanceCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);
        m_MemoryPerformanceCounter = new PerformanceCounter("Memory", "Available MBytes", true);

        m_CPUPerformanceCounter.NextValue();
        m_MemoryPerformanceCounter.NextValue();

        //Ensure an updated value...
        System.Threading.Thread.Sleep(1000);

        m_CPUPerformanceCounter.NextValue();
        m_MemoryPerformanceCounter.NextValue();

        watch.Stop();

        Log.Instance.Debug("Finished initializing Diagnosticss PerformanceCounters. Time elapsed: {0}", watch.Elapsed);  

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

Finished initializing Diagnosticss PerformanceCounters. Time elapsed: 00:03:59.6706860

Важно, чтобы эти операции чтения (а затем и операция чтения) выполнялись очень быстро. Даже в начале.

Моя машина для разработки - Windows 7, 64-битная, 8 ГБ оперативной памяти.
Клиентскими серверами являются Windows Server 2008 R2 Enterprise, 64-битная, 4 ГБ оперативной памяти.

Я погуглил (и прогнал) это, но не смог найти никакого ответа. Почему это происходит? И как я могу это исправить?

1 ответ

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

В этом случае вы должны выполнить сканирование инициализации счетчика производительности для всех счетчиков производительности, зарегистрированных в системном реестре, что можно сделать с помощью ProcMon.

Другие вопросы по тегам