SVX日記
2006-02-28(Tue) CPU使用率を得てみる
ここ数日「USB接続版アナログCPU使用率メータ」を作っているワケであるが、あくまでハードウェア側は「入力された数値をアナログ表示するだけ」のガジェットであるから「CPU使用率メータ」にするためには、PC側から「CPU使用率」をハードウェア側に継続的に送信しなくてはならない。
以前にCPU使用率メータを作った時には、ネット上からWindows用のCPUメータアプリ(ソース付き)を持ってきて、適当に流用して作った。今回もそれを使おうかな、オレ用cvsからプロジェクトを落としてと……あれ? リンカを通らない……あぁ、前回はBorlandのフリー版Cコンパイラ用に書いたんだっけ……Cygwin上のgccだとなんだか大量にエラーを吐いてしまう。いまさらコレだけのために、別途Cコンパイラを入れるのもイヤだなぁ……面倒くさい。
どぉーしよぉー……ん? 待てよ? Cygwinにはtopとかvmstatとかってないんだっけ? ……ない……ん? じゃ、/procの下になんかないの? お!? あるじゃん!! /proc/stat!! Cygwinってイザという時に期待を裏切らない。イザという時以外には、よく期待を裏切られるけど……。
$ cat /proc/stat
cpu 4120394 0 5247745 79092769
cpu0 4120394 0 5247745 79092769
page 2388170 390404
swap 2388170 352464
intr 62255651
ctxt 338348792
btime 1141097464
大事なのはcpuの行。詳細はman procするか、ココを見て欲しいが、なにしろ、CPUが仕事してた時間と遊んでた時間の合計はここから得られるのである。あとは単位時間ごとに差分をとって比率を得るだけ。
1 #!/usr/bin/ruby
2
3 # CPU使用率を求める
4
5 busy = all = nil
6
7 loop {
8 open('/proc/stat', 'r') {|psh|
9 lastbusy = busy
10 lastall = all
11
12 if(psh.readline =~ /^cpu\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\n$/)
13 user = $1.to_i; nice = $2.to_i; sys = $3.to_i; idle = $4.to_i
14 all = (busy = user + nice + sys) + idle
15 end
16
17 if(lastall)
18 p (lastbusy - busy) * 100 / (lastall - all)
19 end
20 }
21 sleep 1;
22 }