🗿
[C#/WMI] WMIで、あるプロセスのCPU時間やメモリ使用量をとる
もくじ
やりたいこと
あるプロセスが消費しているCPU時間(カーネル時間/ユーザー時間)を取りたいときにPerformanceConter
クラスを使って取ろうとしていたが、PerformanceConter
クラスを使うと何か遅い気がする。
他の取り方がないか調べている中で、WMI
という方法があることを知った。
WMIでどうやってCPU時間等をとれるのか調べたい。
※この記事を書いてる途中に、以前似たことを書いたのを思い出した。
そっちの方がまとまってるので、そちらも参照↓
WMIについて
WMIとは「Windows Management Instrumentation」の略で、Windows OSを管理することを目的にMicrosoftが開発した技術。WMIを活用することで、Windowsシステムの状態を示す情報を取得できる、とのこと。
またWMIをコマンドラインから使うために、WMIC(Windows Management Instrumentation Command-line)というのがあるらしい。(今回はやらない)
C#からWMIを使う
C#からWMIを使うには、今回調べた限りでは、下記のようにすればよい。
- System.Management.dllを参照に追加する
- 下記のようなクラスを使用する
- ManagementScope
- ObjectQuery
- ManagementObjectSearcher
サンプルコード
using System;
using System.Management;//System.Management.dllを参照に追加
using System.Threading;
namespace ConsoleApp1
{
class Program
{
// Win32_PerfRawData_PerfProc_Process の仕様
// https://docs.microsoft.com/en-us/previous-versions/aa394323(v=vs.85)
// エントリーポイント
static void Main(string[] args)
{
ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\cimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_PerfRawData_PerfProc_Process");
//ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=\"12452\""); // Pidで対象を絞る場合
//ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_PerfRawData_PerfProc_Process Where Name=\"Idle\""); // パフォーマンスカウンタのインスタンス名で対象を絞る場合
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
while (true)
{
Console.Clear();
ManagementObjectCollection queryCollection = searcher.Get();
foreach (ManagementObject m in queryCollection)
{
// WMIオブジェクトのプロパティを取得して表示
Console.WriteLine("{0}, {1}, {2}, {3}, {4}", m["Name"], m["IDProcess"], m["PercentProcessorTime"], m["PrivateBytes"], (uint.Parse(m["IOWriteBytesPerSec"].ToString())));
}
Thread.Sleep(1000);
}
}
}
}
難点
CPU使用率はとれないが、CPU時間がとれる。そこからCPU使用率は計算できそう。
参考
Win32_PerfRawData_PerfProc_Processでなんの情報が取れるかは下記を参照。
WMIでいろいろできるツール??
WMI詳しい情報
cimvってなにか?
トータル(PC全体)のCPU使用率(CPU時間?)をとる
取れる情報の参考 ※公式がなぜかみあたらない。。
使えるクラスのリスト??
wbemtest(WMIをいろいろ実験できるツール)
Discussion