持续监控前X个进程的CPU使用率百分比

时间:2016-07-24 11:24:00

标签: windows performance powershell cpu monitor

我希望能够每5秒向顶级CPU消费者输出一个日志文件。这样我就可以在测试期间看到谁使用了大部分cpu。

我发现这个答案很常见:

$cpu = Get-Counter -ComputerName localhost "\Process(*)\% Processor Time" `
    | Select-Object -ExpandProperty countersamples `
    | where {$_.InstanceName -ne 'idle' } `
    | where {$_.InstanceName -ne '_total' }`
    | Select-Object -Property instancename, cookedvalue `
    | Sort-Object -Property cookedvalue -Descending `
    | Select-Object -First 5 `
    | ft @{L='Date';E={Get-Date}}, InstanceName, @{L='CPU';E={(($_.Cookedvalue/100)/$NumberOfLogicalProcessors).toString('P')}} -HideTableHeaders `
    | Format-Table -Auto | Out-String

我有两个问题:

  1. 有时我会:

      

    获取计数器:其中一个性能计数器样本中的数据无效。查看每个PerformanceCounterSample对象的Status属性,以确保它包含有效数据。

  2. 我想获得完整的流程名称,而不是

    java      25%
    idea64    0.8%
    ...

2 个答案:

答案 0 :(得分:7)

我会尝试使用以下脚本一次回答您的两个问题:

Get-Counter "\Process(*)\% Processor Time" -ErrorAction SilentlyContinue `
  | select -ExpandProperty CounterSamples `
  | where {$_.Status -eq 0 -and $_.instancename -notin "_total", "idle"} `
  | sort CookedValue -Descending `
  | select TimeStamp,
    @{N="Name";E={
        $friendlyName = $_.InstanceName
        try {
            $procId = [System.Diagnostics.Process]::GetProcessesByName($_.InstanceName)[0].Id
            $proc = Get-WmiObject -Query "SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId=$procId"
            $procPath = ($proc | where { $_.ExecutablePath } | select -First 1).ExecutablePath
            $friendlyName = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($procPath).FileDescription
        } catch { }
        $friendlyName
    }},
    @{N="CPU";E={($_.CookedValue/100/$env:NUMBER_OF_PROCESSORS).ToString("P")}} -First 5 `
 | ft -a -HideTableHeaders

结果如下表所示:

24.07.2016 21:00:53 Microsoft Edge Content Process    9,68%
24.07.2016 21:00:53 system                            0,77%
24.07.2016 21:00:53 Microsoft Edge                    0,39%
24.07.2016 21:00:53 runtimebroker                     0,39%
24.07.2016 21:00:53 Host Process for Windows Services 0,39%
  1. 按照规定,您有时会得到:
  2.   

    获取计数器:其中一个性能计数器样本中的数据是   无效。查看每个PerformanceCounterSample的Status属性   对象以确保它包含有效数据。

    这与Windows环境中的进程管理有关。在执行查询时,可能会出现一些进程,其中一些可能会消失(即wmiprvse进程负责执行wmi查询)。某些进程可能需要您拥有更多权限。这一切都在获取过程信息时导致错误。可以使用-ErrorAction SilentlyContinue开关安全地跳过它,并使用Status -eq 0表达式进行过滤。

    1. 您还希望看到更友好的流程名称。我不知道使用GetVersionInfo方法获取该名称是否比使用可执行文件更好。如果此类信息可用FileDescription属性存储该值。如果它不可用,则使用非友好的进程名称。

答案 1 :(得分:1)

你得到类似这样的输出

Name                    CPU CPUPercent Description             
----                    --- ---------- -----------             
chrome           10.4988673       8.79 Google Chrome           
powershell_ise    6.5364419       7.16 Windows PowerShell ISE  
chrome           38.0174437       4.88 Google Chrome           
chrome           26.2549683       4.87 Google Chrome           
chrome           16.9417086       3.16 Google Chrome           
cavwp            10.2648658       2.67 COMODO Internet Security
chrome           13.1820845       2.44 Google Chrome           
chrome           675.016327       2.02 Google Chrome           
7.9.7_42331    1037.1570484       1.51 BitTorrent              
chrome          340.8777851       1.02 Google Chrome                                                                  

使用

$CPUPercent = @{
  Name = 'CPUPercent'
  Expression = {
    $TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds
    [Math]::Round( ($_.CPU * 100 / $TotalSec), 2)
  }
}
Get-Process -ComputerName $env:computername | 
 Select-Object -Property Name, CPU, $CPUPercent, Description |
 Sort-Object -Property CPUPercent -Descending |
 Select-Object -First 10 |format-table -autosize | out-file c:\pro.log

信用:http://powershell.com/cs/blogs/tips/archive/2013/04/16/documenting-cpu-load-for-running-processes.aspx

Get-Process -ComputerName $ env:csv中可以拥有的远程计算机的计算机名称

     Import-CSV c:\"computers.csv" | % { 
    $Server = $_.ServerName
    $alivetest = Test-Path "\\$Server\c$\"
    If ($alivetest -eq "True")
    {Get-Process -ComputerName $server | 
 Select-Object -Property Name, CPU, $CPUPercent, Description |
 Sort-Object -Property CPUPercent -Descending |
 Select-Object -First 10 |format-table -autosize | out-file c:\pro.log}
 }}