プロセスごとのCPUおよびメモリ使用量の追跡


163

私のアプリケーションの1つが、必要以上のCPUサイクルを消費していると思います。問題は-それは一気に発生し、タスクマネージャーを見るだけではすぐにしか表示されないので、助けにはなりません。

一部のプロセスのCPUとメモリの使用履歴を追跡する方法(Windows上)はありますか?たとえば、「firefox」の追跡を開始すると、1時間ほど後にそのCPUとメモリの使用状況のグラフが表示されます。

これを実現する既製のツールまたはプログラムによる方法を探しています。

回答:


167

入力するだけperfmonStart > RunしてEnterキーを押します。パフォーマンスウィンドウが開いたら、+記号をクリックして新しいカウンターをグラフに追加します。カウンターはPCの動作のさまざまな側面であり、類似性によって「パフォーマンスオブジェクト」と呼ばれるグループにグループ化されます。

質問には、「Process」、「Memory」、「Processor」のパフォーマンスオブジェクトを選択できます。次に、これらのカウンターをリアルタイムで確認できます

ユーティリティを指定して、後で検査のためにパフォーマンスデータを保存することもできます。これを行うには、左側のパネルで[パフォーマンスログとアラート]を選択します。(上記のカウンターを提供するシステムモニターコンソールのすぐ下にあります。そこにない場合は、[ファイル]> [スナップインの追加と削除]をクリックし、[追加]をクリックして、リストから[パフォーマンスログとアラート]を選択します。 "。)[パフォーマンスログとアラート]から、[カウンターログ]の下に新しい監視構成を作成します。カウンターを追加し、サンプリングレート、ログ形式(バイナリまたはプレーンテキスト)、およびログの場所を指定できます。


1
カウンターログでデータサンプルを取得するための理想的な間隔はどれくらいですか?
スティーブローズ

8
これを書いてから、MSは明らかにUIをPerformanceMonitorに変更しました。Windows 2008 R2でこれをどのように行うか考えていますか?
マーティンブラウン

5
@MartinBrown- これが見つかりまし。それは素晴らしいです。
JNF 2012年

2
誰もがビスタにログを保存する次の部分を行う方法を知っていますか?「パフォーマンスログとアラート」はどこにもないようです
Xitcod13

11
データコレクターセット->ユーザー定義を右クリックします。「新規」->「データコレクターセット」を選択します。名前を付け、[手動で作成]を選択します。Nextをクリックします。[パフォーマンスカウンター]を選択します。Nextをクリックします。パフォーマンスカウンターを追加し、サンプル間隔を入力します。次に、データコレクターセットの下で、セットを右クリックして[開始]をクリックします。しばらくしたら、セットを右クリックして[停止]をクリックします。次に、レポート->ユーザー定義->あなたのセットでレポートを見つけることができます。グラフを右クリックして、[名前を付けてデータを保存]を選択します。
Gremio

43

プロセスエクスプローラーは、プロセスごとの合計CPU時間と、プロセスごとの履歴グラフを表示できます。


3
したがって、それをどのように使用して、短いバーストでより多くのメモリまたはプロセッサ能力の使用をランダムに開始するプロセスを見つけますか?詳しく説明してもらえますか?
Xitcod13

列ヘッダーを右クリックして[列の選択]を選択し、[プロセスパフォーマンス]の下の[CPU履歴]を確認します
Laurent

ゼロにリセットできますか?
Simon_Weaver 2016

特定のPIDのメモリ消費量をファイルにログインできますか?
Royi

他のユーザーに指摘したいだけです。各プロセスのCPUグラフは、Process Explorerが開いていても、最初に開いた後でのみ記録を開始するため、このメソッドは、散発的なイベントをキャプチャして分離しようとする場合には実質的に役に立ちません。単一のプロセスに。グローバルシステムCPUグラフ(プロセスエクスプローラーを開くと記録が開始されます)をクリックして任意のポイントにマウスを置くと、そのポイントでCPUを最も多く使用したプロセスが表示されることを指摘します。
SUM1

19

perfmon.exeを使用して、 "Process"カウンターの下にある "Private Bytes"カウンターを使用してメモリ使用量を追跡しようとしましたが、うまく機能します。


1
これが正解です。[プロセス]でCPU情報を取得することもできます。[プロセス]をクリックし、選択したオブジェクトのインスタンスの下でアプリ(例ではFirefox)を選択します。
Chris McCowan

11

多分これを使うことができます。それはあなたのために働くはずであり、指定されたプロセスのプロセッサ時間を報告します。

@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.

7

同意します。perfmon.exeでは、監視するプロセスのカウンターを追加できます(右パネルを右クリックします)。

パフォーマンスオブジェクト:プロセス[リストからインスタンスを選択]をチェックし、firefoxを選択します。


1
ありがとう。1時間などの事前定義された時間のCPU使用量の履歴を確認するにはどうすればよいですか?
Eli Bendersky 2008

6

WMIはWindows Management Instrumentationであり、最近のすべてのバージョンのWindowsに組み込まれています。これにより、CPU使用率、ディスクI / O、メモリ使用量などをプログラムで追跡できます。

Perfmon.exeは、このインターフェイスのGUIフロントエンドであり、プロセスを監視し、ログに情報を書き込み、事後のログの分析を可能にします。それは世界で最もエレガントなプログラムではありませんが、仕事を成し遂げます。


5
技術的には、perfmonはWindowsパフォーマンスカウンターAPIへのインターフェイスであり、WMIよりも何年も前から存在しています。WMIは、その名前空間内でパフォーマンスカウンターAPIも公開します。
Rob Walker、

2

プロセスラッソは、グラフではなく、プロセスの自動化と優先度クラスの最適化のために設計されています。とはいえ、プロセスごとのCPU使用率の履歴提供されますが(グラフ上に白い線で描かれます)、そうではありません。プロセスごとのメモリ使用率の履歴を提供します。

免責事項:私はProcess Lassoの作成者ですが、より良い解決策があるため(perfmonが最適です)、実際にここでは承認しません。

これまでで最高のものは、Windows Vista +リソースおよびパフォーマンスモニターです。プロセスによるCPU、メモリ、ネットワーク、およびディスクアクセスの使用状況を経時的に追跡できます。それはずっと前に作成されるべきだった優れた全体的なシステム情報ユーティリティです。私が間違っているのでない限り、それは、プロセスごとのCPUとメモリの使用率を(リストされている他のものとともに)経時的に追跡できます。


2

また、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クエリをサポートするすべてのプログラミング言語に適用されます


WMIとPowershell?
PreguntonCojoneroCabrón

2

私はこれを試していませんが、ProcDumpはより良い解決策のようです。

サイトからの説明:

ProcDumpは、アプリケーションのCPUスパイクを監視し、スパイク中にクラッシュダンプを生成することを主な目的とするコマンドラインユーティリティであり、管理者または開発者がスパイクの原因を特定するために使用できます。ProcDumpには、ウィンドウハングの監視(ウィンドウとタスクマネージャーが使用するウィンドウハングと同じ定義を使用)、未処理の例外監視も含まれており、システムパフォーマンスカウンターの値に基づいてダンプを生成できます。また、他のスクリプトに埋め込むことができる一般的なプロセスダンプユーティリティとしても機能します。





1

Windows 10では、タスクマネージャーに累積CPU時間を表示できます。「アプリの履歴」タブと「使用履歴の削除」に進んでください。次に、1〜2時間実行しておきます。

Windows 10の累積CPU時間

これが行わないことは、ブラウザでの使用をタブごとに分解することです。頻繁に非アクティブなタブは膨大な量の作業を行い、開いている各タブはエネルギーを使用し、PCの速度を低下させます。


1

一部の特定の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
  }

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.