首页 文章

Powershell进程CPU检查

提问于
浏览
0

有以下哪些工作正常,但在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会飙升然后安静下来 .

感谢您的任何见解!

2 回答

  • 0

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

    其次,我认为你误解了 Measure-Object 的工作原理 . 如果在cmdlet上运行 Get-Help 并检查输出,您将看到它输出 GenericMeasureInfo 对象 . 此对象将具有您要查找的相关统计信息的属性,在您的情况下为Average属性 . 它不是平均值的平均值,我看到的最常见的用法是计算某些内容,如Sum或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个文件传送到它,它找到了长度属性的平均值 . 现在,有时你想要计算多个东西,所以你可以使用多个参数,例如 -Sum-Maximum ,这些值也会被填充:

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

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

  • 1

    感谢@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'
        }
    }
    

相关问题