2014-05-09 78 views
0

上下文:
我想運行一個測試,並在運行時收集CPU利用率。基本上,當我開始測試時,我也想開始收集CPU利用率的數據,在測試結束時,我也想停止收集CPU利用率的數據(以及之後的平均值)。
在Win7的在PowerShell中獲取測試執行的平均CPU利用率

方法使用PowerShell 3:
在測試開始時我還說,啓動一個後臺作業的功能。後臺作業執行腳本塊,該腳本運行'while($ true)'循環,收集平均CPU使用率並將其保存到文件中。在測試結束時,我讀取文件,對收集到的數據進行平均,並停止並刪除作業。

問題:
對於目前的做法,該腳本塊並不總是得到執行,並沒有新的數據被收集。如果我多次運行測試,scriptblock會被執行(在其中一個運行中) - 我無法想到任何與此相關或相關的行爲。如果我在測試中的任何地方使用斷點,scriptblock也會被執行。
想不到另一種方法。

想要的答案:
1.爲什麼不執行腳本塊?以及如何讓它執行?
2.在測試過程中是否有另一種方法來收集資源數據?

請注意,代碼已經通過各種嘗試和失敗運行,不再'漂亮'。
代碼:

function Start-ResourceMonitor 
{ 
    param() 
    [email protected]() 
    $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 
} 
+0

我擔心'Job'已被添加,但執行尚未開始(即'State'沒有變成'Running')。當你創建一個'Job'時,你放棄處理'Scriptblock'的調度。由於您正在等待'Job'開始執行,您是不是可以這樣做,因爲'Start-ResourceMonitor'中的最後一行是在一個循環中休眠,直到'Job'的'State'變爲'Running '? –

+0

@ robert.westerlund我試過了你的建議,但得到了同樣的結果。爲了調試目的(僅限本地版本),我在停止它之前輸出作業狀態,在Stop-ResourceMonitor中 - 在我所有的運行狀態中,狀態一直在運行。 – Mircea

+0

是的,但是'Job'可能在你停止之前開始運行,也就是在你完成實際測試之後。如果在執行實際測試之前輸出工作狀態,我猜測它不處於'運行'狀態。再一次,我只是在猜測,因爲我不確定你是如何確定「scriptblock並不總是被執行的」。 –

回答

0

根本的問題是,測試運行之間的任何地方2到60秒,而且在那裏運行,其中Get-WmiObject可以花費比試運行的時間更長,因此,對於這些運行,沒有執行使用收集的度量標準創建文件的代碼。
在作業開始後(等待和休眠)添加一個等待循環,以便作業實際開始運行,並且創建的文件解決了問題。
該問題的代碼也已更新爲解決方案。