2010/03/05

JavaでCPU利用率を取得する方法

こんにちは。新規事業推進室の石田です。

 

さて、今日は2010年4月にリリースする店舗maticの新バージョンむけに書いたコードでの話しです。

店舗maticでは、朝の始業時などシステムの負荷がピークを迎える時間帯にはすぐにやらなくてもいい処理を後回しにするために、タスクキューの仕組みを作ってタスクキューにタスクを入れてすぐにユーザーにレスポンスを返すといった処理をやっています。

サーバーが暇になったら、タスクキューからタスクを取り出してタスクを実行するという風に動作します。

 

サーバーが暇かどうかを判断するには、LinuxとかのUnix系のOSだと一般的にはロードアベレージ値が使えます。

当然JavaにもMXBean経由でロードアベレージを取得することができる OperatingSystemMXBean#getSystemLoadAverage() なんていうメソッドが用意されています。

(このメソッドはJava6からですね)

 

問題はWindowsなどロードアベレージ値がないOS上でどうするかなんですが(といってもお前の作っている製品の対応OSはLinuxだけじゃないかというツッコミはさておき)、脊髄反射でCPU利用率を取得すればいいじゃないかと思ったところ、JavaにはドンズバCPU利用率を取得する方法は用意されていないということにいまさら気がつきました。(しってました?)

Google先生に聞いても、JNIとか身の毛もよだつ方法ばかりがヒット。

で、いろいろ調べてみると、OperatingSystemMXBeanのSunJVMでの拡張機能である、com.sun.management.OperatingSystemMXBeanには、getProcessCpuTime()というメソッドがあり、これを使うとJVMプロセスのCPU時間が取得できるらしいということがわかり、JConsoleのソースも参考にして作ったのが以下のクラス。

 

こんな感じで呼び出せば、CPU利用率っぽい値が取得できます。

 

まあ、Unix系ならロードアベレージでいいので自分的にはお蔵入りのコードなんですが、Windowsむけのアプリを書いている人で同じところでハマった人がいれば参考にしてください。

 

では。