Weitere ähnliche Inhalte
Ähnlich wie HeapStats: Introduction and Technical Preview (20)
Mehr von Yuji Kubota (19)
Kürzlich hochgeladen (11)
HeapStats: Introduction and Technical Preview
- 4. NTT OSSセンタ
• OSS活用によるNTTグループの社内システムのTCO削減とSI競争
力強化を目的に2006年設立事業現場でのOSS導入阻害要因の解
消をめざす *)OSSVERT®:OSs Suites VERified Technically(技術検証済みOSS組合せ)
事業会社
SI会社
問合せ対応、
導入支援、
プロダクト保守等
技術検証、
検証済OSS
の導入推進
プロダクト/
ツール類の開発
技術者育成、
人材交流
各種
OSS
コミュニ
ティ
設計, 開
発, 運用
グループ各社
サポート
ベンダ、
NTT
研究所等
お
客
様
サポート
連携
開発
連携
①OSSトータル
サポート
NTT OSSセンタ
②OSS適用推進
(OSSVERT®*検証)
③技術開発
(DBMS,高可用ミドル等)
④ソフトウェア
基盤技術力向上
Copyright©2015 NTT corp. All Rights Reserved. 4
- 5. NTT OSSセンタ ポータルサイト
• http://www.oss.ecl.ntt.co.jp/ossc/
Copyright©2015 NTT corp. All Rights Reserved. 5
- 6. • Troubles with JVM
• HeapStats Overview
– HeapStats Agent
– HeapStats Analyzer
– Demonstration
• Community
• Technical Preview
Copyright©2015 NTT corp. All Rights Reserved. 6
Agenda
- 7. Troubles with JVM
Caused by: java.sql.SQLException: プロトコル違反です。
at xxx.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at xxx.jdbc.driver.Statement.executeForDescribe(Statement.java:804)
at xxx.jdbc.driver. Statement.doExecuteWithTimeout(Statement.java:1154)
at xxx.jdbc.driver.Statement.executeQuery(Statement.java:1313)
at com.xxx.query.QueryDataSet.<init>(QueryDataSet.java:80)
at org.xxx.database.util.BaseSQL.executeQuery(BaseSQL.java:930)
... 26 more
Exception in thread "TP-Processor9" java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3221)
at java.lang.String.<init>(String.java:233)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at java.lang.Thread.run(Thread.java:619)
Copyright©2015 NTT corp. All Rights Reserved. 7
- 11. HeapStats Overview
アプリケーションサーバ
• メモリリークの予兆検知!
• デッドロック検知!
• 障害発生!
情報収集
解析
自動で障害発生時に
詳細情報を収集
HeapStats
アナライザ
※1 SPECjvm2008のComposite resultによる測定
※2 運用監視ソフトや製品と組み合わせることで通知が行えます
迅速な状況通知(※2)
SNMPトラップ
5%(※1)以下の低オーバ
ヘッドで常時情報収集
HeapStats
JVM監視エージェント
迅速な
原因分析
Copyright©2015 NTT corp. All Rights Reserved. 11
- 12. HeapStats Overview
アプリケーションサーバ
• メモリリークの予兆検知!
• デッドロック検知!
• 障害発生!
情報収集
解析
自動で障害発生時に
詳細情報を収集
HeapStats
アナライザ
※1 SPECjvm2008のComposite resultによる測定
※2 運用監視ソフトや製品と組み合わせることで通知が行えます
迅速な状況通知(※2)
SNMPトラップ
5%(※1)以下の低オーバ
ヘッドで常時情報収集
HeapStats
JVM監視エージェント
迅速な
原因分析
Copyright©2015 NTT corp. All Rights Reserved. 12
- 13. HeapStats Agent
• RPM コマンドから楽々インストール
– rpm -ivh heapstats-<version>.rpm
• Java 起動オプションを一つ追加でOK!
– java -agentlib:heapstats YourApp
• 実行中の Java プロセスにも設定可能!
– 再起動の必要なし
• 継続的に各種詳細情報をファイル出力
Copyright©2015 NTT corp. All Rights Reserved. 13
- 14. 282.68 269.92
0
50
100
150
200
250
300
Without HeapStats With HeapStats
4.51 %
(ops/m)
SPECjvm2008 Composite Result
• ベンチマークツール: SPECjvm2008 1.01
• マシン: DELL PowerEdge R810(Xeon X7542、メモリ32GB)
• OS: Red Hat Enterprise Linux Server release 6.3 x86_64
• Java: java-1.7.0-openjdk-1.7.0.25-2.3.10.4.el6_4.x86_64
• java起動オプション: -Xms4500m -Xmx4500m -XX:+UseG1GC -agentpath:<エージェントライブラリ>
オーバヘッド
Copyright©2015 NTT corp. All Rights Reserved. 14
※ 測定環境
- 15. HeapStats Overview
アプリケーションサーバ
• メモリリークの予兆検知!
• デッドロック検知!
• 障害発生!
情報収集
解析
自動で障害発生時に
詳細情報を収集
HeapStats
アナライザ
※1 SPECjvm2008のComposite resultによる測定
※2 運用監視ソフトと組み合わせることでメール通知なども行えます
迅速な状況通知(※2)
SNMPトラップ
5%(※1)以下の低オーバ
ヘッドで常時情報収集
HeapStats
JVM監視エージェント
迅速な
原因分析
Copyright©2015 NTT corp. All Rights Reserved. 15
- 16. HeapStats Analyzer
• Java 製 GUI Viewer
– Java 解析なので Java がある前提
– java -jar heapstats.jar (※JDK6以上)
• 一覧性の高い時系列画面等を提供
– 状況を一目で確認しやすい
– CSV にコンバートする機能もある
Copyright©2015 NTT corp. All Rights Reserved. 16
- 24. HeapStats のメリット
n 再現待ち・手作業からの解放
n Javaアプリ利用のシステムにおける障害解析のスピードアップ・効率化
を狙い、運用中の商用システムにおいても即座に解析が可能な支援ツー
ルを開発
n HeapStats を入れるだけで様々な情報が自動的に収集される
n 素早い初動解析
n ヒープ情報を詳細に収集、分析が可能
n この他、OSレベル/Javaレベルで詳細な情報を収集
n OS:CPU使用率、ネイティブメモリ使用量、ソケットエンドポイント、等
n Java:ライブスレッド数、ロック競合回数、完全停止(Stop-The-World)時間等
n リアルタイムな検知・通知
n 特定インスタンスのメモリ使用量、あるいはヒープメモリの総使用量が
閾値を超えた場合、SNMPトラップで外部へ通知
n Javaスレッド間のデッドロックをリアルタイムに検知し、SNMP等で外
部へ通知することが可能
Copyright©2015 NTT corp. All Rights Reserved. 24
- 25. HeapStats のメリット
n 再現待ち・手作業からの解放
n Javaアプリ利用のシステムにおける障害解析のスピードアップ・効率化
を狙い、運用中の商用システムにおいても即座に解析が可能な支援ツー
ルを開発
n HeapStats を入れるだけで様々な情報が自動的に収集される。
n 素早い初動解析
n ヒープ情報を詳細に収集、分析が可能。
n この他、OSレベル/Javaレベルで詳細な情報を収集
n OS:CPU使用率、ネイティブメモリ使用量、ソケットエンドポイント、等
n Java:ライブスレッド数、ロック競合回数、完全停止(Stop-The-World)時間等
n リアルタイムな検知・通知
n 特定インスタンスのメモリ使用量、あるいはヒープメモリの総使用量が
閾値を超えた場合、SNMPトラップで外部へ通知
n Javaスレッド間のデッドロックをリアルタイムに検知し、SNMP等で外
部へ通知することが可能
Pros
• 確実な初期行動がとれる
• メモリ絡みの問題はほぼ撃墜できる
• オーバーヘッドはかなり低い
Cons
• スレッド周りの時系列情報が取れない
• 瞬間情報はスレッドダンプで確認可能
• プロファイリング情報は取れない
Copyright©2015 NTT corp. All Rights Reserved. 25
- 26. HeapStats 次期バージョン
• スレッド監視
– スレッドの状態を監視・収集し、時系列に表示する
• Analyzer の JavaFX 版、CLI 版を提供
– 操作性が向上し、より直感的な UI へ
– ターミナル上で完結する仕組みを提供
• オールインワンパッケージ
– 今は命令セットごとにパッケージを用意
• 2015年9月末リリース予定
Copyright©2015 NTT corp. All Rights Reserved. 26
- 27. HeapStats Community
Copyright©2015 NTT corp. All Rights Reserved. 27
• Committers
– Yasumasa Suenaga (末永恭正)
– KUBOTA Yuji (久保田祐史)
– TAKAO Shinji (髙雄慎二)
• Web Site
– http://icedtea.classpath.org/wiki/HeapStats
– http://icedtea.classpath.org/pipermail/heapstats/
- 31. Copyright©2015 NTT corp. All Rights Reserved. 31
• 基本方針
– JVM から良い感じに情報収集
– 情報 = ヒープ上のクラス情報
• 他にもスレッド情報等があるが、
今回は割愛
HeapStats Agent の実装
- 33. JVM TI (Tool Interface)
• JVM レベルで操作・把握が可能
• コールバックを任意に設定可能
– GC前後, 特定フィールド変更時, 等
• プラットフォーム依存がある
– HeapStats は Linux 限定
Copyright©2015 NTT corp. All Rights Reserved. 33
- 34. JVM TI (Tool Interface)
• JVM レベルで操作・把握が可能
• コールバックを任意に設定可能
– GC前後, 特定フィールド変更時, 等
• プラットフォーム依存がある
– HeapStats は Linux 限定
JVMの保護が得られない
= SEGV との戦い
Copyright©2015 NTT corp. All Rights Reserved. 34
嫌でも OpenJDK に
詳しくなれる
- 35. low-overhead を目指す
Copyright©2015 NTT corp. All Rights Reserved. 35
• Major GCと同期して情報収集
– Java オブジェクトの C++ 表現(=oop,
Ordinary Object Pointer)を収集する
– 収集の際に STW が懸かるのを避ける
• ロードしているクラス情報の一括取得
• Java ヒープのスキャン
- 36. Thread stack
Object monitor
JNI Reference
GC Root
✔
✔
✔
✔
✔
✔
✔
✔
✔
✔
Sweep
Live object
Mark
GC process of HotSpot VM
Copyright©2015 NTT corp. All Rights Reserved. 36
この情報
が欲しい
実際はスタック/キューで管理され、
子要素 (対象oop) が0になると終了
この情報
は不要
- 37. ✔
Object
virtual calculateSize()
:
JVM internal (C++)
Java Object
virtual marking()
Class Object
virtual marking()
Primitive Object
virtual marking()
vtable
marking
virtual marking()
Override
to collect
override_marking(AMD64):
push [register for argument]
mov [argument] [register]
call [collect information method]
pop [register for argument]
jmp XXObject::marking
Marking
Save the stack and
register for resume
the GC process.
How to hook the marking
Copyright©2015 NTT corp. All Rights Reserved. 37
- 38. Java ヒープ占有オブジェクト (oop)
• instanceKlass
– インスタンスクラスのC++表現
• objArrayKlass
– Javaオブジェクト配列クラスのC++表現
• typeArrayKlass
– プリミティブ配列クラスのC++表現
• instanceRefKlass
– Weak参照やSoft参照など、参照形態の異なる(いわ
ゆる弱参照系)インスタンスクラスのC++表現
38Copyright©2015 NTT corp. All Rights Reserved.
これらを計算対象とす
ればヒープ上の情報は
網羅的に収集できる
- 40. 40Copyright©2015 NTT corp. All Rights Reserved.
CMS GC の場合jdk8u45
• 実は marking では情報が取れない
– concurrent に実行される都合上、
多数の OopClosure を介する
– OopClosure の non virtual 関数が
marking を行うためフックできない
- 41. 41Copyright©2015 NTT corp. All Rights Reserved.
CMS GC の場合jdk8u45
• New 世代対策
– Remark フェーズで New 世代をフ
ルスキャンするのでそこをフック
• Remark: Javaスレッドを止めて全
ヒープ漏れなくマークするフェーズ
- 42. 42Copyright©2015 NTT corp. All Rights Reserved.
CMS GC の場合jdk8u45
• Old 世代対策
– Sweep フェーズで Old 世代をフルス
キャンするのでフック
• Sweep: ゴミ掃除フェーズ
• マーク済かはCMSBitMap が保持してい
るので利用してマーク済 oop だけ収集
※:マーク済 oop = Live object
- 43. CMS GC の場合
• New 世代
– typeArrayKlass::oop_oop_iterate(oopDesc*,
OopClosure*)
– *Klass::oop_oop_iterate_nv(oopDesc*,
Par_MarkRefsIntoAndScanClosure*)
• Old 世代
– SweepClosure::do_blk_careful(HeapWord*)
43Copyright©2015 NTT corp. All Rights Reserved.
jdk8u45
typeArrayKlass は全ての OopClosure に関
する Klass::oop_oop_iterate_nv() から呼
ばれる共通処理があるのでここをフック
- 44. 44Copyright©2015 NTT corp. All Rights Reserved.
jdk8u45
• Marking と Evacuation (マークと退避)
サイクルが完全に分離されている
• Evacuation が、インクリメンタルで動
作する場合があり、1 GC でヒープ全体
の情報を収集できない可能性がある
• マーク済情報を保持してないので、自前
で BitMap を作る必要が有る
G1GC の場合
- 45. 45Copyright©2015 NTT corp. All Rights Reserved.
jdk8u45
• 頑張って Marking サイクルでフック
– typeArrayKlass::oop_oop_iterate (oopDesc*,
OopClosure *)
– *Klass::oop_oop_iterate_nv(oopDesc*,
G1CMOopClosure*)
– *Klass::oop_oop_iterate_nv(oopDesc*,
G1RootRegionScanClosure*)
• この他、独自BitMap作成に必要な情報収集
G1GC の場合
- 46. 46Copyright©2015 NTT corp. All Rights Reserved.
• Permanent / Metaspace 領域の情
報収集方法
• oop からの各種情報取得方法
• スレッド情報の収集方法
• etc…
言ってない事
- 47. 47Copyright©2015 NTT corp. All Rights Reserved.
・3・b
• http://icedtea.classpath.org/wiki/HeapStats
• heapstats@icedtea.classpath.org
• hg clone
http://icedtea.classpath.org/hg/heapstats
We want you!