2016-07-24 63 views
2

我希望能夠每5秒鐘向最高CPU使用者輸出日誌文件。這樣我就可以在我的測試中看到誰使用了最多的CPU。連續監測前X個進程的CPU使用率%

我發現這個答案很常見:

$cpu = Get-Counter -ComputerName localhost "\Process(*)\% Processor Time" ` 
    | Select-Object -ExpandProperty countersamples ` 
    | where {$_.InstanceName -ne 'idle' } ` 
    | where {$_.InstanceName -ne '_total' }` 
    | Select-Object -Property instancename, cookedvalue ` 
    | Sort-Object -Property cookedvalue -Descending ` 
    | Select-Object -First 5 ` 
    | ft @{L='Date';E={Get-Date}}, InstanceName, @{L='CPU';E={(($_.Cookedvalue/100)/$NumberOfLogicalProcessors).toString('P')}} -HideTableHeaders ` 
    | Format-Table -Auto | Out-String 

我有2個問題吧:

  1. 有時候我:

    獲取計數器,在數據性能計數器樣本之一無效。查看每個PerformanceCounterSample對象的Status屬性以確保它包含有效數據。

  2. 我想獲得全過程的名稱,而不是

    java  25% 
    idea64 0.8% 
    ...

回答

2

我會嘗試在一次與下面的腳本來回答你的兩個問題:

Get-Counter "\Process(*)\% Processor Time" -ErrorAction SilentlyContinue ` 
    | select -ExpandProperty CounterSamples ` 
    | where {$_.Status -eq 0 -and $_.instancename -notin "_total", "idle"} ` 
    | sort CookedValue -Descending ` 
    | select TimeStamp, 
    @{N="Name";E={ 
     $friendlyName = $_.InstanceName 
     try { 
      $procId = [System.Diagnostics.Process]::GetProcessesByName($_.InstanceName)[0].Id 
      $proc = Get-WmiObject -Query "SELECT ProcessId, ExecutablePath FROM Win32_Process WHERE ProcessId=$procId" 
      $procPath = ($proc | where { $_.ExecutablePath } | select -First 1).ExecutablePath 
      $friendlyName = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($procPath).FileDescription 
     } catch { } 
     $friendlyName 
    }}, 
    @{N="CPU";E={($_.CookedValue/100/$env:NUMBER_OF_PROCESSORS).ToString("P")}} -First 5 ` 
| ft -a -HideTableHeaders 

這將導致如下表:

24.07.2016 21:00:53 Microsoft Edge Content Process 9,68% 
24.07.2016 21:00:53 system       0,77% 
24.07.2016 21:00:53 Microsoft Edge     0,39% 
24.07.2016 21:00:53 runtimebroker      0,39% 
24.07.2016 21:00:53 Host Process for Windows Services 0,39% 
  1. 按照規定,你有時會:

獲取計數器,在性能計數器樣本的一個數據是 無效。查看每個PerformanceCounterSample對象的狀態屬性,以確保其中包含有效數據。

這與Windows環境下的進程管理有關。在執行查詢時,可能會出現一些進程,其中一些可能會消失(即負責執行wmi查詢的wmiprvse進程)。某些進程可能需要更多的權限。這在獲得過程信息時會導致錯誤。它可以安全地跳過使用-ErrorAction SilentlyContinue開關並用Status -eq 0表達式進行過濾。

  1. 您還希望看到更友好的進程名稱。我不知道使用GetVersionInfo方法是否有更好的方法來獲取該名稱。如果這樣的信息可用FileDescription屬性商店的價值。如果它不可用,則使用不友好的進程名稱。
+0

在你的回答中發現'-ErrorAction SilentlyContinue'爲我節省了很多挫折。我希望它被記錄在[Get-Counter Microsoft Documentation](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.diagnostics/get-counter?view = powershell-6) –

1

所得到的輸出是這樣的

Name     CPU CPUPercent Description    
----     --- ---------- -----------    
chrome   10.4988673  8.79 Google Chrome   
powershell_ise 6.5364419  7.16 Windows PowerShell ISE 
chrome   38.0174437  4.88 Google Chrome   
chrome   26.2549683  4.87 Google Chrome   
chrome   16.9417086  3.16 Google Chrome   
cavwp   10.2648658  2.67 COMODO Internet Security 
chrome   13.1820845  2.44 Google Chrome   
chrome   675.016327  2.02 Google Chrome   
7.9.7_42331 1037.1570484  1.51 BitTorrent    
chrome   340.8777851  1.02 Google Chrome                 

隨着

$CPUPercent = @{ 
    Name = 'CPUPercent' 
    Expression = { 
    $TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds 
    [Math]::Round(($_.CPU * 100/$TotalSec), 2) 
    } 
} 
Get-Process -ComputerName $env:computername | 
Select-Object -Property Name, CPU, $CPUPercent, Description | 
Sort-Object -Property CPUPercent -Descending | 
Select-Object -First 10 |format-table -autosize | out-file c:\pro.log 

信用:http://powershell.com/cs/blogs/tips/archive/2013/04/16/documenting-cpu-load-for-running-processes.aspx

獲取進程-ComputerName $ ENV:計算機爲遠程計算機,你可以在CSV

 Import-CSV c:\"computers.csv" | % { 
    $Server = $_.ServerName 
    $alivetest = Test-Path "\\$Server\c$\" 
    If ($alivetest -eq "True") 
    {Get-Process -ComputerName $server | 
Select-Object -Property Name, CPU, $CPUPercent, Description | 
Sort-Object -Property CPUPercent -Descending | 
Select-Object -First 10 |format-table -autosize | out-file c:\pro.log} 
}}