Download - #glassfishjp GlassFishとProfiler
#glassfishjp
GlassFishとProfiler
KUBOTA Yuji (@sugarlife)
#glassfishjp1
#glassfishjp
GlassFishとProfiler
KUBOTA Yuji (@sugarlife)
#glassfishjp
hprof
2
#glassfishjp
自己紹介
• KUBOTA Yuji (@sugarlife)• 難聴者• トラブルシューター• JVM (主にGC) 好き• GlassFish/JBoss EAP 検証
検証終了
3
#glassfishjp
今回のお話は
• GlassFish Open Source Edition 3.1.2.2の検証中、Profiler(hprof)を利用した際に困ったことがあったのでその共有。
4
#glassfishjp
試験中に何かが発生
0
25
50
75
100
CPU Usage
※イメージです
5
#glassfishjp
まずはリソース確認
• 各種リソース確認するも主立った問題なし…
• (d|vm|net|*)stat / sar / sockets / ps / gc / Statspack / etc...
※イメージです
6
#glassfishjp
というわけで、
•Profile! Profile!! Profile!!!
どこかで聞いたフレーズ
7
#glassfishjp
Profilerは?•サードパーティ製を含めると沢山•NetBeans Profiler•JProbe Profiler•VisualVM•今回はJDKに付属しているhprofを利用。
8
#glassfishjp
GlassFishでhprofを動かそう
•CUIから[^]$ asadmin create-profiler sample_profilerCommand create-profiler executed successfully.
[^]$ asadmin create-jvm-options --profile=true “-agentlib¥:hprof=heap=sites,file=sample.hprof,interval=20,depth=3”Created 1 option(s)Command create-jvm-options executed successfully.
hprofの詳細: http://docs.oracle.com/javase/7/docs/technotes/samples/hprof.html
赤文字に注意
9
#glassfishjp
•GUI(Admin Console)からGlassFishでhprofを動かそう
10
#glassfishjp
•GUI(Admin Console)からGlassFishでhprofを動かそう
Oracle GlassFish Server 3.1 Development Guide にも記載されている
一応お墨付き
11
#glassfishjp
実際に動かしてみると…
•再起動が必要なので$ asadmin restart-domain::
•終わらない start/stopと違ってタイムアウトしない
12
#glassfishjp
何が起きたのか?[^]$ asadmin start-domain domain1Waiting for domain1 to start .........Error starting domain domain1.The server exited prematurely with exit code 1.Before it died, it produced the following output:
Launching GlassFish on Felix platformERROR: Bundle org.glassfish.hk2.osgi-adapter [91] Error starting file:/opt/glassfish3/glassfish/modules/osgi-adapter.jar (org.osgi.framework.BundleException: Activator start error in bundle org.glassfish.hk2.osgi-adapter [91].)ERROR: Bundle org.glassfish.main.core.glassfish [92] Error starting file:/opt/glassfish3/glassfish/modules/glassfish.jar (org.osgi.framework.BundleException: Activator start error in bundle org.glassfish.main.core.glassfish [92].)
java.lang.NoClassDefFoundError: com/sun/demo/jvmti/hprof/Tracker at org.jvnet.hk2.osgiadapter.HK2Main.start(HK2Main.java:139) at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:641) at org.apache.felix.framework.Felix.activateBundle(Felix.java:1977) at org.apache.felix.framework.Felix.startBundle(Felix.java:1895) at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1191) at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:295) at java.lang.Thread.run(Thread.java:722)Caused by: java.lang.ClassNotFoundException: com.sun.demo.jvmti.hprof.Tracker not found by org.glassfish.hk2.osgi-adapter [91]:(略)Caused by: java.lang.ClassNotFoundException: com.sun.demo.jvmti.hprof.Tracker not found by org.glassfish.main.core.glassfish [92]:(略)Caused by: org.glassfish.embeddable.GlassFishException: No GlassFishRuntime available at com.sun.enterprise.glassfish.bootstrap.osgi.OSGiGlassFishRuntimeBuilder.getGlassFishRuntime(OSGiGlassFishRuntimeBuilder.java:202) at com.sun.enterprise.glassfish.bootstrap.osgi.OSGiGlassFishRuntimeBuilder.build(OSGiGlassFishRuntimeBuilder.java:162) ... 9 moreError stopping framework: java.lang.NullPointerExceptionjava.lang.NullPointerException at com.sun.enterprise.glassfish.bootstrap.GlassFishMain$Launcher$1.run(GlassFishMain.java:203)
Dumping allocation sites ... done.
Command start-domain failed.
hprof自体は有効になっているが、OSGi Bundle部分はパスが通っていないのでこけてる。
13
#glassfishjp
どうする?• GlassFishのJIRAには登録なし• 定期的に{Thread|Heap}dump類を取得する• 他のProfilerを利用する• 諸般の理由で環境構築が難しい• Apache Felix 追いかけて原因探る• ドキュメント確認、classpath設定部分の実装確認、btraceで追いかける(これは趣味)
3.1だと実は動く
14
#glassfishjp
原因
• • org.osgi.framework.bootdelegation = ... に com.sun.demo.jvmti.hprof, com.sun.demo.jvmti.hprof.* の両方を追加
• Apache Felixのバージョン変更の影響• 3.1以前は指定なしで動作していた X分後のお鍋
${installdir}/glassfish/config/osgi.properties
15
#glassfishjp
結果
${installdir}/glassfish/domains/<domain>/config/
• $ asadmin start-domainで無事起動• hprofで生成されるファイルは、に配置される。
• profiler設定は上記ディレクトリにあるdomain.xmlの<profiler>属性に記述される。
• 起動しなくなったらここを削除する。• <jvm-options>もhprof関係がないか確認。
16
#glassfishjp
まとめ
• GlassFishでプロファイルするつもりが、プロファイルするためにプロファイルしていた
17