Powershell 进程 CPU 检查
Powershell Process CPU checking
有以下工作正常,但在 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 中看到过一些其他代码,它们采用平均值但几乎看起来像 "average of an average" - 这是毫无意义的。而且,这是整体 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 百分比,这似乎是 "point in time"。如何找到真正的 CPU 百分比?这就是我指出平均值的原因。我真的很想绕过其中的 "point in time" 部分。
重点是,当我们多次看到服务器上每个进程的高 CPU 时,我们登录到服务器并且高 CPU 已经消退。这并不是说,每次都是这样,但我们知道,有时 CPU 会飙升然后安静下来。
感谢您的任何见解!
第一个问题,您被困在一个时间点,因为当您执行脚本时,它会捕获当时和那里发生的事情的快照。您正在寻找的是历史数据,因此您可以计算出一段时间内进程的平均 CPU 使用情况,并查明阻碍您的 CPU 的进程。您是否有性能监视器来跟踪 CPU 各个进程的使用情况?如果您希望能够在事后获得您正在寻找的数字,您可能需要设置性能日志记录。
其次,我认为您误解了 Measure-Object
的工作原理。如果您在 cmdlet 上 运行 Get-Help
并检查输出,您将看到它输出一个 GenericMeasureInfo
对象。该对象将有一个 属性 用于您正在寻找的相关统计数据,在您的情况下是平均值 属性。它不是平均值的平均值,我看到它最常见的用法是计算一些东西,比如 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!该文件无疑歪曲了我的数字。通过该输出,我可以找到包含多个文件的文件夹,但一个文件占用了该文件夹 space 的一半以上,并发现异常情况......例如我保存到 C:\临时文件夹出于某种原因。看来我需要做一些文件维护。
多亏了@TheMadTechnician,我才得以解决这个问题。我有一个错误的组件
$_.Average
我在哪里
$_.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'
}
}
有以下工作正常,但在 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 中看到过一些其他代码,它们采用平均值但几乎看起来像 "average of an average" - 这是毫无意义的。而且,这是整体 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 百分比,这似乎是 "point in time"。如何找到真正的 CPU 百分比?这就是我指出平均值的原因。我真的很想绕过其中的 "point in time" 部分。
重点是,当我们多次看到服务器上每个进程的高 CPU 时,我们登录到服务器并且高 CPU 已经消退。这并不是说,每次都是这样,但我们知道,有时 CPU 会飙升然后安静下来。
感谢您的任何见解!
第一个问题,您被困在一个时间点,因为当您执行脚本时,它会捕获当时和那里发生的事情的快照。您正在寻找的是历史数据,因此您可以计算出一段时间内进程的平均 CPU 使用情况,并查明阻碍您的 CPU 的进程。您是否有性能监视器来跟踪 CPU 各个进程的使用情况?如果您希望能够在事后获得您正在寻找的数字,您可能需要设置性能日志记录。
其次,我认为您误解了 Measure-Object
的工作原理。如果您在 cmdlet 上 运行 Get-Help
并检查输出,您将看到它输出一个 GenericMeasureInfo
对象。该对象将有一个 属性 用于您正在寻找的相关统计数据,在您的情况下是平均值 属性。它不是平均值的平均值,我看到它最常见的用法是计算一些东西,比如 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!该文件无疑歪曲了我的数字。通过该输出,我可以找到包含多个文件的文件夹,但一个文件占用了该文件夹 space 的一半以上,并发现异常情况......例如我保存到 C:\临时文件夹出于某种原因。看来我需要做一些文件维护。
多亏了@TheMadTechnician,我才得以解决这个问题。我有一个错误的组件
$_.Average
我在哪里
$_.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'
}
}