Get-Counter не получает достоверные данные - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь получить сведения о вводе-выводе из диспетчера задач с помощью PowerShell. Ниже приведен сценарий, который я пытаюсь использовать на данный момент, и у него был частичный успех.

  $gc = get-counter -ComputerName $($service.ServerName) "\Process($Tservicename)\IO Other Bytes/sec" -ErrorAction SilentlyContinue 
        $OtherBytes=$gc.CounterSamples|Select cookedvalue

Здесь $ serviceName & ServerName зациклено через. Ниже приведены проблемы, с которыми я сталкиваюсь.

  1. Я не могу получить IO Другие данные о байтах для всей службы, я запускаю сценарий в режиме администратора, поэтому доступ не должен быть проблемой.

  2. Будет ли приведенный выше сценарий давать кумулятивный результат в случае, если выполняется больше, чем выполняется процесс, например, для chrome .exe будет будет ли запущено несколько служб, даст ли это совокупное значение. Если нет, то как я извлекаю детали для каждого процесса chrome.

введите описание изображения здесь

- Обновленный вопрос -

Мы используем командлет Get-Counter для получения сведений о байтах чтения и записи ввода-вывода. Это возвращает 0 для большей части процесса, это из-за невозможности доступа к системному процессу или из-за проблем с доступом.

- Ответ -

После небольшого исследования я понял, что это значение извлекаемый командлетом основан на этом конкретном экземпляре, поэтому нам необходимо выполнить выборку данных с помощью SampleInterval . Однако моего требования было достаточно при использовании параметра RawValue , поскольку я искал значение после запуска сервера в качестве накопительного значения.

  1. Элемент списка

1 Ответ

0 голосов
/ 19 июня 2020

Здесь следует понимать две важные вещи:

  1. Между именами служб и именами процессов нет отношения 1: 1
  2. Имена экземпляров объектов счетчика производительности не используют процесс ID (по крайней мере по умолчанию)

Это означает, что вам нужно выполнить два уровня преобразования экземпляра, чтобы разобраться в счетчиках:

  • Перевести службу в идентификатор процесса - мы можно использовать Win32_Service класс WMI для этого
  • преобразовать идентификатор процесса в Process экземпляры счетчика - мы можем использовать значение счетчика Process(*)\ID Process для этого
function Get-ServiceCounter
{
  param(
    [Parameter(Mandatory = $true, Position = 0)]
    [string]
    $ServiceName,
    [Parameter(Position = 1)]
    [string]
    $ValueName
    [string]
    $Computername = '.'
  )

  $ID = Get-CimInstance Win32_Service -Filter "Name = '${ServiceName}'" -ComputerName $ComputerName -ErrorAction SilentlyContinue |Select -Expand ProcessID
  if(-not $ID){
    Write-Error "Could not resolve process for service '${ServiceName}'"
    return
  }

  $Instance = Get-Counter -ComputerName $ComputerName "\Process(*)\ID Process" |Where-Object CookedValue -eq $ID -ErrorAction SilentlyContinue

  if(-not $Instance){
    Write-Error "Could not performance counter instance for Process ID ${ID}"
    return
  }

  Get-Counter ($InstanceName -replace '\\id process',"\${ValueName}") -ComputerName $ComputerName -ErrorAction SilentlyContinue
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...