#powershell
#powershell
Вопрос:
Я пытаюсь найти, какой процесс потребляет больше всего процессора. Я запускаю следующую команду
Get-Process | Sort-Object CPU -desc | Select-Object -first 10
вывод:
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
446 15 15920 11456 29,413.36 1216 0 svchost
548 21 16932 19544 6,929.14 3048 0 svchost
360 21 100236 37108 6,720.61 13812 0 WmiPrvSE
617 36 177652 95728 5,051.56 3708 0 RepMgr
4298 0 196 20 3,123.17 4 0 System
230 18 63936 58656 2,621.58 1344 0 svchost
1139 79 283204 172980 1,956.97 2464 0 MsMpEng
380 13 5444 5808 1,399.78 80 0 svchost
1718 25 8484 13320 858.80 708 0 lsass
3002 112 88856 135276 680.59 6964 1 explorer
кроме того, когда я выполнил приведенную ниже команду
но когда я вижу диспетчер задач
самый верхний процесс загрузки процессора cmd.exe и wmiprvSE.exe
почему команда, которую я использовал, не отображается cmd.exe как самый высокий процесс загрузки процессора?
Ответ №1:
Как вы можете заметить, с
Get-Process | Get-Member
...
CPU ScriptProperty System.Object CPU {get=$this.TotalProcessorTime.TotalSeconds;}
Это означает, что ЦП отражает только время обработки (секунды, потраченные на 100% эквивалентный процессор), а не использование ЦП в реальном времени.
Чтобы получить использование процессора в реальном времени :
Get-Counter -Counter "Process(*)% Processor Time" | Select -ExpandProperty CounterSamples |
Select InstanceName, RawValue | Sort RawValue -Descending | Select -First 10 -Skip 1
-Skip 1
заключается в том, чтобы скрыть общую загрузку процессора.
Имейте в виду, что счетчики локализованы. Итак, если вы не используете английскую версию Windows, вам нужно изменить имя счетчика, например, французская версия "Processus(*)% Temps processeur"
, извините, боюсь, что я не смогу перевести намного больше 🙂
Ответ №2:
Также возможно иметь несколько cmd
запущенных процессов на вашем компьютере, и диспетчер задач может суммировать их и показывать вам совокупное значение. Можете ли вы попробовать сгруппировать его с помощью ProcessName
, а затем распечатать 10 лучших?
PS C:> Get-Process | ? {$_.ProcessName -match "cmd"}
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
81 7 3888 4940 0.02 9200 1 cmd
85 7 3072 5056 0.13 14496 1 cmd
PS C:>
PS C:> Get-Process | Group-Object -Property ProcessName | ForEach-Object {
New-Object psobject -Property @{
Item = $_.Name
CPU = ($_.Group | Measure-Object CPU -Sum).sum
}
} | Sort-Object -Descending -Property CPU | Select-Object -first 10
CPU Item
--- ----
6806.09375 chrome
1292.71875 WhatsApp
426.640625 explorer
295.328125 KillerControlCenter
150.625 SystemSettings
86.453125 AutoHotkey
64.671875 Code
62.59375 WindowsTerminal
51.125 WINWORD
47.5 SearchApp
PS C:>
Комментарии:
1. Это все равно не вернет эффективное использование процессора в реальном времени
2. Да, согласен @CFou.