【问题标题】:Powershell Process CPU checkingPowershell进程CPU检查
【发布时间】:2017-10-13 19:09:05
【问题描述】:

具有以下工作正常,但在 PowerShell 中存在问题:

$FileName = "E:\Work\ps\Inventory.htm"
$serverlist = "E:\Work\ps\Monitored_computers.txt"

foreach ($server in Get-Content $serverlist)
{
$servern=$server.split(",")[0]
$ip=$server.split(",")[1]

$cpu = gwmi Win32_PerfFormattedData_PerfProc_Process -Computer $servern -filter "Name <> '_Total' and Name <> 'Idle'" | Sort-Object PercentProcessorTime -Descending | where { $_.PercentProcessorTime -gt 0 }| select -First 1
if ($cpu.PercentProcessorTime -ge "92") {
write-host $servern ' ' $cpu.Name ' ' $cpu.PercentProcessorTime
}
}

我在 PowerShell 中看到了一些其他代码,它们取平均值,但几乎看起来像是“平均值的平均值”——这是没有意义的。而且,这是针对整体 CPU 使用率的

gwmi win32_processor | Measure-Object -property LoadPercentage -Average | Foreach {$_.Average}

现在,如果我们可以采用相同的逻辑并申请我们的流程问题:

gwmi Win32_PerfFormattedData_PerfProc_Process | Sort-Object PercentProcessorTime -Descending | where { $_.PercentProcessorTime -gt 0 } | select -First 1 | Measure-Object -property PercentProcessorTime -Average | Foreach {$_.PercentProcessorTime}

我想问的是:我确实得到了 CPU 百分比,这似乎是一个“时间点”。如何找到真正的 CPU 百分比?这就是我指出平均值的原因。我真的很想绕过其中的“时间点”部分。

关键是,当我们多次看到服务器上每个进程的 CPU 很高时,我们登录到服务器,高 CPU 已经消退。这并不是说,每次都是这样,但我们知道有时 CPU 会出现峰值然后安静下来。

感谢您的任何见解!

【问题讨论】:

  • 您的问题是什么?您在 PowerShell 中提到了一个问题,但不知道问题是什么。

标签: powershell cpu-usage


【解决方案1】:

第一个问题,你被困在一个时间点,因为当你执行你的脚本时,它会捕捉到当时正在发生的事情的快照。您要查找的是历史数据,因此您可以计算出进程在一段时间内的平均 CPU 使用率,并查明导致 CPU 陷入困境的进程。您是否有性能监视器来跟踪各个进程的 CPU 使用情况?如果您希望能够在事后获得所需的数字,则可能需要设置性能日志记录。

其次,我认为您误解了Measure-Object 的工作原理。如果您在 cmdlet 上运行 Get-Help 并检查输出,您将看到它输出了一个 GenericMeasureInfo 对象。此对象将具有您正在寻找的相关统计数据的属性,在您的情况下是 Average 属性。它不是平均值的平均值,我看到的最常见的用法是计算一些东西,比如总和或平均值,然后输出该属性的值。

让我们尝试一个简单的例子......

查找文件夹中文件的平均大小。首先,我们使用Get-ChildItem 获取文件集合,并将其通过管道传送到Measure-Object。我们将指定-Average 参数来指定我们想要计算平均值,并指定-Property length,以便它知道要平均什么:

GCI C:\Temp\* -file | Measure-Object -Average -Property length

这会输出一个GenericMeasureInfo 对象,如下所示:

Count    : 30
Average  : 55453155
Sum      : 
Maximum  : 
Minimum  : 
Property : Length

这让我知道它有 30 个文件通过管道传输到它,并且它找到了 Length 属性的平均值。现在,有时您想要计算多个事物,因此您可以使用多个参数,例如 -Sum-Maximum,这些值也会被填充:

Count    : 30
Average  : 55453155
Sum      : 1663594650
Maximum  : 965376000
Minimum  : 
Property : Length

所以看起来我的平均文件约为 55MB,但在整个文件夹的 1.6GB 中,我有一个文件是 965MB!该文件无疑扭曲了我的数字。使用该输出,我可以找到包含多个文件的文件夹,但一个文件占用了该文件夹一半以上的空间,并发现异常...例如我保存到 C:\temp 文件夹中的 ISO原因。看来我需要做一些文件维护。

【讨论】:

    【解决方案2】:

    感谢@TheMadTechnician,我能够解决这个问题。我有一个错误的组件

    $_.平均

    我在哪里

    $_.PercentProcessorTime

    那永远不会奏效。这是正确的脚本:

    $serverlist = "D:\Work\ps\Monitored_computers.txt"
    
    foreach ($server in Get-Content $serverlist) {
        $servern=$server.split(",")[0]
        $ip=$server.split(",")[1]
    
        $cpu = gwmi Win32_PerfFormattedData_PerfProc_Process -Computer $ip | `
         Where-Object {$_.Name -like "*tomcat*"}  | `
         Measure-Object -property PercentProcessorTime -Average | `
         Foreach {$_.Average}
        if ($cpu -ge "20") {
            write-host $servern $cpu ' has a tomcat process greater than 20'
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      相关资源
      最近更新 更多