То, что показано в Process Manager, как памяти (Частный рабочий набор) является значением счетчика производительности \Process\working Set - Private
.
Вы можете получить это значение с:
$ProcessPrivateSet = Get-Counter "\Process(instancename)\Working Set - Private"
$WSPrivateKiloBytes = $ProcessPrivateSet.CounterSamples[0].CookedValue/1KB
$WSPrivateKiloBytes
теперь то же значение, что вы видите в Process Manager.
Проблема с извлечением этого значения для отдельного процесса является то, что экземпляры процесса счетчики производительности имени по имени процесса + экземпляру рассчитывать, а не с помощью идентификатора процесса.
Так что, если вы запустите 1 экземпляр приложения Java, вы можете получить счетчик для java.exe
процесса, например, так:
Get-Counter "\Process(java)\Working Set - Private"
Теперь, если запустить еще один, вы должны будете ссылаться что один такой:
Get-Counter "\Process(java#1)\Working Set - Private"
и так далее.
Вы можете изменить это поведение, установив ProcessNameFormat
для счетчиков производительности объектов в локальной системе, например так:
$RegPath = "HKLM:\SYSTEM\CurrentControlSet\Services\PerfProc\Performance\"
Set-ItemProperty $RegPath -Name ProcessNameFormat -Value 2 -Type DWord
Значение 2 означает «включать в себя идентификатор процесса в имена экземпляров», значение 1 (default) означает «использовать счетчик экземпляров» (как показано выше).
Новый формат будет processname_id
После изменения ProcessNameFormat
, теперь вы можете получить счетчики производительности для конкретного процесса ID, например, так:
$javap = Get-Process -Name java | Select -First 1
Get-Counter "\Process(java_$($javap.Id))\"
Поскольку теперь есть отличный корреляции между выводами Get-Process
и счетчиками производительности теперь вы можете получить значение «Private Working Set» для каждого процесса с помощью одного оператора Select-Object
с использованием рассчитанного свойства:
Get-Process java | Select Name,Id,@{Name="WSPrivate(KB)";Expression = {(Get-Counter "\Process($($_.Name)_$($_.Id))\Working Set - Private").CounterSamples[0].CookedValue/1KB}}
Это будет занять некоторое время, чтобы восстановить каждую отдельную выборку счетчика, так что если вы планируете делать это часто, или для большого набора процессов, вы можете использовать подстановочные (*
) и получить \Process(*)\Working Set - Private
а затем просмотрите InstanceName
в каждой записи в CounterSamples
http://superuser.com/questions/802785/powershell-get-process-and-task-manager-discrepancy –