#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
Записи журнала событий:
- Идентификатор события 1003: расширяемая библиотека DLL счетчика «C:WindowsSystem32perfts.dll » для службы «LSM» возвращена неверная длина объекта. Сумма возвращенных длин объектов 1 не соответствовала размеру возвращаемого буфера.
- Событие-ИДЕНТИФИКАТОР 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:
Вы можете читать их только с правами администратора…