17
#glassfishjp GlassFishとProfiler KUBOTA Yuji (@sugarlife) #glassfishjp 1

#glassfishjp GlassFishとProfiler

Embed Size (px)

DESCRIPTION

#glassfishjp 2012/09/24の発表資料。

Citation preview

Page 1: #glassfishjp GlassFishとProfiler

#glassfishjp

GlassFishとProfiler

KUBOTA Yuji (@sugarlife)

#glassfishjp1

Page 2: #glassfishjp GlassFishとProfiler

#glassfishjp

GlassFishとProfiler

KUBOTA Yuji (@sugarlife)

#glassfishjp

hprof

2

Page 3: #glassfishjp GlassFishとProfiler

#glassfishjp

自己紹介

• KUBOTA Yuji (@sugarlife)• 難聴者• トラブルシューター• JVM (主にGC) 好き• GlassFish/JBoss EAP 検証

検証終了

3

Page 4: #glassfishjp GlassFishとProfiler

#glassfishjp

今回のお話は

• GlassFish Open Source Edition 3.1.2.2の検証中、Profiler(hprof)を利用した際に困ったことがあったのでその共有。

4

Page 5: #glassfishjp GlassFishとProfiler

#glassfishjp

試験中に何かが発生

0

25

50

75

100

CPU Usage

※イメージです

5

Page 6: #glassfishjp GlassFishとProfiler

#glassfishjp

まずはリソース確認

• 各種リソース確認するも主立った問題なし…

• (d|vm|net|*)stat / sar / sockets / ps / gc / Statspack / etc...

※イメージです

6

Page 7: #glassfishjp GlassFishとProfiler

#glassfishjp

というわけで、

•Profile! Profile!! Profile!!!

どこかで聞いたフレーズ

7

Page 8: #glassfishjp GlassFishとProfiler

#glassfishjp

Profilerは?•サードパーティ製を含めると沢山•NetBeans Profiler•JProbe Profiler•VisualVM•今回はJDKに付属しているhprofを利用。

8

Page 9: #glassfishjp GlassFishとProfiler

#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

Page 10: #glassfishjp GlassFishとProfiler

#glassfishjp

•GUI(Admin Console)からGlassFishでhprofを動かそう

10

Page 11: #glassfishjp GlassFishとProfiler

#glassfishjp

•GUI(Admin Console)からGlassFishでhprofを動かそう

Oracle GlassFish Server 3.1 Development Guide にも記載されている

一応お墨付き

11

Page 12: #glassfishjp GlassFishとProfiler

#glassfishjp

実際に動かしてみると…

•再起動が必要なので$ asadmin restart-domain::

•終わらない start/stopと違ってタイムアウトしない

12

Page 13: #glassfishjp GlassFishとProfiler

#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

Page 14: #glassfishjp GlassFishとProfiler

#glassfishjp

どうする?• GlassFishのJIRAには登録なし• 定期的に{Thread|Heap}dump類を取得する• 他のProfilerを利用する• 諸般の理由で環境構築が難しい• Apache Felix 追いかけて原因探る• ドキュメント確認、classpath設定部分の実装確認、btraceで追いかける(これは趣味)

3.1だと実は動く

14

Page 15: #glassfishjp GlassFishとProfiler

#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

Page 16: #glassfishjp GlassFishとProfiler

#glassfishjp

結果

${installdir}/glassfish/domains/<domain>/config/

• $ asadmin start-domainで無事起動• hprofで生成されるファイルは、に配置される。

• profiler設定は上記ディレクトリにあるdomain.xmlの<profiler>属性に記述される。

• 起動しなくなったらここを削除する。• <jvm-options>もhprof関係がないか確認。

16

Page 17: #glassfishjp GlassFishとProfiler

#glassfishjp

まとめ

• GlassFishでプロファイルするつもりが、プロファイルするためにプロファイルしていた

17