Top Banner
OpenJDK とらしゅー KUBOTA Yuji @sugarlife Java Casual Talk #1
23

OpenJDK トラブルシューティング #javacasual

Jan 25, 2017

Download

Technology

Yuji Kubota
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: OpenJDK トラブルシューティング #javacasual

OpenJDK とらしゅー

KUBOTA Yuji @sugarlife

Java Casual Talk #1

Page 2: OpenJDK トラブルシューティング #javacasual

@sugarlife• 某グループで OpenJDK サポート

– コアダンプ等の JVM 障害解析、(レアケースな) GC チューニングとか

– たまにパッチ書いて闇に消投稿 • 解析支援ツール HeapStats 開発

– 低オーバーヘッド命 – あっちこっちで元気に稼働中 :)

Page 3: OpenJDK トラブルシューティング #javacasual

今日のお題

• カジュアルなトラシュー(を夢

見て色々あった)話

Page 4: OpenJDK トラブルシューティング #javacasual

JDK9 を聞きたい人

4

http://www.slideshare.net/YujiKubota/jdk9-jjug もしくは月末にある JavaOne2015 の報告会があるかも?

8月時点の新機能概要は以下 :p

Page 5: OpenJDK トラブルシューティング #javacasual

OpenJDK 事例を聞きたい人

5

http://oss.nttdata.co.jp/hadoop/event/201510/index.html

Page 6: OpenJDK トラブルシューティング #javacasual

よく受けるトラブル•  プロセスダウン

1. クラッシュ(コアダンプ)、無言でダウン 2. メモリ不足 (OutOfMemoryError等)

•  プロセス無反応、スローダウン 3. GC 長時間化 (JVM 起因の性能問題) 4. デッドロック、ループ

•  アプリエラー出力 5. スタックトレース

Page 7: OpenJDK トラブルシューティング #javacasual

よくある困ったパターン

7

• ログがない • 手作業ミスで(ログが)消し飛んだ • サービス環境で重い処理(≒ログ

収集・解析) が禁止されている • 個人情報関係で重要ログが来ない

Page 8: OpenJDK トラブルシューティング #javacasual

いいから

8

• ログがない • 手作業ミスで(ログが)消し飛んだ • サービス環境で重い処理(≒ログ

収集・解析) が禁止されている • 個人情報関係で重要ログが来ない

ログを取れ

Page 9: OpenJDK トラブルシューティング #javacasual

よく受けるトラブル•  プロセスダウン

1. クラッシュ(コアダンプ)、無言でダウン 2. メモリ不足 (OutOfMemoryError等)

•  プロセス無反応、スローダウン 3. GC 長時間化 (JVM 起因の性能問題) 4. デッドロック、ループ

•  アプリエラー出力 5. スタックトレース

Page 10: OpenJDK トラブルシューティング #javacasual

ケース1. クラッシュ

10

Page 11: OpenJDK トラブルシューティング #javacasual

ケース1. クラッシュ•  必要なログ

– コアダンプ (core.<pid>) •  ulimit –c unlimited で吐けるようにする

– エラーレポート(hs_err_pid<pid>.log) •  -XX:ErrorFile=/path/to/hs_err_pid%p.log

•  カジュアルトラシュー – レポートの Stack: 項目のトレースを読む – 祈りながら JDK Bug System で検索 – 2-3 割ぐらいは当たる (※個人的な体感) – 不発時はコアダンプと一緒にサポートへ

11

Page 12: OpenJDK トラブルシューティング #javacasual

ケース2. メモリ不足

12

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)

java.lang.OutOfMemoryError: <message> message: 10 種類以上あるhttp://www.slideshare.net/YujiKubota/javalangoutofmemoryerror-java

Page 13: OpenJDK トラブルシューティング #javacasual

ケース2. メモリ不足•  必要なログ (パターン1)

– ヒープダンプ •  jmap –dump:format=b,file=/path/to/file <pid>

– <pid> を /path/to/bin/java <core> にするとコアダンプからも取れる

• OOME 時に自動収集 (ヒープダンプとコア) – -XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/path/to/ -XX:OnOutOfMemoryError=`/bin/kill –ABRT %p`

•  カジュアルトラシュー – ヒープダンプを Eclipse Memory Analyzer に

放り込んで被疑オブジェクトを絞り込む 13

Page 14: OpenJDK トラブルシューティング #javacasual

ケース2. メモリ不足•  必要なログ (パターン1)

– ヒープダンプ •  jmap –dump:format=b,file=/path/to/file <pid>

– <pid> を /path/to/bin/java <core> にするとコアダンプからも取れる

• OOME 時に自動収集 (ヒープダンプとコア) – -XX:+HeapDumpOnOutOfMemoryError

-XX:HeapDumpPath=/path/to/ -XX:OnOutOfMemoryError=`/bin/kill –ABRT %p`

•  カジュアルトラシュー – ヒープダンプを Eclipse Memory Analyzer に

放り込んで被疑オブジェクトを絞り込む 14

Page 15: OpenJDK トラブルシューティング #javacasual

脇道•  Java Agent という機能がある

– バイトコードを動的に操作可能な、プロファイリング/デバッグのテクニック

•  JVM TI という JVM のインターフェース – JVM レベルで操作・把握可能 – コールバックを任意に設定可能 – プロファイラツールにはこれを利用した実

装もある – ヒープにいるオブジェクト状況を継続的に

把握可能なツールも作れるのでは??? 15

Page 16: OpenJDK トラブルシューティング #javacasual

作れた(ケース2. メモリ不足)•  必要なログ (パターン2)

– HeapStats •  -agentlib:heapstats

– rpm インストールが必要 » wget http://goo.gl/AfgA2x » rpm –ivh heapstats_agent-*.x86_64rpm

– heapstats_snapshot.dat を回収

•  カジュアルトラシュー – HeapStats Analyzer に放り込む

16

http://icedtea.classpath.org/wiki/HeapStats

Page 17: OpenJDK トラブルシューティング #javacasual

一目で解れば正義

17

[B byte[]

Page 18: OpenJDK トラブルシューティング #javacasual

誰が参照してるかも取れる

18

[B byte[]

参照関係にあるオブジェクトで一番インスタンス数が多いオブジェクト共

Page 19: OpenJDK トラブルシューティング #javacasual

ケース3. GC 長時間化

19

1085.695: [CMS-concurrent-sweep-start] 1086.736: [GC1086.736: [ParNew (promotion failed): 911243K->907358K(943744K), 0.1784670 secs] 3833880K->3894624K(4810368K), 0.2084860 secs] [Times: user=0.26 sys=0.00, real=0.20 secs] GC locker: Trying a full collection because scavenge failed 1087.214: [Full GC1087.215: [CMS1103.749: [CMS-concurrent-sweep: 13.564/13.754 secs] [Times: user=15.84 sys=0.25, real=13.75 secs] (concurrent mode failure): 2987266K->358385K(3866624K), 16.8898790 secs] 3894624K->358385K(4810368K), [CMS Perm : 129322K->129315K(262144K)], 20.8900340 secs] [Times: user=20.84 sys=0.00, real=20.89 secs]

Page 20: OpenJDK トラブルシューティング #javacasual

ケース3. GC 長時間化•  必要なログ

– GCログ •  -Xloggc:/path/to/gc_%t_pid%p.log

-XX:+PrintGCDetails -XX:+PrintGCDateStamps

•  カジュアルトラシュー – 基本戦略は GC ログを読んで時間が懸って

るフェーズやエラーに対して処置する – 15分じゃ語り足りないので資料

• CMS: http://goo.gl/9WyL33 (JJUG CCC 2014 Fall) • G1GC: JJUG CCC 2015 Fall 発表予定 20

Page 21: OpenJDK トラブルシューティング #javacasual

ケース3. GC 長時間化•  必要なログ

– GCログ •  -Xloggc:/path/to/gc_%t_pid%p.log

-XX:+PrintGCDetails -XX:+PrintGCDateStamps

•  カジュアルトラシュー – 基本戦略は GC ログを読んで時間が懸って

るフェーズやエラーに対して処置する – 15分じゃ語り足りないので資料

• CMS: http://goo.gl/9WyL33 (JJUG CCC 2014 Fall) • G1GC: JJUG CCC 2015 Fall 発表予定 21

Page 22: OpenJDK トラブルシューティング #javacasual

ケース4. デッドロック, ループ

22

• スレッドダンプ取って調べる – @yusuke さんのターン

Page 23: OpenJDK トラブルシューティング #javacasual

ケース5. スタックトレース

23

• Exception 握り潰した犯人を火にくべる

• 全然関係ない(ように見える) Exception に入れ替えて投げた犯人を火にくべる

• 英語読め