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 だと無事起動しました。ちなみに管理コンソールから変えるならこの辺を変更。
続いて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したファイルを開きます。すると、いい感じに解析されたデータが!
普通にシステムサマリはもちろん。
オブジェクトの利用頻度をしかも時間を絞りながら確認可能。
スレッドダンプとかロックしたスレッドの分析とかも可能。
ファイルやsocketのI/Oも分析可能。
どんなイベントに時間がかかってるかの分析だって出来ます。
とりあえず、なにこれ、すごすぎない!? ってのが感想です。
プロファイラで取得するレベルの情報が、本番稼動システムに対して、たかだか4%から10%程度の性能ダウンで手に入るなら安いもんですね。障害分析の超強い味方になってくれそうです。
さすがに、本番運用は商用ライセンス買ってね☆ ってことみたいですが、これはお金払ってでも使いたいなぁ。まじめにいくら位なんだろ。その辺は後日要確認して導入を検討しよう、と。
参考:
それではHappy Hacking!