![Powershell-获取磁盘 IO 性能计数器](https://linux22.com/image/803246/Powershell-%E8%8E%B7%E5%8F%96%E7%A3%81%E7%9B%98%20IO%20%E6%80%A7%E8%83%BD%E8%AE%A1%E6%95%B0%E5%99%A8.png)
我对 Powershell 还很陌生。我需要在特定进程运行时获取系统的页面错误和磁盘 IO。我可以获取页面错误,但无法获取磁盘 IO。你们能帮帮我吗?以下是我的代码:
$arrayDIO = @()
$arrayPf = @()
$cmdProcess = start-process cmd -passthru
while (-not $cmdProcess.HasExited) {
$arrayDIO += %{ (Get-WmiObject Win32_PerfFormattedData_PerfProc_Process).IOWriteOperationsPerSec }
$arrayPf += %{ (Get-WmiObject Win32_PerfFormattedData_PerfOS_memory).PageFaultsPerSec }
sleep 2
}
$arrayPf | Measure-Object -Average -Maximum -Minimum | Out-File -Filepath C:\Details.txt
$arrayDIO | Measure-Object -Average -Maximum -Minimum | Out-File -Filepath C:\Details.txt -append
答案1
您正在获取一个性能计数器,该计数器返回每个单独进程的进程数据,以及合并到一个计数器 (_Total) 中的所有进程。您需要按进程名称进行过滤以获取该特定进程的性能数据。
您没有数据的原因是该Get-WMIObject
命令返回一个 ManagementBaseObject 对象数组,每个对象都包含属性IOWriteOperationsPersec
,但数组本身不包含该属性。您最终会得到一个空$arrayDIO
数组,因此没有 的性能数据Measure-Object
。
请参阅示例第 5 行的更新代码:
$arrayDIO += % { (Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | Where-Object { $_.Name -eq "_Total"}).IOWriteOperationsPersec }
您可以用您想要获取计数器数据的实际进程名称替换我所放置的位置"_Total"
,或者保持原样以检索所有进程的总数。
编辑:
为了使物理磁盘写入工作,您需要使用不同的性能计数器(http://msdn.microsoft.com/en-us/library/windows/desktop/aa394308(v=vs.85).aspx)。
尝试一下:
$arrayDIO += % { (Get-WmiObject Win32_PerfRawData_PerfDisk_PhysicalDisk | Where-Object { $_.Name -like "0*"}).DiskWriteBytesPersec /1024 }
/1024
将计数器从字节转换为 MB 并"0*"
选择磁盘 ID。如果您有多个磁盘,则需要将其更改为正确的磁盘 ID。