在powershell中按CPU使用百分比列出流程

时间:2016-10-09 13:02:43

标签: powershell

如何使用CPU>列出进程?将Get-Process的输出汇总到Where-Object

,输出1%

完成初学者到powershell所有我能想到的就是这样的

Get-Process | Where-Object { CPU_Usage -gt 1% }

6 个答案:

答案 0 :(得分:14)

如果您想要CPU百分比,可以使用Get-Counter获取性能计数器,并且可以为所有进程运行Get-Counter。因此,列出使用超过5%CPU使用率的进程:

(Get-Counter '\Process(*)\% Processor Time').CounterSamples | Where-Object {$_.CookedValue -gt 5}

这将列出在采样样本的实例中使用> 5%CPU的进程。希望这有帮助!

答案 1 :(得分:7)

这里有几点需要注意:

  • 首先,您必须使用%变量来引用当前来自管道的对象。
  • 第二,Powershell不使用%来表示百分比 - 而0.01代表模数运算符。因此,当您需要百分比时,您必须通过简单地将其乘以Get-Process来自行转换数字。

  • 第三,CPU_Usage cmdlet没有字段CPU;可以找到其输出摘要Advanced Custom Styling Example here。关于字段Get-Process | Where-Object { $_.CPU -gt 100 } 说:"进程在所有处理器上使用的处理器时间量,以秒为单位。" 所以要清楚你能做什么期待数字。

汇总命令可以写成

Get-Process | Select-Object -expand CPU | Measure-Object -Sum | Select-Object -expand Sum

这为您提供了超过100秒CPU时间的过程。

如果您需要类似相对陈述的内容,首先必须总结所有使用的时间,然后将实际时间除以总时间。您可以获得总CPU时间,例如由

{{1}}

尝试将其与上一个命令一起堆叠。

答案 2 :(得分:1)

我一直在寻找一种解决方案,以按进程获取CPU和内存利用率。我尝试了所有可以在哪里获得CPU的解决方案,但这些数字与taskmanager不匹配。所以我写了我自己的。以下将提供每个过程的准确cpu利用率。我在I7笔记本电脑上进行了测试。

StringBuilder

答案 3 :(得分:0)

这个过程怎么样?

$sleepseconds = 1
$numcores = 4
$id = 5244

while($true) {
  $cpu1 = (get-process -Id $id).cpu
  sleep $sleepseconds
  $cpu2 = (get-process -Id $id).cpu
  [int](($cpu2 - $cpu1)/($numcores*$sleepseconds) * 100)
}

答案 4 :(得分:0)

Get-Counter外,您还可以使用Get-WmiObect列出和过滤流程。

powershell "gwmi Win32_PerfFormattedData_PerfProc_Process -filter "PercentProcessorTime > 1" | Sort PercentProcessorTime -desc | ft Name, PercentProcessorTime"

或者,对于Get-Counter,这是一个显示数字格式转换的示例,以摆脱CookedValue的烦人小数位。 除了过滤之外,此示例还说明了排序,限制列和输出格式:

powershell "(Get-Counter '\Process(*)\% Processor Time').Countersamples | Where cookedvalue -gt 3 | Sort cookedvalue -Desc | ft -a instancename, @{Name='CPU %';Expr={[Math]::Round($_.CookedValue)}}"

Get-Process不是正确的cmdlet,因为它不提供瞬时CPU利用率。

您还可以获得所有处理器的总负载:

powershell "gwmi win32_processor | Measure-Object LoadPercentage -Average | ft -h Average"

或者,

typeperf -sc 4 "\Processor(_Total)\% Processor Time"

答案 5 :(得分:0)

通过增加对逻辑核数量的动态检测来进一步改善先前的答案,以便可以将百分比调整回我们普通人希望看到的百分比,其中100%表示计算机的所有CPU带宽,并且没有值大于100%。包括一个设置为10%的过滤器,您可以对其进行适当调整。这种假设是,人们将对找到具有高过载处理器使用率的进程感兴趣,而不希望列出机器的众多空闲进程。

$NumberOfLogicalProcessors=(Get-WmiObject -class Win32_processor | Measure-Object -Sum NumberOfLogicalProcessors).Sum
(Get-Counter '\Process(*)\% Processor Time').Countersamples | Where cookedvalue -gt ($NumberOfLogicalProcessors*10) | Sort cookedvalue -Desc | ft -a instancename, @{Name='CPU %';Expr={[Math]::Round($_.CookedValue / $NumberOfLogicalProcessors)}}

示例输出:

InstanceName CPU %
------------ -----
_total         100
idle           100