C#でパフォーマンスカウンタを使ってみた

chakemiです。

本日は、パフォーマンスカウンタからCPU使用率やメモリ空き容量などを取得してみました。

開発環境

  • WindowsXP SP3
  • VisualC#2010Express

PerformanceCounterとは、「コントロールパネル」の「管理ツール」にある「パフォーマンス」というシステムの状態を折れ線グラフで表示してくれるアプリケーションの値を.NETから参照できるクラスです。 では、さっそく。

PerformanceCounterクラスを使用するために、System.Diagnostics名前空間を追加します。

1
using System.Diagnostics;

パフォーマンスカウンタは、多くの情報を管理していて、情報ごとに「Category」「Counter」「Instance」と階層構造に情報が分類されています。

「パフォーマンス」アプリケーションのカウンタの追加から選択出来るパフォーマンス オブジェクトを参考に必要なカテゴリなど調べてください。 今回は、CPU使用率、空きメモリ容量、ネットワーク送受信量を1秒間隔で表示してみたいと思います。

まず、必要なカテゴリ名を指定します。

1
2
3
string catCpu = "Processor";
string catMem = "Memory";
string catNW = "Network Interface";

次に、インスタンス名を指定します。

1
2
3
string countCpu = "% Processor Time";
string countMem = "Available MBytes";
string countNW = "Bytes Total/sec";

インスタンス名が必要なカウンタは指定します。 ネットワークデバイスはipconfigなどで調べて環境にあわせてください。

1
2
string instanceCpu = "_Total";
string instanceNW = "Marvell Yukon 88E8055 PCI-E Gigabit Ethernet Controller";

PerformanceCounterオブジェクトを生成します。

1
2
3
pcCpu = new PerformanceCounter(catCpu, countCpu, instanceCpu);
pcMem = new PerformanceCounter(catMem, countMem);
pcNW = new PerformanceCounter(catNW, countNW, instanceNW);

あとは、NextValueメソッドを使用して、現在の計算値を一秒間隔で表示します。

こんな感じ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

namespace testPerformanceCounter
{
    public partial class Form1 : Form
    {
        private PerformanceCounter pcCpu;
        private PerformanceCounter pcMem;
        private PerformanceCounter pcNW;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //カテゴリ名
            string catCpu = "Processor";
            string catMem = "Memory";
            string catNW = "Network Interface";

            //カウンタ名
            string countCpu = "% Processor Time";
            string countMem = "Available MBytes";
            string countNW = "Bytes Total/sec";

            //インスタンス名
            string instanceCpu = "_Total";

            string instanceNW = "Marvell Yukon 88E8055 PCI-E Gigabit Ethernet Controller";

            //PerformanceCounterオブジェクト生成
            pcCpu = new PerformanceCounter(catCpu, countCpu, instanceCpu);
            pcMem = new PerformanceCounter(catMem, countMem);
            pcNW = new PerformanceCounter(catNW, countNW, instanceNW);

            timer1.Tick += new EventHandler(timer1_Tick);
            timer1.Interval = 1000;
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = pcCpu.NextValue().ToString() + "%";
            label2.Text = pcMem.NextValue().ToString() + "MBytes";
            label3.Text = pcNW.NextValue().ToString() + "Byte Total/sec";
        }

    }
}

カスタムカウンタの作り方や、カテゴリの一覧取得などは時間があったら書きたいと思います。

Comments