加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 连续监视前X个进程的CPU使用率百分比

发布时间:2020-12-14 04:00:29 所属栏目:Windows 来源:网络整理
导读:我希望能够每5秒向顶级CPU消费者输出一个日志文件.这样我就可以在测试期间看到谁使用了大部分cpu. 我发现这个答案很常见: $cpu = Get-Counter -ComputerName localhost "Process(*)% Processor Time" ` | Select-Object -ExpandProperty countersamples `
我希望能够每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

我有2个问题:

>有时我得到:

Get-Counter : The data in one of the performance counter samples is not valid. View the Status property for each PerformanceCounterSample object to make sure it contains valid data.

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

java      25%
idea64    0.8%
...

解决方法

我将尝试使用以下脚本立即回答您的两个问题:

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%

>按照规定,您有时会得到:

Get-Counter : The data in one of the performance counter samples is
not valid. View the Status property for each PerformanceCounterSample
object to make sure it contains valid data.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读