2014年3月30日日曜日

技術調査:システム全体のCPU使用率を取得する

System.Diagnostics.PerformanceCounter クラス を使用する。


  • PerformanceCounter コントロールの CategoryName プロパティに「Processor」を設定
  • CounterName プロパティに「% Processor Time」を設定
  • InstanceName プロパティに「_Total」を設定


NextValue メソッドを使用して CPU 使用率を取得

参考文献

パフォーマンス情報を取得する方法について ~ CPU 使用率の取得 ~
http://msdn.microsoft.com/ja-jp/library/cc720837

2014年3月29日土曜日

実験:CPU使用率の取得

CPU使用率取得のため、以下のコードを作成しました。

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;

namespace cpu_ctrl
{
    public partial class MainForm : Form
    {
        private bool isLoop_cpuCtrl = true;         // CPU のコントロールループを継続するかどうか


        private int timeSpan_cpuCtrl = 100;         // CPU のコントロールループの実施間隔

        public MainForm()
        {
            InitializeComponent();
        }

        delegate void Del_setCPUUsage(float cpuUsage);

        private void backgroundWorker_CPUCtrl_DoWork(object sender, DoWorkEventArgs e)
        {
            // CPU 使用率のチェック用
            System.Diagnostics.PerformanceCounter pc_cpu = 
                new System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", "_Total");

            // CPU 使用率を設定するためのデリゲート
            Del_setCPUUsage del_setCPUUsage = cpuUsage => { label_cpu.Text = cpuUsage.ToString("0.0") + " %"; };


            while (isLoop_cpuCtrl)
            {
                float cpuUsage = pc_cpu.NextValue();
                label_cpu.Invoke(del_setCPUUsage, new object[] { cpuUsage });


                System.Threading.Thread.Sleep(timeSpan_cpuCtrl);
            }
        }

        private void ToolStripMenuItem_Exit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            // CPU コントロールスレッドを起動
            backgroundWorker_CPUCtrl.RunWorkerAsync();
        }

        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            // CPU コントロールループを終了する
            isLoop_cpuCtrl = false;
        }
    }
}


また、CPU使用率計測のため、起動すると1スレッドが無限ループを実施し、CPUリソースを消費する以下のプログラムも作成しました。(process-dummy)

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;

namespace process_dummy
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private bool isLoop = true;

        private void backgroundWorker_dummy_DoWork(object sender, DoWorkEventArgs e)
        {
            while (isLoop) ;
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            backgroundWorker_dummy.RunWorkerAsync();
        }

        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            isLoop = false;
        }
    }
}


この実験結果を以下の動画にまとめました。

実験:CPU使用率の取得

(細かい文字を見るには、解像度を480p以上に設定してください。)


実験に使用したPCは論理プロセッサが8個あります。
process-dummyを1個起動するごとに、PCのCPU使用率の 1/8 を消費します。

process-dummy を 8個起動することで、PCのCPU使用率が 100% になりました。


実験は成功です。


2014年3月28日金曜日

詳細仕様書(Ver1.0)

この仕様書は「CPU使用率コントローラー」Ver1.0にて実装する機能の詳細な範囲を定義する。

プログラム構成

  • cpu-ctrl.exe : メインプログラム


状態遷移と処理

メインプログラムを起動することで、メイン画面の状態遷移と操作中ウィンドウ快適化制御の状態遷移が開始される。それぞれは別スレッドとする。


メイン画面の状態遷移

メイン画面はユーザの操作により状態が遷移する。

ヘルプを表示、ご意見・ご感想・不具合表示はブラウザで目的のページを開き、すぐさま操作待機状態に戻る。
バージョン情報表示は、バージョン情報ダイアログが閉じられないと、メインウィンドウを操作できない。


操作中ウィンドウ快適化制御の状態遷移

操作中ウィンドウ快適化制御の状態遷移では、CPUの使用率制御の必要性有無により状態を遷移させる。

メインウィンドウが閉じられたことに連動して、待機状態・制御状態のいずれの状態からでも処理を終了することができるが、制御状態ではプロセスの一時停止を指示している状態であるから、終了する前にプロセスを再開することを忘れてはならない。



仕様書(Ver1.0)

この仕様書は「CPU使用率コントローラー」Ver1.0にて実装する機能の範囲を定義する。

このバージョンで実現を目指すもの

CPU使用率コントローラーの基礎的な機能のみ実装する。
従って、オプションとしてよい機能は次のVer以降に実装を検討する。


操作中ウィンドウの操作快適性の向上

現在アクティブになっているウィンドウのプロセスが限界までCPUを使用できるように、他のプロセスのCPU使用率を抑制する。(操作中ウィンドウ快適化制御)

全てのプロセスのCPU使用率の合計が100%を超えない限り、CPU使用率制御は実施しない。

本プログラムは一定間隔でコンピュータ内で実行されているプロセスの全情報を取得し、アクティブウィンドウのプロセスの特定とCPU使用率抑制制御の実施要否を判定する。

CPU使用率抑制制御の必要が生じた場合、本仕様書で定めるCPU使用率抑制制御方式に基づき、CPU使用率抑制制御を実施する。


CPU使用率抑制制御

CPU使用率抑制制御方式は、CPU使用率を抑制するプロセスに対して、一時停止と再開を短期間に繰り返す方式(プロセス一時停止/再開短期間制御方式)とする。

本バージョンにおいて、プロセス一時停止/再開短期間制御方式に使用するパラメータは全てプログラム内で決定した値とする。

CPU使用率を抑制するプロセスは、CPU使用率が一定の閾値(CPU使用率制限値)を超えたものに対して実施する。CPU使用率制限値を超えたプロセスのCPU使用率がCPU使用率制限値未満となるように制御する。CPU使用率が一定の閾値未満の場合、抑制対象外とする。


CPU使用率制限値は可変とする。

CPU使用率制限値の決定方法は次の方法とする。
1.CPU使用率抑制が開始された時点での、アクティブではないウィンドウのプロセスのCPU使用率の最大値にある減価定数をかけたものを初期値とする。
2.CPU使用率抑制制御を行った結果、システム全体のCPU使用率が100%の場合、CPU使用率制限値を減少させる。
3.CPU使用率抑制制御を行った結果、システム全体のCPU使用率が100%未満の場合、CPU使用率制限値を増加させる。


操作方法

本プログラムを起動すると、自動的に操作中ウィンドウ快適化制御が開始される。
本プログラムを起動すると、メインウィンドウが表示される。

メインウィンドウで可能な操作、表示する情報は以下の内容である。

可能な操作


  • 本プログラムを終了する。

  • ヘルプを表示する。(Bloggerで記載したヘルプ画面へ移動)
  • バージョン情報を表示する。(本ソフトウェアの開発Blogへのリンクを示し、リンクをクリックすることでブラウザを起動し、本ソフトウェアの開発Blogへ移動する。)
  • ご意見・ご感想・不具合報告。(Bloggerで記載した投稿画面へ移動)



  • ウィンドウの最小化
  • ウィンドウの最大化


表示する情報


  • プロセス一時停止/再開短期間制御を行っているかどうかを表示
  • プロセス一時停止/再開短期間制御を行っているプロセス名・id を表示
  • 全体のCPU使用率


メインウィンドウ画面構成

メインウィンドウの画面構成は、統合開発環境により作成する。

留意点


  • 他のソフトウェアの操作に邪魔にならないよう、可能な限り小さくする。
  • 画面サイズは可変とし、画面サイズを表示することで表示する情報量を調整できる。



デバッグ支援機能

ログ出力

ソフトウェア起動時のコマンドラインに以下のパラメータを指定することでログ出力を行うように指示できる。
ログは、ソフトウェアのカレントディレクトリに保存する。
ログは追記モードで書き込む。
ソフトウェア起動時にログファイルが存在した場合、ログを初期化するためにそのログファイルは削除する。

コマンドラインオプション:

-log:normal

基本的なログ出力を行う。

-log:detail

詳細なログ出力を行う。
 -log:normalの内容を完全に包括する。


ログファイル名:log.log

現在のログモードがわかるよう、メインウィンドウのタイトルにコマンドラインオプションを表示する。

障害解析支援機能

エラー発生時には、ダイアログにてユーザにエラー情報を通知する。

また、発生した障害情報をエラーログファイルに書き込む。
エラーログは、ソフトウェアのカレントディレクトリに保存する。
上書き方式で書き込む。

エラーログファイル名:err.log




技術調査:プロセスのCPU使用率を制御する

直接的にプロセスのCPU使用率の上限を設定する方法は現時点では無いはずです。
従って、Windows上のアプリケーションとしては、以下の方法でプロセスが使用するCPU使用率を制限する必要があります。

1.プロセスの一時停止/再開を繰り返し、目標とするCPU使用率の上限を超えないように制御する

2.プロセスを構成するスレッドの一時停止/再開を繰り返し、目標とするCPU使用率の上限を超えないように制御する


関連記事
同じラベルをすべて含む記事を読み込み中...