私のアプリケーションの1つが、必要以上のCPUサイクルを消費していると思います。問題は-それは一気に発生し、タスクマネージャーを見るだけではすぐにしか表示されないので、助けにはなりません。
一部のプロセスのCPUとメモリの使用履歴を追跡する方法(Windows上)はありますか?たとえば、「firefox」の追跡を開始すると、1時間ほど後にそのCPUとメモリの使用状況のグラフが表示されます。
これを実現する既製のツールまたはプログラムによる方法を探しています。
私のアプリケーションの1つが、必要以上のCPUサイクルを消費していると思います。問題は-それは一気に発生し、タスクマネージャーを見るだけではすぐにしか表示されないので、助けにはなりません。
一部のプロセスのCPUとメモリの使用履歴を追跡する方法(Windows上)はありますか?たとえば、「firefox」の追跡を開始すると、1時間ほど後にそのCPUとメモリの使用状況のグラフが表示されます。
これを実現する既製のツールまたはプログラムによる方法を探しています。
回答:
入力するだけperfmon
にStart > Run
してEnterキーを押します。パフォーマンスウィンドウが開いたら、+記号をクリックして新しいカウンターをグラフに追加します。カウンターはPCの動作のさまざまな側面であり、類似性によって「パフォーマンスオブジェクト」と呼ばれるグループにグループ化されます。
質問には、「Process」、「Memory」、「Processor」のパフォーマンスオブジェクトを選択できます。次に、これらのカウンターをリアルタイムで確認できます
ユーティリティを指定して、後で検査のためにパフォーマンスデータを保存することもできます。これを行うには、左側のパネルで[パフォーマンスログとアラート]を選択します。(上記のカウンターを提供するシステムモニターコンソールのすぐ下にあります。そこにない場合は、[ファイル]> [スナップインの追加と削除]をクリックし、[追加]をクリックして、リストから[パフォーマンスログとアラート]を選択します。 "。)[パフォーマンスログとアラート]から、[カウンターログ]の下に新しい監視構成を作成します。カウンターを追加し、サンプリングレート、ログ形式(バイナリまたはプレーンテキスト)、およびログの場所を指定できます。
プロセスエクスプローラーは、プロセスごとの合計CPU時間と、プロセスごとの履歴グラフを表示できます。
perfmon.exeを使用して、 "Process"カウンターの下にある "Private Bytes"カウンターを使用してメモリ使用量を追跡しようとしましたが、うまく機能します。
多分これを使うことができます。それはあなたのために働くはずであり、指定されたプロセスのプロセッサ時間を報告します。
@echo off
: Rich Kreider <rjk@techish.net>
: report processor time for given process until process exits (could be expanded to use a PID to be more
: precise)
: Depends: typeperf
: Usage: foo.cmd <processname>
set process=%~1
echo Press CTRL-C To Stop...
:begin
for /f "tokens=2 delims=," %%c in ('typeperf "\Process(%process%)\%% Processor Time" -si 1 -sc 1 ^| find /V "\\"') do (
if %%~c==-1 (
goto :end
) else (
echo %%~c%%
goto begin
)
)
:end
echo Process seems to have terminated.
同意します。perfmon.exeでは、監視するプロセスのカウンターを追加できます(右パネルを右クリックします)。
パフォーマンスオブジェクト:プロセス[リストからインスタンスを選択]をチェックし、firefoxを選択します。
WMIはWindows Management Instrumentationであり、最近のすべてのバージョンのWindowsに組み込まれています。これにより、CPU使用率、ディスクI / O、メモリ使用量などをプログラムで追跡できます。
Perfmon.exeは、このインターフェイスのGUIフロントエンドであり、プロセスを監視し、ログに情報を書き込み、事後のログの分析を可能にします。それは世界で最もエレガントなプログラムではありませんが、仕事を成し遂げます。
プロセスラッソは、グラフではなく、プロセスの自動化と優先度クラスの最適化のために設計されています。とはいえ、プロセスごとのCPU使用率の履歴は提供されますが(グラフ上に白い線で描かれます)、そうではありません。プロセスごとのメモリ使用率の履歴を提供します。
免責事項:私はProcess Lassoの作成者ですが、より良い解決策があるため(perfmonが最適です)、実際にここでは承認しません。
これまでで最高のものは、Windows Vista +リソースおよびパフォーマンスモニターです。プロセスによるCPU、メモリ、ネットワーク、およびディスクアクセスの使用状況を経時的に追跡できます。それはずっと前に作成されるべきだった優れた全体的なシステム情報ユーティリティです。私が間違っているのでない限り、それは、プロセスごとのCPUとメモリの使用率を(リストされている他のものとともに)経時的に追跡できます。
また、C#/ Perl / Javaスクリプトを使用して、WMIコマンドを使用して使用率データを取得することもできます。以下にその手順を示します。
2つのWMI選択クエリを実行し、CPU使用率の数式を適用する必要があります
1.論理プロセスの総数を取得する
select NumberOfLogicalProcessors from Win32_ComputerSystem
2. PercentProcessorTime、TimeStamp_Sys100NS(CPU使用率の数式が適用され、実際の使用率が取得されます)の値を取得するには、WorkingSetPrivate(RAM)を2回以上使用し、スリープ間隔は1秒です。
select * from Win32_PerfRawData_PerfProc_Process where IDProcess=1234
3. CPU使用率の数式を適用する
CPU%= ((p2-p1)/(t2-t1)*100)/NumberOfLogicalProcessors
p2は2回目に取得されたPercentProcessorTimeを示し、p1は初めて取得されたPercentProcessorTimeを示し、t2およびt1はTimeStamp_Sys100NSに対するものです。
このためのサンプルPerlコードは、リンクhttp://www.craftedforeveryone.com/cpu-and-ram-utilization-of-an-application-using-perl-via-wmi/にあります。
このロジックは、WMIクエリをサポートするすべてのプログラミング言語に適用されます
私はこれを試していませんが、ProcDumpはより良い解決策のようです。
サイトからの説明:
ProcDumpは、アプリケーションのCPUスパイクを監視し、スパイク中にクラッシュダンプを生成することを主な目的とするコマンドラインユーティリティであり、管理者または開発者がスパイクの原因を特定するために使用できます。ProcDumpには、ウィンドウハングの監視(ウィンドウとタスクマネージャーが使用するウィンドウハングと同じ定義を使用)、未処理の例外監視も含まれており、システムパフォーマンスカウンターの値に基づいてダンプを生成できます。また、他のスクリプトに埋め込むことができる一般的なプロセスダンプユーティリティとしても機能します。
うーん、グラフはあまり便利ではありませんが、Process Explorerでそれができると思います。それを行うための代替/より良い方法をまだ探しています。
Process Lassoをご覧になることをお勧めします。
一部の特定のWindowsサーバーのステータスとCPU /メモリ使用量を取得する必要がありました。以下のスクリプトを使用しました:
これはWindows Search Serviceの例です。
$cpu = Get-WmiObject win32_processor
$search = get-service "WSearch"
if ($search.Status -eq 'Running')
{
$searchmem = Get-WmiObject Win32_Service -Filter "Name = 'WSearch'"
$searchid = $searchmem.ProcessID
$searchcpu1 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
Start-Sleep -Seconds 1
$searchcpu2 = Get-WmiObject Win32_PerfRawData_PerfProc_Process | Where {$_.IDProcess -eq $searchid}
$searchp2p1 = $searchcpu2.PercentProcessorTime - $searchcpu1.PercentProcessorTime
$searcht2t1 = $searchcpu2.Timestamp_Sys100NS - $searchcpu1.Timestamp_Sys100NS
$searchcpu = [Math]::Round(($searchp2p1 / $searcht2t1 * 100) /$cpu.NumberOfLogicalProcessors, 1)
$searchmem = [Math]::Round($searchcpu1.WorkingSetPrivate / 1mb,1)
Write-Host 'Service is' $search.Status', Memory consumed: '$searchmem' MB, CPU Usage: '$searchcpu' %'
}
else
{
Write-Host Service is $search.Status -BackgroundColor Red
}
CPU / RAM / IO速度の履歴グラフにはtaskinfoを使用します。 http://www.iarsn.com/taskinfo.html
しかし、無反応のバーストは、誤ったHD / SSドライブによる割り込み時間のように聞こえます。