Как рассчитать загрузку процессора Windows

#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.