Я использую PerformanceCounter для определения общего количества записей SMB, которые произошли за последнюю минуту, для которых я построил PerformanceCounter в своем коде C # и получаю RawValue
счетчика каждую минуту:
Tuple<string, string, string> perfCounterKey = Tuple.Create(category, counter, instance);
try
{
PerformanceCounter performanceCounter = PerfCounters.GetOrAdd(
perfCounterKey,
value => new Lazy<PerformanceCounter>(() =>
{
var newPerformanceCounter = new PerformanceCounter(category, counter, instance);
if (newPerformanceCounter.NextValue() == 0.0)
{
// Sleep after calling first NextValue() method to avoid rate perf counters returning 0
Thread.Sleep(TimeSpan.FromMilliseconds(50));
}
return newPerformanceCounter;
}).Value);
return performanceCounter;
}
Для быстрого тестирования моих изменений я также использую этот скрипт powershell:
$C = New-Object Diagnostics.PerformanceCounter("SMB Server Shares", "Write Bytes/sec")
$C.InstanceName = "_Total"
for ($i = 0; $i -lt 10; $i++) {
$v1 = $C.RawValue; Sleep 10; $v2 = $C.RawValue; Echo $v1; Echo $v2;
}
Когда я монтирую тестовый общий ресурс SMB и пишу в него, я замечаю, что:
- Во время операции записи (diskpd) PerformanceCounter возвращает точное значение
- Когда тест останавливается, RawValue не изменяется. Он застревает на последнем ненулевом значении
Что мне здесь не хватает?