稼働中のコンピューティングリソースを蓄積・監視することは、機器の状態を確認して障害を事前に防ぐという意味でも、将来の機器拡張計画を立てるという意味でも、安定稼働に凄く効果があると思います。近年OSSのソフトウェアがあったり、簡単に導入できて安価なクラウド蓄積サービスがたくさんできて、導入しやすくなっています。
今回、CPUやメモリといったコンピューティングリソースの中でも、JVMのメモリ使用率の取得と蓄積に焦点を当てたいと思います。JVMはOSから見た場合、起動時に設定したメモリ量を確保しています。JVMはその中で割り当て、解放を繰り返し、確保量に対して空き容量が不足したら、(JVMのパラメータにもよりますが)追加でメモリを確保します。JVMのメモリ利用量の推移を可視化してみます。
JVMのメモリ利用推移を蓄積するソフトウェアはたくさんありますが、今回はjdkに付属しているjstatで出力したいと思います。
jdkを導入
最新版を取得していれます
$ curl --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" -OL http://download.oracle.com/otn-pub/java/jdk/9.0.1+11/jdk-9.0.1_linux-x64_bin.rpm
$ sudo rpm -ivh jdk-9.0.1_linux-x64_bin.rpm
$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
Javaのサンプル
数十秒の期間JVMを動かすようなプログラム
import java.util.Calendar;
public class Test {
public static void main(String[] args) {
System.out.println("start:" + Calendar.getInstance().getTime());
String ss = "test!";
try{
for (int i = 0; i < 1000000; i++) {
if ( i % 100000 == 0 ) Thread.sleep(2000);
ss = "test!!";
}
} catch(Exception e) {
System.out.println("catch");
}
System.out.println("end :" + Calendar.getInstance().getTime());
}
}
Javaの実行と、jstatの出力
もう少しヒープの動きが見えるプログラムにした方が良かったかも。
$ java Test
start:Tue Oct 24 03:09:43 JST 2017
end :Tue Oct 24 03:10:03 JST 2017
$ jstat -gc `pgrep -f java` 2000
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
512.0 512.0 0.0 0.0 4416.0 2954.9 10944.0 0.0 4480.0 1143.5 384.0 82.4 0 0.000 0 0.000 0.000
visualVM/java flight recorderなど綺麗に出力できるツールが利用できれば言うことないですが、JMXによるリモート接続が利用できない環境など、手間はかかるものの情報を蓄積する手段として利用できそうです。