获取PowerShell中测试执行的平均CPU利用率

时间:2014-05-09 08:01:40

标签: powershell cpu-usage powershell-v3.0 scriptblock

上下文
我想运行一个测试,并在运行时收集CPU利用率。基本上,当我开始测试时,我也想开始收集CPU利用率的数据,在测试结束时我还想停止收集CPU利用率的数据(并在之后平均)。
在Win7上使用PowerShell 3

方法
在测试开始时,我添加了一个启动后台作业的函数。后台作业执行一个脚本块,该脚本块运行'while($ true)'循环,该循环收集平均CPU利用率并将其保存到文件中。在测试结束时,我读取文件,平均收集的数据并停止并删除作业。

问题:
对于当前方法,脚本块并不总是被执行,并且不会收集新数据。如果我多次运行测试,脚本块将被执行(在其中一个运行中) - 我无法想到任何相关的或这种行为。如果我在测试中的任何地方使用断点,脚本块也会被执行 想不出另一种方法。

所需答案:
1.为什么不执行脚本块?以及如何让它执行?
2.在测试期间是否有另一种收集资源数据的方法?

请注意,代码已经过各种尝试和失败运行,并且不再“漂亮” 的代码:

function Start-ResourceMonitor
{
    param()
    $avg=@()
    $timestamp = Get-Date -Format o | foreach {$_ -replace ":", "."}
    $compName=$env:COMPUTERNAME
    $myFilePath = Join-Path -path $env:TEMP -childpath .\temp_$timestamp.txt
    $scriptBlock = {
        $avgSB = $args[0]
        $timestampSB = $args[1]
        while ($true) {
            $avgSB += Get-WmiObject win32_processor -computername $args[2] | Measure-Object -property LoadPercentage -Average | Foreach {$_.Average}            
            $avgSB | Out-File -FilePath $args[3] -Force
            start-sleep -Milliseconds 500 
        }
    }
    $res = start-job -RunAs32 -Name 'MyJob' -ScriptBlock $scriptBlock -ArgumentList @($avg,$timestamp,$compName,$myFilePath)
    while (($res.State -ne 'Running') -or (-not (Test-Path $myFilePath))){
        start-sleep -Milliseconds 500
    }
}

[other test functions]

function Stop-ResourceMonitor
{
    param()
    Stop-Job -Name MyJob
    $testFN = Get-ChildItem -Path $env:TEMP -Filter "temp*.txt" | sort LastWriteTime -Descending | select -First 1
    $global:CPU_Average = get-content -path $testFN.FullName
    $global:CPU_Average | Measure-Object -Average | select -ExpandProperty Average | Write-Host
    Remove-Job -Name MyJob
}

1 个答案:

答案 0 :(得分:0)

潜在的问题是测试运行的时间在2到60秒之间,而且运行中Get-WmiObject的运行时间比测试运行的时间长,因此使用收集的指标创建文件的代码不存在为那些跑步而执行。
在启动作业后添加等待循环(暂停和休眠)以使作业实际开始运行并创建要创建的文件解决了问题。
该问题的代码也已使用解决方案进行了更新。