PerformanceCounter не возвращает значения на некоторых машинах - PullRequest
0 голосов
/ 18 февраля 2019

Я использую класс .NETs System.Diagnostics.PerformanceCounter для извлечения использования памяти и% времени ЦП процесса веб-службы.

Локальный запуск кода на моей машине разработки Win10, вызов NextValue () возвращаетправильное значение.Как только я перемещаю двоичные файлы на компьютер с Windows Server 2012, я получаю

  • 0 для PerformanceCounter («Процесс», «Время процессора%», Process.GetCurrentProcess (). ProcessName)
  • «в основном» 0 для PerformanceCounter («Процессор», «Время процессора%», «_Total») (периодически я получаю правильные значения там, но только каждое 10-е значение имеет значение, отличное от 0
  • Полностью фиктивные (и не изменяющиеся при фактическом использовании) значения для PerformanceCounter («Process», «Working Set», p.ProcessName) (фактически это значение остается постоянным 44 МБ при полной перезапуске приложения, независимо отнагрузки на службу.

Нет исключений, указывающих, что я использую неправильные имена счетчиков или имя процесса.

Вот что я попробовал (без успеха)

  • проверено на наличие каких-либо ключей реестра «Отключить системный монитор» (не найдено)
  • восстановлены настройки счетчика производительности с помощью lodctr / R
  • , запустил приложениеПри наличии повышенных прав доступа
  • пользователь, запустивший приложение, добавлен в группу «Пользователи системного монитора»
  • , пользователь, запустивший приложение, добавлен в группу «Пользователи системного журнала»
  • побежал Get-Counter -Counter "\ Processor (*) \% Processor Time" в Powershell -> получил действительные номера при каждом вызове (но первый, который в порядке)

Чего мне не хватает?Большинство ответов, касающихся PerformanceCounters, возвращающих неправильные значения или 0, относятся, например, к NextValue, вызываемому только один раз.Это не тот случай (и это делает поиск решения несколько сложным).Я хорошо знаю об этом ограничении и не ожидаю, что первое возвращаемое значение будет ненулевым.Это все остальные значения, следующие за ошибкой или 0.

1 Ответ

0 голосов
/ 18 февраля 2019

Вот что оказалось проблемой:

Я изначально "вроде" исправил это, перезапустив сервер.Это привело меня к мысли, что вам придется перезапускаться после каждого вызова lodctr, что является ерундой (фу). Иногда это срабатывало из-за порядка, в котором сервисы запускались на сервере, я думаю ...

Оказывается, что на серверах, где он не работал, было несколько процессов с одним и тем же именем исполняемого файла, что означает вызов PerformanceCounter ("Process", "% Processor Time", Process.GetCurrentProcess (). ProcessName ) получает полный мусор.

Допустим, у вас запущены три службы, все с одинаковым именем исполняемого файла "MyWebService.exe", но все они могут находиться в разных местах,использовать разные конфигурации и т. д., затем вам нужно вызвать PerformanceCounter с InstanceName из «MyWebService # 1», «MyWebService # 2» и т. д.

Конечно, это несколько сложнонайти правильный номер для использования после #.И что гораздо хуже: если кто-то убьет MyWebService # 1, PerformanceCounters для MyWebService # 2 начнет отслеживать показатели для того, что раньше было MyWebService # 3.И все, что контролирует MyWebService # 3, получит исключение.

Отличная идея от команды .NET.Вместо того, чтобы использовать Process ID как здравомыслящий человек, почему бы не использовать имена процессов с суффиксом, чтобы идентифицировать процессов вместо o_O

Итак:

  1. вам нужно регулярно обновлять PerformanceCounter.InstanceName, чтобы убедиться, что вы все еще получили правильный процесс
  2. вам действительно нужен еще один PerformanceCounter, чтобы получить правильное InstanceName, что оказывается нелепыммедленно.

поискать "PerformanceCounter множественное имя процесса" для более полезных ссылок

Спасибо @PavelAnikhouski за вашу помощь, тем не менее

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