|
|
|
|
|
Windows関連
スクリーンセーバー作成法
半透明ウインドウの性能
bootfont.bin
キャビネット形式
ウインドウスタイルをいじる
Java製ソフトをServiceに登録する
イベントログにメッセージを出力する
コントロールパネルにアイコンを追加する
Solaris関連
OpenGL
Solaris設定
ディレクトリの読み込み
主筆プラグイン開発
Sun Studio 11
マルチスレッドでの開発
door
音を出す
Blade100の正しい虐め方
パッケージの作成
画像入出力
BMPファイル
ICOファイル
ANIファイル
JPEGファイル
減色アルゴリズム
減色アルゴリズムの並列化
その他アルゴリズムなど
自由軸回転
Base64
文字列操作
CPU利用率の取得
正規表現ライブラリ
メタボールを作る
メタボールを作る2
正規表現とNFA・DFA
C言語の構文解析
マルチスレッド開発の傾向と対策
|
LinuxでCPU利用率を取得する
はっきり言って、超小ネタ。
そもそも、システムのパフォーマンスに関する数値はSNMPか何かで取得するのが吉。
でも、そこまでしたくないということもあるだろうし、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」の出力の二行目と三行目の値を使うように変更してやればいい。
|
|
|
|