PerformanceCounter для «SMB Server Shares» застревает на последнем ненулевом значении и останавливает выборку реальной пропускной способности - PullRequest
0 голосов
/ 20 апреля 2019

Я использую 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 не изменяется. Он застревает на последнем ненулевом значении

Что мне здесь не хватает?

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