JavaでLinuxシステムのCPU使用率を取得

こちらのページを参考に、JavaLinuxシステムでのCPU使用率を求める方法を調べてまとめた。
手順をまとめるとこんな感じ。

  1. /proc/statの最初の行からユーザモードの実行時間、底優先度のユーザモード実行時間、システムモード実行時間を取得
  2. 現在時刻を取得
  3. (現在の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+/にマッチする行数を求めればよく、簡単に求まる。