JavaでLinuxシステムのCPU使用率を取得
こちらのページを参考に、JavaでLinuxシステムでのCPU使用率を求める方法を調べてまとめた。
手順をまとめるとこんな感じ。
- /proc/statの最初の行からユーザモードの実行時間、底優先度のユーザモード実行時間、システムモード実行時間を取得
- 現在時刻を取得
- (現在のCPU実行時間 - 過去に測定したときのCPU実行時間) / (現在時刻 - 過去に測定したときの時刻)を計算
注意点として、/proc/stat中のCPU実行時間の単位が10msだということ(X86 Linuxの場合)。そのため、時刻の単位も10msにそろえる必要がある。
これをJavaで書くと以下のようになる。
import java.io.*; import java.text.*; public class CalcUsage { private static long old_time; private static double old_use; public static double calc_usage() throws Exception { File file = new File("/proc/stat"); BufferedReader reader = new BufferedReader(new FileReader(file)); String line = reader.readLine().trim(); String[] vals = line.split("\\s+"); int usr = Integer.parseInt(vals[1]); int nice = Integer.parseInt(vals[2]); int sys = Integer.parseInt(vals[3]); reader.close(); long now = System.currentTimeMillis() / 10; double usage = (usr + nice + sys - old_use) / (now - old_time); old_use = usr + nice + sys; old_time = now; return usage; } public static void main(String[] args) throws Exception { DecimalFormat format = new DecimalFormat("0.00"); while (true) { double usage = calc_usage(); System.out.println(format.format(usage)); Thread.sleep(1000); } } }
なお、/proc/stat ファイルの1行目は全てのCPUの使用率の合計になっている。上記の計算式だとCPUごとに最大100%となるように計算しているので、CPUがn個ある場合は最大n * 100%となる。 n個CPUがある場合でも最大値を100%とするには、上記の式の計算結果をCPU数で割ればよい。 CPU数は/proc/statファイルから、正規表現/^cpu\d+/にマッチする行数を求めればよく、簡単に求まる。