2015-10-26 2 views
1

Моя проблема в том, что я получаю для WorkSet, очень отличается от диспетчера задач Memory (Private Working Set). Я пробовал различные решения, написанные на NET, но значения слишком далеки от соответствия. Пожалуйста, помогите мне получить память (частный рабочий набор) из диспетчера задач.Получить память (частный рабочий набор) процесса

script += string.Format(@"$Processes = Get-Process -ComputerName {0} | Sort-Object WorkingSet -desc | Select-Object;", remoteMachineName); 
script += @"$ProcessArray= @();"; 
script += @"foreach ($process in $Processes) {"; 
script += @"$ProcessName = $process.ProcessName;"; 
script += @"$ProcessSize = $process.WorkingSet/1KB;"; 
script += @"$objAverage = New-Object System.Object;"; 
script += @"$objAverage | Add-Member -type NoteProperty -name Name -value $ProcessName;"; 
script += @"$objAverage | Add-Member -type NoteProperty -name Memory -value $ProcessSize;"; 
script += @"$ProcessArray +=$objAverage; }; "; 
+0

http://superuser.com/questions/802785/powershell-get-process-and-task-manager-discrepancy –

ответ

1

То, что показано в 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

Смежные вопросы