Unified JVM Logging

465 views

Published on

This slide introduces about Unified JVM Logging.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
465
On SlideShare
0
From Embeds
0
Number of Embeds
68
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Unified JVM Logging

  1. 1. Unified JVM Logging! KUBOTA Yuji @sugarlife+ NTT OSSセンタ+ Copyright©2017 NTT corp. All Rights Reserved.+ 2017/05+
  2. 2. はじめに! • 本セッションは Java 9 から変 わる JVM ログの設定方法を把 握することが第一目標です • Log4J を代表としたロギングの java.util.logging は扱いません ここは口頭補足用なので見えなくても OK Copyright©2017 NTT corp. All Rights Reserved.+ 2!
  3. 3. おやくそく! • 本セッション (スライド) は、 以下の JVM 実装に基づきます – OpenJDK 9 EA b170 (HotSpot VM) – jdk9/jdk9/hotspot 12762:b3ee8ab233ed EA = Early Access。正式リリース前のバイナリ Copyright©2017 NTT corp. All Rights Reserved.+ 3! $ java -version java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+170) Java HotSpot(TM) 64-Bit Server VM (build 9-ea+170, mixed mode)+
  4. 4. 「楽してJVMを学びたい」シリーズを喋ってる人 Copyright©2017 NTT corp. All Rights Reserved.+ 4! KUBOTA Yuji (@sugarlife) Java Technical Support Engineer @NTT OSS センタ OpenJDK author, IcedTea committer Speaker (JavaOne, JJUG, etc…) Who I am!
  5. 5. Agenda! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 設定の仕方を覚えて帰りましょう Copyright©2017 NTT corp. All Rights Reserved.+ 5!
  6. 6. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 JDK 9 から変わる理由 Copyright©2017 NTT corp. All Rights Reserved.+ 6!
  7. 7. 歴史的経緯! • 元々は標準出力 • ファイルにも出力に対応 • タイムスタンプやより詳細な内 容を出力するように改修 • GCログ、JITコンパイルログな ど出力される内容(種類)も増加 バージョンを重ねるごとにアドホックに改善 Copyright©2017 NTT corp. All Rights Reserved.+ 7!
  8. 8. 問題点! • 出力内容に一貫性がない – コンポーネントごとにまちまち – メッセージも半固定で柔軟に実装 できない (OpenJDK 開発での問題) • 設定が多種多様過ぎる • レベルやカテゴリ制御がない アドホック過ぎて一貫性が失われた Copyright©2017 NTT corp. All Rights Reserved.+ 8!
  9. 9. 一貫性のない例! Copyright©2017 NTT corp. All Rights Reserved.+ 9! [GC [1 CMS-initial-mark: 2925342K(3853568K)] 2937899K(4160256K), 0.0098890 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [CMS-concurrent-mark-start] [CMS-concurrent-mark: 0.454/0.454 secs] [Times: user=1.38 sys=0.00, real=0.45 secs] [GC3.586: [ParNew (promotion failed): 232923K->283768K(306688K), 0.1500250 secs] 3.736: [CMS: 3102003K->240898K(3853568K), 1.8438740 secs] 3334926K->259898K(4160256K), [CMS Perm : 125100K- >115103K(262144K)], 1.9941370 secs] [Times: user=2.05 sys=0.00, real=1.99 secs] [Full GC62.696: [CMS64.460: [CMS-concurrent-sweep: 2.319/2.386 secs] [Times: user=3.75 sys=0.13, real=2.39 secs] (concurrent mode failure): 3315076K- JDK7uのログ+ マイナーアップデートで変わるのが一番辛い
  10. 10. 一貫性のない例! マイナーアップデートで変わるのが一番辛い Copyright©2017 NTT corp. All Rights Reserved.+ 10! [GC [1 CMS-initial-mark: 2925342K(3853568K)] 2937899K(4160256K), 0.0098890 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [CMS-concurrent-mark-start] [CMS-concurrent-mark: 0.454/0.454 secs] [Times: user=1.38 sys=0.00, real=0.45 secs] [GC3.586: [ParNew (promotion failed): 232923K->283768K(306688K), 0.1500250 secs] 3.736: [CMS: 3102003K->240898K(3853568K), 1.8438740 secs] 3334926K->259898K(4160256K), [CMS Perm : 125100K- >115103K(262144K)], 1.9941370 secs] [Times: user=2.05 sys=0.00, real=1.99 secs] [Full GC62.696: [CMS64.460: [CMS-concurrent-sweep: 2.319/2.386 secs] [Times: user=3.75 sys=0.13, real=2.39 secs] (concurrent mode failure): 3315076K- 唐突かつ特に 意味はない+ CMS-initial-mark-startは?+ 出ないケースがある(上のログもFull GC)+ フェーズごとに異なる値(size)+ JDK7uのログ+ フェーズごとに異なる値(time)+
  11. 11. 問題点! • 出力内容に一貫性がない – コンポーネントごとにまちまち • 設定が多種多様過ぎる – 実行後は変更ができない • レベルやカテゴリ制御がない 多種多様性が便利なのはその通り Copyright©2017 NTT corp. All Rights Reserved.+ 11!
  12. 12. PrintXX, TraceXX だけでも 66 種類ある(8u131) Copyright©2017 NTT corp. All Rights Reserved.+ 12! PrintAdaptiveSizePolicy+ PrintCMSInitiationStatistics+ PrintCMSStatistics+ PrintClassHistogram+ PrintClassHistogramAfterFullGC+ PrintClassHistogramBeforeFullGC+ PrintCodeCache+ PrintCodeCacheOnCompilation+ PrintCommandLineFlags+ PrintCompilation+ PrintConcurrentLocks+ PrintFLSCensus+ PrintFLSStatistics+ PrintGC+ PrintGCApplicationConcurrentTime+ PrintGCApplicationStoppedTime+ PrintGCCause+ PrintGCDateStamps+ PrintGCDetails+ PrintGCID+ PrintGCTaskTimeStamps+ PrintGCTimeStamps+ PrintHeapAtGC+ PrintHeapAtGCExtended+ PrintHeapAtSIGBREAK+ PrintJNIGCStalls+ PrintJNIResolving+ PrintOldPLAB+ PrintOopAddress+ PrintPLAB PrintPromotionFailure+ PrintReferenceGC+ PrintSafepointStatistics+ PrintSharedArchiveAndExit PrintSharedDictionary+ PrintSharedSpaces PrintTLAB+ PrintTenuringDistribution+ PrintTieredEvents+ PrintVMOptions+ PrintVMQWaitTime+ PrintWarnings+ TraceBiasedLocking+ TraceClassLoading+ TraceClassLoadingPreorder+ TraceClassPaths+ TraceClassResolution+ TraceClassUnloading TraceDynamicGCThreads+ TraceJVMTI+ PrintParallelOldGCPhaseTimes PrintStringDeduplicationStatistics+ PrintStringTableStatistics PrintSafepointStatisticsCount+ PrintSafepointStatisticsTimeout+ TraceGen0Time+ TraceGen1Time+ TraceLoaderConstraints+ TraceMetadataHumongousAllocation+ TraceMonitorInflation+ TraceParallelOldGCTasks+ TraceRedefineClasses+ TraceSafepointCleanupTime+ TraceSuspendWaitFailures+ 設定の多種多様さ(一部例)! ○:後から変えられない ので事前に把握が必要+ △:細やかな設定が可能+ ◎:無理ゲー+
  13. 13. 設定の多種多様さ! • GC ログの場合 – 全て別々の設定 ログローテートは GC ログにだけある Copyright©2017 NTT corp. All Rights Reserved.+ 13! -Xloggc:/path/to/gc_%p_%t.log #出力先 -XX:+PrintGCDetails #詳細出力 -XX:+PrintGCDateStamps #タイムスタンプ -XX:+UseGCLogFileRotation #ログローテート -XX:GCLogFileSize=100m #(〃)サイズ数 -XX:NumberOfGCLogFiles=7 #(〃)世代数 JDK8u131の設定+
  14. 14. 問題点! • 出力内容に一貫性がない – コンポーネントごとにまちまち • 設定が多種多様過ぎる – 実行後は変更ができない • レベルやカテゴリ管理がない – デバッグレベルはあるが別バイナリ デバッグ用バイナリは自分でビルドが必要 Copyright©2017 NTT corp. All Rights Reserved.+ 14!
  15. 15. カテゴリ管理がないと…! – 正確な理解には実装の確認が必要 – 複数種別のログが混ざると経験に 基づいて読み解く必要がある デバッグログはパーサーを書くのも大変 Copyright©2017 NTT corp. All Rights Reserved.+ 15! [GC3.586: [ParNew (promotion failed): 232923K->283768K(306688K), 0.1500250 secs] 3.736: [CMS: 3102003K->240898K(3853568K), 1.8438740 secs] 3334926K->259898K(4160256K), [CMS Perm : 125100K- >115103K(262144K)], 1.9941370 secs] [Times: user=2.05 sys=0.00, real=1.99 secs] JDK7uのログ+ それぞれ何の値か判断可能か?+
  16. 16. 問題点! • 出力内容に一貫性がない – コンポーネントごとにまちまち • 設定が多種多様過ぎる – 実行後は変更ができない • レベルやカテゴリ管理がない – デバッグレベルはあるが別バイナリ アドホックに追加するのはもうやめよう Copyright©2017 NTT corp. All Rights Reserved.+ 16!
  17. 17. Unified JVM Logging! • フレームワークを導入して一貫 性を保つ (JEP 158) – カテゴリ分け、ログレベルを導入 – 統一された実装・設定・出力 • 特に GC ログ周りを大幅に手入 れ (JEP 271) JEP 271 は Unified GC Logging Copyright©2017 NTT corp. All Rights Reserved.+ 17!
  18. 18. Quiz #1! • Java 8 以前のログ出力に関係す るフラグは -XX:+TraceXXX (17 種類) -XX:+PrintXXX(49種類)以 外にもある。マルかバツか。 マルバツクイズ Copyright©2017 NTT corp. All Rights Reserved.+ 18!
  19. 19. Quiz #1! • Java 8 以前のログ出力に関係す るフラグは -XX:+TraceXXX (17 種類) -XX:+PrintXXX(49種類)以 外にもある。マルかバツか。 • マル。例えば ParallelGCVerbose, ProfilerPrintByteCodeStatistics など マルバツクイズ Copyright©2017 NTT corp. All Rights Reserved.+ 19! ドキュメントもほぼない
  20. 20. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 統一された設定とやらを見せてもらおうか! Copyright©2017 NTT corp. All Rights Reserved.+ 20!
  21. 21. 設定方法! • シンプルな設定 – 全て -Xlog で設定する 「ログはこれ」と言えるのは大きい Copyright©2017 NTT corp. All Rights Reserved.+ 21! -Xlog  [:[what]  [:[output]  [:[decorators]  [:output-options]]]]
  22. 22. 基本的な設定方法! • -Xlog 全てのinfoログを標準出力 • -Xlog:help ヘルプメッセージ • -Xlog:disable ログ無効化+ デフォルトは全 warning ログが標準出力される Copyright©2017 NTT corp. All Rights Reserved.+ 22! -Xlogを設定してない場合+
  23. 23. ログ例! 全 info ログを有効にしてバージョン表示 Copyright©2017 NTT corp. All Rights Reserved.+ 23! % java -Xlog -version [0.003s][info][os] SafePoint Polling address: 0x00007f6d378bf000 [0.003s][info][os] Memory Serialize Page address: 0x00007f6d378be000 [0.003s][info][os,thread] Capturing initial stack in user thread: req. size: 1024K, actual size: 1024K, top=0x00007ffc84f89000, bottom=0x00007ffc84e89000 [0.003s][info][os ] HotSpot is running with glibc 2.24, NPTL 2.24 : [0.362s][info][startuptime ] Create VM, 0.3598174 secs java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+165) Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode) [0.364s][info][os,thread ] JavaThread detaching (tid: 110366). : [0.371s][info][os,thread ] Thread finished (tid: 110367, pthread id: 140272699377408). [0.371s][info][os,thread ] Thread finished (tid: 110376, pthread id: 140272177387264). ログ内容+
  24. 24. ログ例! デコレータ(decorator):各ログに付く汎用情報 Copyright©2017 NTT corp. All Rights Reserved.+ 24! % java -Xlog -version [0.003s][info][os] SafePoint Polling address: 0x00007f6d378bf000 [0.003s][info][os] Memory Serialize Page address: 0x00007f6d378be000 [0.003s][info][os,thread] Capturing initial stack in user thread: req. size: 1024K, actual size: 1024K, top=0x00007ffc84f89000, bottom=0x00007ffc84e89000 [0.003s][info][os ] HotSpot is running with glibc 2.24, NPTL 2.24 : [0.362s][info][startuptime ] Create VM, 0.3598174 secs java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+165) Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode) [0.364s][info][os,thread ] JavaThread detaching (tid: 110366). : [0.371s][info][os,thread ] Thread finished (tid: 110367, pthread id: 140272699377408). [0.371s][info][os,thread ] Thread finished (tid: 110376, pthread id: 140272177387264). 起動経過時間、 ログレベル、タグ (デフォルト)+ ログ内容+
  25. 25. ログ例! タグ(tags):各ログは必ず1~5個のタグに属する Copyright©2017 NTT corp. All Rights Reserved.+ 25! % java -Xlog -version [0.003s][info][os] SafePoint Polling address: 0x00007f6d378bf000 [0.003s][info][os] Memory Serialize Page address: 0x00007f6d378be000 [0.003s][info][os,thread] Capturing initial stack in user thread: req. size: 1024K, actual size: 1024K, top=0x00007ffc84f89000, bottom=0x00007ffc84e89000 [0.003s][info][os ] HotSpot is running with glibc 2.24, NPTL 2.24 : [0.362s][info][startuptime ] Create VM, 0.3598174 secs java version "9-ea" Java(TM) SE Runtime Environment (build 9-ea+165) Java HotSpot(TM) 64-Bit Server VM (build 9-ea+165, mixed mode) [0.364s][info][os,thread ] JavaThread detaching (tid: 110366). : [0.371s][info][os,thread ] Thread finished (tid: 110367, pthread id: 140272699377408). [0.371s][info][os,thread ] Thread finished (tid: 110376, pthread id: 140272177387264). 起動経過時間、 ログレベル、タグ (デフォルト)+ タグ≒ログのカテゴリ+ ログ内容+カテゴリに沿ったログ内容+
  26. 26. Quiz #2! •  java -Xlog:disable -version を実行 した場合、バージョン表示は出る? デフォルト(-Xlogの設定無し)は warning が有効 Copyright©2017 NTT corp. All Rights Reserved.+ 26! ログ無効+
  27. 27. Quiz #2! •  java -Xlog:disable -version を実行 した場合、バージョン表示は出る? •  出ます。バージョン関係はJVMログ とは別扱いのエラーメッセージです+ •  ログではなく java コマンドの応答だ と考えると解りやすい 前スライドで decorator が出てないのが解る Copyright©2017 NTT corp. All Rights Reserved.+ 27! ログ無効+
  28. 28. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 設定方法のポリシーを学びましょう Copyright©2017 NTT corp. All Rights Reserved.+ 28!
  29. 29. Syntax! – what:出力内容をタグとレベルで選択+ – output:出力先の指定+ – decorators:デコレータの指定+ – output-options:ログローテート設定 全て省略できる(未指定時用の値が設定される) Copyright©2017 NTT corp. All Rights Reserved.+ 29! -Xlog[:[what][:[output][:[decorators][:output-options]]]] -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  30. 30. decorator! • 各ログに追記される汎用情報+ – 未指定の場合: uptime, level, tags • 起動時間(秒)、ログレベル、タグ 出力順は固定 Copyright©2017 NTT corp. All Rights Reserved.+ 30! none, time (t), utctime (utc), timemillis (tm), timenanos (tn), uptime (u), uptimemillis (um), uptimenanos (un), hostname (hn), pid (p), tid (ti), level (l), tags (tg) -Xlog[:[what][:[output][:[decorators][:output-options]]]] 何もなし+
  31. 31. decorator! • 各ログに追記される汎用情報+ – 未指定の場合: uptime, level, tags • 起動時間(秒)、ログレベル、タグ 出力順は固定 Copyright©2017 NTT corp. All Rights Reserved.+ 31! none, time (t), utctime (utc), timemillis (tm), timenanos (tn), uptime (u), uptimemillis (um), uptimenanos (un), hostname (hn), pid (p), tid (ti), level (l), tags (tg) -Xlog[:[what][:[output][:[decorators][:output-options]]]] 時刻+ 起動時間+ 何もなし+
  32. 32. decorator! • 全部乗せ – 「,」で区切れば複数指定できる+ 指定の順番を変えても出力の順番はこの通り Copyright©2017 NTT corp. All Rights Reserved.+ 32! % java -Xlog:::t,utc,u,tm,um,tn,un,hn,p,ti,l,tg [2017-05-12T07:38:12.016-0700] [2017-05-12T14:38:12.016+0000] [14.101s] [1494599892016ms][14102ms] [963128253785077ns][14101433214ns] [localhost.localdomain][73398][115144] [info][os,thread ] Thread finished (tid: 115144, pthread id: 139879454586624). -Xlog[:[what][:[output][:[decorators][:output-options]]]] ※本来は一行表示+
  33. 33. decorator! • 全部乗せ – 「,」で区切れば複数指定できる+ pid はファイル名に付ければほぼ困らない Copyright©2017 NTT corp. All Rights Reserved.+ 33! % java -Xlog:::t,utc,u,tm,um,tn,un,hn,p,ti,l,tg [2017-05-12T07:38:12.016-0700] [2017-05-12T14:38:12.016+0000] [14.101s] [1494599892016ms][14102ms] [963128253785077ns][14101433214ns] [localhost.localdomain][73398][115144] [info][os,thread ] Thread finished (tid: 115144, pthread id: 139879454586624). -Xlog[:[what][:[output][:[decorators][:output-options]]]] process id と thread id は見分けにくい+ ※本来は一行表示+
  34. 34. decorator! • お勧めの最低設定 – (utc)time,level,tags – 短命なプロセスや詳細解析の場合は uptime(millis|nanos)もあると便利 ローカル時刻か UTC かはお好み Copyright©2017 NTT corp. All Rights Reserved.+ 34! % java -Xlog:::t,utc,l,tg [2017-05-12T07:38:12.016-0700] [2017-05-12T14:38:12.016+0000] [info][os,thread ] Thread finished (tid: 115144, pthread id: 139879454586624). -Xlog[:[what][:[output][:[decorators][:output-options]]]] ※本来は一行表示+
  35. 35. output, output-option! •  output: 出力先 (未指定時:stdout) – stdout / stderr / file=<filename> • %p: pid, %t: 開始時刻 (filenameで利用) •  output-option: ログローテート設定 – 「,」で区切って以下の二つを指定する – filecount=n: 世代数 (未指定時:5) – filesize=n: ファイルサイズ (未指定時:20M) ローテート設定は指定して増やした方が無難 Copyright©2017 NTT corp. All Rights Reserved.+ 35! -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  36. 36. what! • 出力内容をタグとレベルで指定 – Tag=Level • -Xlog:all=info • -Xlog:gc*=debug • Level (未指定の場合:info) trace は hotspot 内部実装を追ってる人向け Copyright©2017 NTT corp. All Rights Reserved.+ 36! off, trace, debug, info, warning, error -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  37. 37. what! • Tag (未指定の場合:all) 悪夢再び? Copyright©2017 NTT corp. All Rights Reserved.+ 37! add, age, alloc, aot, annotation, arguments, attach, barrier, biasedlocking, blocks, bot, breakpoint, census, class, classhisto, cleanup, compaction, constraints, constantpool, coops, cpu, cset, data, defaultmethods, dump, ergo, exceptions, exit, fingerprint, freelist, gc, hashtables, heap, humongous, ihop, iklass, init, itables, jni, jvmti, liveness, load, loader, logging, mark, marking, methodcomparator, metadata, metaspace, mmu, modules, monitorinflation, monitormismatch, nmethod, normalize, objecttagging, obsolete, oopmap, os, pagesize, patch, path, phases, plab, promotion, preorder, protectiondomain, ref, redefine, refine, region, remset, purge, resolve, safepoint, scavenge, scrub, stacktrace, stackwalk, start, startuptime, state, stats, stringdedup, stringtable, stackmap, subclass, survivor, sweep, task, thread, tlab, time, timer, update, unload, verification, verify, vmoperation, vtables, workgang, jfr, system, parser, bytecode, setting, event -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  38. 38. Tags! •  大分類から小分類まで混在して おり、全部を覚える必要はない+ •  重要なタグの例+ – GC 関連:gc – エラー関連:exceptions – スレッド関連:os, thread – 動作解析関連:class, vmoperation 実質二つのログしかないタグもある Copyright©2017 NTT corp. All Rights Reserved.+ 38! -Xlog[:[what][:[output][:[decorators][:output-options]]]]
  39. 39. タグの設定方法! タグは * + , を利用して柔軟に指定できる Copyright©2017 NTT corp. All Rights Reserved.+ 39! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T1+ T2+ all で 全部+
  40. 40. タグの設定方法! Copyright©2017 NTT corp. All Rights Reserved.+ 40! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+ T1だけ。1タグのログは主にサマリ確認用 T2+ TX+
  41. 41. タグの設定方法! T1関係全て。gc* 等、その機能全体の監視時に Copyright©2017 NTT corp. All Rights Reserved.+ 41! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+ TX+ T2+
  42. 42. タグの設定方法! この組合せのみ。別出力とか制限付けたい時に Copyright©2017 NTT corp. All Rights Reserved.+ 42! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T1+ T2+
  43. 43. タグの設定方法! T1とT2が含まれる全てのログ。 Copyright©2017 NTT corp. All Rights Reserved.+ 43! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T1+ T2+
  44. 44. タグの設定方法! T1+T2* ≒ (T1+T2)* Copyright©2017 NTT corp. All Rights Reserved.+ 44! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T1+ T2+ これは NG+
  45. 45. タグの設定方法! T1とT2に関連するもの全部。大分類二つとか Copyright©2017 NTT corp. All Rights Reserved.+ 45! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+ T2+ TX+ これは NG+
  46. 46. T1+ タグの設定方法! T1関連は出しつつ、T2関連は秘密にする Copyright©2017 NTT corp. All Rights Reserved.+ 46! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog:T1 •  -Xlog:T1* •  -Xlog:T1+T2 •  -Xlog:T1+T2* •  -Xlog:T1*+T2* •  -Xlog:T1*,T2* •  -Xlog:T1*,T2*=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX TX+ T2+ これは NG+
  47. 47. タグの設定方法! これはどうなるか? Copyright©2017 NTT corp. All Rights Reserved.+ 47! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T2+T1+ TX+
  48. 48. タグの設定方法! T1 関連ログを全てdebugログ出力 Copyright©2017 NTT corp. All Rights Reserved.+ 48! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+T1+ TX+ T2+
  49. 49. T1+ タグの設定方法! T1とT2の組合せに限ったログ Copyright©2017 NTT corp. All Rights Reserved.+ 49! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+T1+ TX+ T1+ T2+
  50. 50. T1+ タグの設定方法! は、出力しない Copyright©2017 NTT corp. All Rights Reserved.+ 50! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T1+T1+ TX+ T1+ T2+
  51. 51. T1+ タグの設定方法! 最終的に橙色部分が debug レベルで出力 Copyright©2017 NTT corp. All Rights Reserved.+ 51! -Xlog[:[what][:[output][:[decorators][:output-options]]]] •  -Xlog: T1*=debug,T1+T2=off T1+T1+ TX+ T1+ [T1 ] XXX [T2 ] XXX [TX ] XXX [T1,T2 ] XXX [T1,TX ] XXX [T2,TX ] XXX [T1,T2,TX] XXX T2+
  52. 52. 具体的な使い道の例! -Xlog:gc •  GC結果の概要だけ確認 -Xlog:class+load=debug,class+unload=debug •  クラスローディングとアンローディングの確認 -Xlog:gc*=debug,vmoperation=debug •  GC挙動全体の詳細とSTWに関わる処理の確認 -Xlog:gc*=debug,gc+humongous=off •  詳細確認したいがhumongousリージョン関連GCの場合、 本リージョンのメモリマップ情報が大量に出力されるの でオフにする (,で付け足して他もオフにできる) Copyright©2017 NTT corp. All Rights Reserved.+ 52! -Xlog[:[what][:[output][:[decorators][:output-options]]]] フラグを調べるより直感的 TraceClassLoaderDataは class+loader+data=debug+
  53. 53. Quiz #3! •  java -Xlog:disable –Xlog:gc* とした 場合はどうなるか? 最初のみ有効 or 最後のみ有効 or それ以外? Copyright©2017 NTT corp. All Rights Reserved.+ 53!
  54. 54. Quiz #3! •  java -Xlog:disable –Xlog:gc* とした 場合はどうなるか? •  前から順番に全て評価する。全部無 効にした後に、GC関係のinfoログを 有効にするので –Xlog:gc* と同義+ •  順番に評価されるので、最後の設定 のみ有効になるわけではない 別々のファイルに出力したい時などで使えます Copyright©2017 NTT corp. All Rights Reserved.+ 54!
  55. 55. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行 • お役立ち(?)情報 これまでの設定からこれからの設定へ Copyright©2017 NTT corp. All Rights Reserved.+ 55!
  56. 56. Java 8からのGCログ移行! •  Java 8 •  Java 9 以前より詳細になるが後でフィルタすれば良い Copyright©2017 NTT corp. All Rights Reserved.+ 56! -Xloggc:/path/to/gc_%p_%t.log #出力先 -XX:+PrintGCDetails #詳細出力 -XX:+PrintGCDateStamps #タイムスタンプ -XX:+UseGCLogFileRotation #ログローテート -XX:GCLogFileSize=100m #(〃)サイズ数 -XX:NumberOfGCLogFiles=7 #(〃)世代数 -Xlog:gc*=debug:/path/to/gc_%p_%t.log:time, level,tags:filesize=100m, filecount=7 ※ログサイズ等は適当です(普通は足りない)+
  57. 57. Next! • そもそもなぜ変わるのか • 設定方法を把握する – 概要 – ログの設定方法 – Java 8 設定からの移行+ • お役立ち(?)情報 今回の変更により便利になったところなど Copyright©2017 NTT corp. All Rights Reserved.+ 57!
  58. 58. 起動後もログ設定が可能! • jcmd で起動後から変えられる 無効化は jcmd VM.log disable を実行 Copyright©2017 NTT corp. All Rights Reserved.+ 58! $ jcmd <pid> VM.log output="file=/path/to/gc_%p_%t.log" output_options="filecount=7,filesize=200m" what="gc*=debug" decorators="time,level,tags" <pid>: Command executed successfully $ jcmd <pid> VM.log list <pid>: : Log output configuration: #0: stdout all=warning uptime,level,tags #1: stderr all=off uptime,level,tags #2: file=/path/to/gc_%p_%t.log gc*=debug time,level,tags+ -Xlog の設定 方法と一緒+ output=#2 を指定 すると上書き可能+
  59. 59. 強制ログローテート! • jcmd で手動ローテートが可能 – ファイル出力かつfilecount=1以上 が条件 – filesize=0 にして cron 等で実行す れば定期的なローテートが可能 filecount=0 だと実行しても同じファイルに追記 Copyright©2017 NTT corp. All Rights Reserved.+ 59! $ jcmd <pid> VM.log rotate <pid>: Command executed successfully
  60. 60. ログローテート! •  -Xlog::test.log::filecount=n 先ずは指定したファイルに出力 Copyright©2017 NTT corp. All Rights Reserved.+ 60! test.log+
  61. 61. ログローテート! •  -Xlog::test.log::filecount=n ローテート 1 回目 Copyright©2017 NTT corp. All Rights Reserved.+ 61! test.log+ test.log.0+ ←移動したら空ファイル+
  62. 62. ログローテート! •  -Xlog::test.log::filecount=n ローテート 2 回目 Copyright©2017 NTT corp. All Rights Reserved.+ 62! test.log+ test.log.0+ test.log.1+
  63. 63. ログローテート! •  -Xlog::test.log::filecount=n ローテート n 回目 Copyright©2017 NTT corp. All Rights Reserved.+ 63! test.log+ test.log.0+ test.log.1+ test.log.(n-1)+…+
  64. 64. ログローテート! •  -Xlog::test.log::filecount=n ローテート n+1 回目 Copyright©2017 NTT corp. All Rights Reserved.+ 64! test.log+ test.log.0+ test.log.1+ test.log.(n-1)+…+test.log.0 上書き+
  65. 65. ログローテート! •  -Xlog::test.log::filecount=n filecount は残したい世代分設定しましょう Copyright©2017 NTT corp. All Rights Reserved.+ 65! test.log+ test.log.0+ test.log.1+ test.log.(n-1)+…+test.log.0 上書き+ test.log.1 上書き+ test.log.(n-1) 上書き+
  66. 66. GCの要確認ログの移行状況! •  Full GC 起因となるイベント – Evacuation Failure (G1 GC) – promotion failed (CMS GC) – Concurrent mode failure (CMS GC) CMS GC は JDK 9 から非推奨化 Copyright©2017 NTT corp. All Rights Reserved.+ 66! [info][gc] GC(N) To-space exhausted [info][gc, promotion] GC(N) Promotion failed [debug][gc] GC(N) Concurrent mode failure ナンバリング(発生回数)+
  67. 67. GCの要確認ログの移行状況! •  Stop The World を伴う GC 処理 Pause が付く Copyright©2017 NTT corp. All Rights Reserved.+ 67! [info][gc] GC(N) Pause <種別> (<GC Cause>) [info][gc] GC(1) Pause Young (Allocation Failure) [info][gc] GC(2) Pause Full (Allocation Failure) # G1 GC [info][gc] GC(3) Pause Initial Mark (G1 Evacuation Pause) [info][gc] GC(3) Pause Remark [info][gc] GC(3) Pause Cleanup # CMS GC [info][gc] GC(4) Pause Initial Mark [info][gc] GC(4) Pause Remark
  68. 68. STW の確認方法! -Xlog:gc*=debug,vmoperation=debug Copyright©2017 NTT corp. All Rights Reserved.+ 68! [debug][vmoperation] begin VM_Operation (0x0000700001c2e1c8): G1IncCollectionPause, mode: safepoint, requested by thread 0x00007fb6818df800 [info ][gc,start ] GC(6) Pause Initial Mark (G1 Evacuation Pause) :(Initial Mark の処理) [info ][gc ] GC(6) Pause Initial Mark (G1 Evacuation Pause) 114M->82M(256M) 2.598ms [info ][gc,cpu ] GC(6) User=0.00s Sys=0.00s Real=0.01s [debug][vmoperation] end VM_Operation (0x0000700001c2e1c8): G1IncCollectionPause, mode: safepoint, requested by thread 0x00007fb6818df800 G1 GC の Initial Mark フェーズの例 (抜粋)+ STW 時間+ CPU 時間+
  69. 69. GC 以外の STW 確認方法! •  VM_Operation で実行される – タイムスタンプの差分(今回は0.02sec) でSTW時間が解る タイムスタンプの分解能以上は不可なので注意 Copyright©2017 NTT corp. All Rights Reserved.+ 69! [2017-05-17T23:38:35.277-0900][debug][vmoperation] begin VM_Operation (0x0000700001c2e1c8): Deoptmize, mode: safepoint, requested by thread 0x00007fb6818df800 :STW を伴う処理 [2017-05-12T23:38:35.279-0900][debug][vmoperation] end VM_Operation (0x0000700001c2e1c8): Deoptmize, mode: safepoint, requested by thread 0x00007fb6818df800 対応している+
  70. 70. ヒープ状況の確認! •  ヒープ全体の使用量と容量 – 各 GC 方式で共通の表示 • Pause 処理終了時にヒープ全体量出力 領域ごとは出ないが概要は掴める Copyright©2017 NTT corp. All Rights Reserved.+ 70! [info ][gc] GC(6) Pause Initial Mark (G1 Evacuation Pause) 114M->82M(256M) 2.598ms 処理前の 使用量+ 処理後の 使用量+ 容量+
  71. 71. ヒープ状況の確認(G1)! •  各領域のヒープ状況 – GC 方式ごとに異なる G1 GC の各領域毎のメモリ状況 Copyright©2017 NTT corp. All Rights Reserved.+ 71! E+ O S+ O O S+ S+ E+ H O E+ O O E+ S+ O O O O H+ O E+ E+ O 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用+
  72. 72. ヒープ状況の確認(G1)! •  各領域のヒープ状況(info) 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用 info ログは単位がリージョン数で出力される Copyright©2017 NTT corp. All Rights Reserved.+ 72! [info][gc,heap ] Heap region size: 1M ------------------------------------------------------------------------------------------------------------------ :GC処理 [info][gc,heap ] GC(8) Eden regions: 1->0(68) [info][gc,heap ] GC(8) Survivor regions: 3->4(9) [info][gc,heap ] GC(8) Old regions: 8->8 [info][gc,heap ] GC(8) Humongous regions: 106->94 [info][gc,metaspace] GC(8) Metaspace: 6823K->6823K(1056768K) :debug ログ [info][gc ] GC(8) Pause Initial Mark (G1 Evacuation Pause) 116M->105M(308M) 3.401ms リージョンサ イズが異なる+ 掛算してサイズ計算+ Humongousはここから引き算して概算+
  73. 73. ヒープ状況の確認(G1)! •  各領域のヒープ状況(debug)+ 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用+ Humongous は? Copyright©2017 NTT corp. All Rights Reserved.+ 73! [debug][gc,heap ] GC(8) Heap after GC invocations=13 (full 0): [debug][gc,heap ] GC(8) garbage-first heap total 315392K, used 107536K [0x00000006c0000000, 0x00000006c01009a0, 0x00000007c0000000) [debug][gc,heap ] GC(8) region size 1024K, 4 young (4096K), 4 survivors (4096K) [debug][gc,heap ] GC(8) Metaspace used 6823K, capacity 6906K, committed 7040K, reserved 1056768K [debug][gc,heap ] GC(8) class space used 612K, capacity 637K, committed 640K, reserved 1048576K リージョン数+ Eden+Survivor+ サイズ+
  74. 74. ヒープ状況の確認(G1)! •  各領域のヒープ状況(debug)+ 水:Eden 橙:Survivor 緑:Old 紫:Humongous 藍:未使用+ Live なものを心を籠めて全部足し算 Copyright©2017 NTT corp. All Rights Reserved.+ 74! [debug][gc,humongous] GC(8) Live humongous region 0 object size 1228816 start 0x00000006c0000000 with remset 1 code roots 0 is marked 0 reclaim candidate 1 type array 1 : [debug][gc,humongous] GC(8) Live humongous region 106 object size 1884176 start 0x00000006c6a00000 with remset 0 code roots 0 is marked 0 reclaim candidate 0 type array 1 [debug][gc,humongous] GC(8) Live humongous region 112 object size 860176 start 0x00000006c7000000 with remset 1 code roots 0 is marked 0 reclaim candidate 1 type array 1
  75. 75. ULViewer! • 次世代 GC Viewer – https://github.com/YaSuenag/ulviewer タグでフィルタリング可、GC 以外も可視化 Copyright©2017 NTT corp. All Rights Reserved.+ 75!
  76. 76. まとめ! • Java 9 からログが統一される 設定や出力が一新されて管理が楽に -Xlog:何を:どこに:装飾:ローテート • どの様に設定していくべきか? -Xlog:all=debug から始めてフィル タリングしていくのがお勧め まずはログを読むのを楽しみましょう! Copyright©2017 NTT corp. All Rights Reserved.+ 76!
  77. 77. Q! Copyright©2017 NTT corp. All Rights Reserved.+ 77! おつかれさまでした

×