Java Mission Control + Flight RecorderをGlassFish4で使ってみた

Java SE 7 Update 40が先日でました。なんとこの子はついに待望のFlight Recorder(ちゃんとした版)が実装されたのですよ!

本番環境の障害調査用にと個人的にはJRockitの機能がHotspotに統合されるHotRockitプロジェクトで一番注目してた機能でした。

一応、JDK7u4あたりからコマンド自体は移植されてたんですが、中身は全然移植されてなかったので、今か今かと待ってた次第です。

 

というわけで早速入れてみました。まずは通常利用しているGlassFish3.1.2に下記のオプションを追加。

<jvm-options>-XX:+UnlockCommercialFeatures</jvm-options>
<jvm-options>-XX:+FlightRecorder</jvm-options>

そしてstart-domain。

Error: To use 'FlightRecorder', first unlock using -XX:+UnlockCommercialFeatures.
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
launchctl bsexec failed: Inappropriate ioctl for device

Command start-domain failed.

動かない!? なんぞバグのようです。とりあえずGlassFish4では直ってるらしいので仕切りなおし。

GlassFish4 だと無事起動しました。ちなみに管理コンソールから変えるならこの辺を変更。

f:id:pascal256:20130924162004p:plain

 

 

続いてFlight Recoderを起動させます。

まず、jcmdコマンドを実行してglassfishのプロセスIDを確認

9131 /usr/local/bin/../Cellar/play/2.1.3/bin/../libexec/framework/sbt/sbt-launch.jar run
30363 bin/../glassfish/lib/client/appserver-cli.jar start-domain --verbose true
8887 
30639 sun.tools.jcmd.JCmd
30365 com.sun.enterprise.glassfish.bootstrap.ASMain -domainname domain1 -asadmin-args --host,,,localhost,,,--port,,,4848,,,--secure=false,,,--terse=false,,,--echo=false,,,--interactive=true,,,start-domain,,,--verbose=true,,,--watchdog=false,,,--debug=false,,,--domaindir,,,/Users/koduki/Downloads/glassfish4/glassfish/domains,,,domain1 -instancename server -verbose true -debug false -asadmin-classpath /Users/koduki/Downloads/glassfish4/glassfish/lib/client/appserver-cli.jar -asadmin-classname com.sun.enterprise.admin.cli.AdminMain -upgrade false -type DAS -domaindir /Users/koduki/Downloads/glassfish4/glassfish/domains/domain1 -read-stdin true

つづいて、プロセスIDを引数にして実行できるコマンド一覧を表示

jcmd 30365 help                                           
30365:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.native_memory
VM.commercial_features
ManagementAgent.stop
ManagementAgent.start_local
ManagementAgent.start
Thread.print
GC.class_histogram
GC.heap_dump
GC.run_finalization
GC.run
VM.uptime
VM.flags
VM.system_properties
VM.command_line
VM.version
help

For more information about a specific command use 'help '.

JFRなんたらがFlightRecerder関連です。まずは起動させます。

JFR.start

 続いて、適当に動かしたあとにdumpを取ります。

jcmd 30365 JFR.dump recording=1 filename=/tmp/dump.jfr

これで稼働データの取得はOK. 続いて、JMCでの分析です。

まずは、JMCを起動。

/Library/Java/JavaVirtualMachines/jdk1.7.0_40.jdk/Contents/Home/bin/jmc

EclipseベースのオサレなUIが立ち上がります。VisualVM と同等のJMXのリアルタイム分析も出来ますが、今回はパス。

File -> OpenFile で先ほどのdumpしたファイルを開きます。すると、いい感じに解析されたデータが!

 

 普通にシステムサマリはもちろん。

f:id:pascal256:20130924163020p:plain

 

 

オブジェクトの利用頻度をしかも時間を絞りながら確認可能。

f:id:pascal256:20130924163048p:plain

 

 

スレッドダンプとかロックしたスレッドの分析とかも可能。

f:id:pascal256:20130924163133p:plain

 

ファイルやsocketのI/Oも分析可能。

f:id:pascal256:20130924163330p:plain

 

どんなイベントに時間がかかってるかの分析だって出来ます。

f:id:pascal256:20130924163433p:plain

 

とりあえず、なにこれ、すごすぎない!? ってのが感想です。

プロファイラで取得するレベルの情報が、本番稼動システムに対して、たかだか4%から10%程度の性能ダウンで手に入るなら安いもんですね。障害分析の超強い味方になってくれそうです。

 

さすがに、本番運用は商用ライセンス買ってね☆ ってことみたいですが、これはお金払ってでも使いたいなぁ。まじめにいくら位なんだろ。その辺は後日要確認して導入を検討しよう、と。

 

 参考:

 

それではHappy Hacking!