Счетчик производительности «Задержка ввода пользователем за сеанс» исчезает

#c# #performancecounter #perfmon

#c# #счетчик производительности #perfmon

Вопрос:

Сервер Win2019 предлагает новые счетчики производительности, которые могут помочь с проблемами производительности на хостах с RDS (= службы удаленных рабочих столов).

Перед использованием они должны быть активированы с помощью раздела реестра:
https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/rds-rdsh-performance-counters
После перезагрузки системы они доступны.

В perfmon.msc они видны и могут быть использованы.
Но когда я начинаю использовать код C # для чтения этих счетчиков.

Счетчики производительности видны и в C #:

 PerformanceCounterCategory[] categories = PerformanceCounterCategory.GetCategories();
foreach(var category in categories)
{
   Console.WriteLine(category.CategoryName);
}
 

Затем я начинаю считывать счетчик производительности:

 PerformanceCounter performanceCounter = null;
bool continueRunning = true;
try
{
   performanceCounter = new PerformanceCounter("User Input Delay per Session", "Max Input Delay", "Max");
   Console.WriteLine("PerfCounter created");
}
catch(Exception ex)
{
   Console.WriteLine(string.Format("ERROR: Could not create PerfCounter = '{0}'", ex.Message));
   continueRunning = false;
}          
while (continueRunning)
{
   try
   {
     float perfValue = performanceCounter.NextValue();
     Console.WriteLine(string.Format("NextValue = '{0}'", perfValue));
   }
   catch(Exception ex)
   {
      Console.WriteLine(string.Format("ERROR: Could not read NextValue '{0}'", ex.Message));
      continueRunning = false;
   }
   System.Threading.Thread.Sleep(2000);
}
 

Теперь я получаю сообщение об ошибке в программе и две записи журнала событий:
Вывод программы:

 PerfCounter created
ERROR: Coud not read NextValue 'The Counter layout for the Category specified is invalid, a counter of the type:  AverageCount64, AverageTimer32, CounterMultiTimer, CounterMultiTimerInverse, CounterMultiTimer100Ns, CounterMultiTimer100NsInverse, RawFraction, or SampleFraction has to be immediately followed by any of the base counter types: AverageBase, CounterMultiBase, RawBase or SampleBase.'
Program terminated
 

Записи журнала событий:

  1. Идентификатор события 1003: расширяемая библиотека DLL счетчика «C:WindowsSystem32perfts.dll » для службы «LSM» возвращена неверная длина объекта. Сумма возвращенных длин объектов 1 не соответствовала размеру возвращаемого буфера.
  2. Событие-ИДЕНТИФИКАТОР 1017: отключен сбор данных счетчика производительности из службы «LSM», поскольку библиотека счетчиков производительности для этой службы сгенерировала одну или несколько ошибок. Ошибки, вызвавшие это действие, были записаны в журнал событий приложения. Исправьте ошибки перед включением счетчиков производительности для этой службы.

С этого момента счетчики производительности исчезли (также в perfmon.msc) и больше не видны / не используются. Кроме того, (для меня) они не могут быть повторно активированы. Счетчики производительности также исчезли в perfmon.msc.

Что нужно сделать, чтобы прочитать эти счетчики производительности в C # без «потери» их в ОС?
и также важно
Как я могу снова сделать счетчик потерянной производительности видимым / пригодным для использования?

Комментарии:

1. Вы уверены, что для этого запроса не требуется какой-либо First() или Seek() перед вызовом NextValue() ? сообщение об ошибке указывает, что запрос недействителен. Возможно, строка журнала, на которую ссылается NextValue(), неправильно инициализирована..

2. Образцы от Microsoft просто используют NextValue(), и я не смог найти метод First(). Для меня это немного расстраивает, потому что я не могу повторно активировать счетчик потерянной производительности (переустановка ОС — это не выход)

Ответ №1:

Вы можете сохранять и восстанавливать счетчики производительности с помощью инструмента Microsoft lodctr. Итак, если вы уже могли «потерять» эти счетчики, попробуйте «lodctr / r» в любом случае. Они могут вернуться.

perfts.dll требуется выравнивание в 8 байт, что не всегда выполняется, особенно в программах .NET. Обходной путь, который устраняет эту проблему: отключите флажок «Предпочитайте 32-разрядную версию» в VisualStudio 201. /ProjectSettings/Build /General

Ответ №2:

Вы можете читать их только с правами администратора…