SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|

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ってイザという時に期待を裏切らない。イザという時以外には、よく期待を裏切られるけど……。

  ちなみに、/proc/statの中身はこんな感じだ。

$ 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 }

  わ……以前のバージョンは結構苦労して作って、苦労してコンパイルを通したのに、/procを利用してRubyで書けばコレだけかよ!! 仕事中でもサクッと書けちゃったよ……あれ? ……あ、いや……その……えーっと、オイラの仕事はLinuxのサポートなのだからして、/procの下に何があるのかキチンと知っておくのも大事な仕事なのだからして……あひゃひゃひゃひゃ。