ホーム 主筆 その他ソフト その他情報 Syuhitu.org English

Windows関連

スクリーンセーバー作成法

半透明ウインドウの性能

bootfont.bin

キャビネット形式

ウインドウスタイルをいじる

Java製ソフトをServiceに登録する

イベントログにメッセージを出力する

コントロールパネルにアイコンを追加する

スクリプトによる拡張1

スクリプトによる拡張2

ガジェットの作成

大容量メモリ

メモリ搭載量の下限に挑む

スパースファイルにする

表示されるアイコンの種類を調べてみた

メモリマップIOとエラー処理

ファイルを作る順番と速度の関係

Cryptography API: Next Generationを使う

Windows 10のアクセントカラー

iSCSIディスクにバックアップを取る

サーバプロセスを分離して実装する

サーバプロセスを分離して実装する - F#

レジストリに大量に書き込む

Solaris関連

OpenGL

Solaris設定

ディレクトリの読み込み

主筆プラグイン開発

マルチスレッドでの開発

door

音を出す

Blade100の正しい虐め方

パッケージの作成

画像入出力

BMPファイル

ICOファイル

ANIファイル

JPEGファイル

減色アルゴリズム

減色アルゴリズムの並列化

その他アルゴリズムなど

自由軸回転

Base64

文字列操作

CPU利用率の取得

正規表現ライブラリ

メタボールを作る

メタボールを作る2

正規表現とNFA・DFA

C言語の構文解析

液晶ディスプレイを解体してみた

iSCSIの理論と実装

単一フォルダにファイルを沢山作る

USB-HUBのカスケード接続

SafeIntの性能

VHDファイルのフォーマット

USBメモリに書き込み続けてみた

LinuxでCPU利用率を取得する

2005年9月2日公開

はっきり言って、超小ネタ。

そもそも、システムのパフォーマンスに関する数値はsarかSNMPか何かで取得するのが吉。 だがとりあえずそうはしない場合について考えてみる。

/proc/stat

とりあえず、CPUがどれぐらい使用されているかという事に関する数値は、「/proc/stat」を読み込めばいい。

% cat /proc/stat
cpu 1207049 2691 189783 183739997
cpu0 490071 1307 91988 91986394
cpu1 716978 1384 97795 91753603
page 48413323 19096093
swap 1 0
intr 105975504 92569760 116 0 4 4 0 3 3 1 0 0 0 113 0 3624540 2 7983801 0 0 0 0 0 0 0 0 0 239 0 16 0 0 1796902 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
disk_io: (3,0):(3632669,3123481,96825142,509188,38192176)
ctxt 57711098
btime 1124699859
processes 44314

利用率の算出

上記の表示内容の詳しい内容は他のサイトに譲るとして、とりあえずここで興味があるのは、一番最初に表示される行の四つの数字だ。

これはそれぞれ、CPUが使用した「ユーザ時間」「nice時間」「システム時間」「総tick数」だそうだ。でもって、各数値は全てtickという単位で表示されれている。

でもって、これらの値は「/proc/stat」を表示させるたびに加算されていく。

と、言うことは、一秒ごとぐらいにこの値を読み込んで、「前に読んだ時からどれぐらい増えたか」を調べてやれば「単位時間あたりのCPU利用率」が求められることになるわけだ。

で、ここで問題が一つ。単位がTickだということだ。でもって、これを正確な時間にするのは容易ではなさそうだ。しかし、ありがたいことにtimesとか言う関数を使うと、tick単位で時間を取得できるらしい。 これならば、とりあえずCPU利用率を算出することはできる。

まぁ、プログラムにすればこういう事になる。

#include <stdio.h>
#include <sys/times.h>

int old_use;	// 前の/proc/statの値を保持
clock_t old_time;	// 前の時刻を保持

double foo()
{
	char *buf[1024];	// 文字列"cpu"の部分の入力用
	int usr, nice, sys;
	double wd;
	clock_t now;
	struct tms wtms;

	// 演算に使用されたTick値を取得
	FILE *infile = fopen( "/proc/stat", "r" );
	if ( NULL == infile ) return 0.0;
	fscanf( infile, "%s %d %d %d", buf, &usr, &nice, &sys );
	fclose( infile );

	// 現在の時刻を取得
	now = times( &wtms );

	// CPU利用率を算出
	wd = ( (double)( usr + nice + sys - old_use ) / ( now - old_time ) );

	// 取得したTick値、時刻を退避
	old_use = usr + nice + sys;
	old_time = now;
	return wd;
}

上記の関数を呼び出してやるたびに、前回呼び出した時から今回呼び出された時までのCPU利用率が返される。

グローバル変数を使ってたりとかしてかなり怪しい物ではあるが、まぁ、なんかそれっぽい値が取得できる。

あと、ついでに言うと、上記の関数はCPUが二つあると最大で2を返しうる。 CPUごとの利用率を算出するようにしたければ、「/proc/stat」の出力の二行目と三行目の値を使うように変更してやればいい。


連絡先 - サイトマップ - 更新履歴
Copyright (C)  2000 - 2016 nabiki_t All Rights Reserved.