SlideShare a Scribd company logo
©2023 NTT DATA Corporation
GraalVMでのFlight Recorderを使ったパフォーマンス解析
2023年6月4日
株式会社NTTデータ テレコム・ユーティリティ事業本部
古賀和久
2
©2023 NTT DATA Corporation
はじめに
3
©2023 NTT DATA Corporation
自己紹介
 株式会社 NTTデータ 所属
古賀 和久
 好きなこと
 バーベキュー
 川遊び
 ソースコードを読むこと
 普段の仕事
 通信業界のシステム開発(C/C++メイン)
 ITアーキテクト
4
©2023 NTT DATA Corporation
本日の内容
5
©2023 NTT DATA Corporation
このセッション内容
Javaの
アプリケーション
JDK Mission Control
FlightRecord
ファイル
Native化した
アプリケーション
FlightRecord
ファイル
同じように解析できるのか?
JDK Mission Control
6
©2023 NTT DATA Corporation
検証内容
# JDK公式ドキュメント 検証ケース
1
ガベージ・コレクション
のパフォーマンス
2 同期(ロック競合)
3 IOパフォーマンス
4 コード実行パフォーマンス
実際の運用でよくあるだろうケースを想定
※検証目的に特化した単純なコードで実施(実サービスのものではありません)
無駄なオブジェクトで徐々にヒープを圧迫
GCが原因で性能劣化
マルチスレッド処理で排他制御がボトルネックになる
File/NWなど外部資源とのIOがボトルネックになる
アルゴリズムの選択ミスなどによって
特定のメソッドがボトルネックになる
7
©2023 NTT DATA Corporation
■発表を聞いて得られること
- どこまで組み込みイベントで解析できるようになっているか
- 今はまだ何ができないか
■発表を聞いても得られないこと
- ユーザ独自のEventを実装してチューニングする方法
GraalVMの公式ドキュメントに
載っています
8
©2023 NTT DATA Corporation
本セッションで話さないこと
• そもそもGraalVMとは
• GraalVMのNative化とは
• Native化の仕方
• FlightRecordの取得方法
→OCHaCafe6 #2 GraalVM 最新事情
わかりやすいです
9
©2023 NTT DATA Corporation
検証環境
Windows11 x64
Core(TM) i5-11400H / RAM32GB
WSL2
Ubuntu 20.04.5 LTS
GraalVM CE
java11-22.3.0
検証用アプリケーション
(Java版)
ケースごとに実装
検証用アプリケーション
(Native版)
GraalVMの
native-imageコマンドで
変換
10
©2023 NTT DATA Corporation
検証結果サマリ
# JDK公式ドキュメント 検証ケース
1
ガベージ・コレクション
のパフォーマンス
2 同期(ロック競合)
3 IOパフォーマンス
4 コード実行パフォーマンス
無駄なオブジェクトで徐々にヒープサイズを圧迫
GCが原因で性能劣化
マルチスレッド処理で排他制御がボトルネックになる
File/NWなど外部資源とのIOボトルネックになる
アルゴリズムの選択ミスによって、
特定のメソッドがボトルネックになる
11
©2023 NTT DATA Corporation
ケースごとの説明の流れ
• 検証アプリケーションの概要
• Javaでの実行例
• Native化したアプリでの結果
• 原因調査/代替手段など
12
©2023 NTT DATA Corporation
検証(1/4) ガベージ・コレクションのパフォーマンス
13
©2023 NTT DATA Corporation
ガベージ・コレクションのパフォーマンス(1/8)
検証アプリケーション
• 解放されないオブジェクトを徐々に増加
※ループ内で100Byteのオブジェクトをリストに追加
• GCのアルゴリズムは”Serial GC※”
※GraalVM CE版ではSerial GCしか使えないので条件を合わせるため
14
©2023 NTT DATA Corporation
Javaでの実行結果
15
©2023 NTT DATA Corporation
ガベージ・コレクションのパフォーマンス(2/8)
自動分析レポート(Javaの場合)
最長休止時間
アプリケーション実行時間に対する
休止時間の比率
GCで止まっている時間が
自動分析レポートで分析されている
16
©2023 NTT DATA Corporation
ガベージ・コレクションのパフォーマンス(3/8)
ガベージコレクションページ(Javaの場合)
ヒープ使用状況の
グラフ
GCイベントごとの
詳細情報
停止時間の
グラフ
17
©2023 NTT DATA Corporation
Native化したアプリでの結果
18
©2023 NTT DATA Corporation
ガベージ・コレクションのパフォーマンス(4/8)
自動分析レポート(Native化したアプリケーションの場合)
アプリケーション実行時間
に対する休止時間の比率
最長休止時間
GCで止まっている時間が
Javaと同じように分析されました
19
©2023 NTT DATA Corporation
ガベージ・コレクションのパフォーマンス(5/8)
ガベージコレクションページ(Native化したアプリケーションの場合)
ヒープの使用状況の
グラフは確認できない
GCイベントの情報
停止時間のグラフ
停止時間のグラフは
同様に見れる
20
©2023 NTT DATA Corporation
なぜグラフが出ないのか?
21
©2023 NTT DATA Corporation
Q. そもそも何をもとに
グラフは出ているのか
22
©2023 NTT DATA Corporation
A. 「jdk.GCHeapSummary」
23
©2023 NTT DATA Corporation
jdk.GCHeapSummary {
startTime = 22:03:30.764
gcId = 11
when = "Before GC"
heapSpace = {
start = 0xE7000000
committedEnd = 0xFF2B0000
committedSize = 386.7 MB
reservedEnd = 0x100000000
reservedSize = 400.0 MB
}
heapUsed = 294.2 MB
}
jdk.GCHeapSummary {
startTime = 22:03:30.776
gcId = 11
when = "After GC"
heapSpace = {
start = 0xE7000000
committedEnd = 0xFF2B0000
committedSize = 386.7 MB
reservedEnd = 0x100000000
reservedSize = 400.0 MB
}
heapUsed = 65.5 MB
}
ガベージ・コレクションのパフォーマンス(6/8)
Javaのヒープグラフ
実際のグラフとの対応です
24
©2023 NTT DATA Corporation
ガベージ・コレクションのパフォーマンス(7/8)
Native化したアプリケーションでヒープのグラフが出ない原因
jfr コマンドで確認したイベントの集計結果
該当イベントが出力されていない。
https://github.com/oracle/graal/issues/5410
GraalVMのイベント対応状況のIssue抜粋
そもそも実装されていない
25
©2023 NTT DATA Corporation
代替手段は?
GC Logで代替可能
26
©2023 NTT DATA Corporation
GC Logのサンプル
[
[36555093917095 GC: before epoch: 7 cause: CollectOnAllocation]
[Full GC (CollectOnAllocation) 222900K->20067K, 0.0056789 secs]
[36555099612242 GC: after epoch: 7 cause: CollectOnAllocation policy: adaptive type: complete collection time: 5678909 nanoSeconds]
]
[
[36555359491355 GC: before epoch: 8 cause: CollectOnAllocation]
[Incremental GC (CollectOnAllocation) 123681K->122657K, 0.0002136 secs]
[36555359717573 GC: after epoch: 8 cause: CollectOnAllocation policy: adaptive type: incremental collection time: 213647 nanoSeconds]
]
GCのタイプ(実施理由) GC前のヒープ、GC後のヒープ、休止時間
27
©2023 NTT DATA Corporation
ガベージ・コレクションのパフォーマンス(8/8)
考察
# ページ 差異 運用
1
レポート
ページ
チューニング要否はJMCを利用できる。
(休止時間については分析されるため)
2
ガベージコ
レクション
のページ
ヒープサイズの使用状況の分析は
当面はGCログで分析する必要あり。
ヒープグラフが出ない
チューニング要否の判断(休止時間の分析)はJMCでもできる。
28
©2023 NTT DATA Corporation
検証(2/4) ロックに関する分析
29
©2023 NTT DATA Corporation
ロックに関する分析(1/8)
■検証アプリケーション
• マルチスレッド(3つ)
• Counter(共有オブジェクト)を排他取得
• ロック時間は長め
■期待
競合状況や競合原因などを見られること
検証アプリケーション
30
©2023 NTT DATA Corporation
Javaでの実行結果
31
©2023 NTT DATA Corporation
ロックに関する分析(2/8)
自動分析レポート(Javaの場合)
ブロッキングの発生状況が分析結果として出てきています
32
©2023 NTT DATA Corporation
ロックに関する分析(3/8)
スレッドの情報(Javaの場合)
凡例
アクティブ
非アクティブ
ロック開放待ちで順次スレッドが実行されている
※下図は説明用に該当する子スレッド以外はグレーアウト表示に加工しています
33
©2023 NTT DATA Corporation
ロックに関する分析(4/8)
ロックインスタンスの詳細ビュー(Javaの場合)
競合原因やスレッドごとのブロック時間を見ることができる
競合が発生した原因
スレッドごとのブロック時間
34
©2023 NTT DATA Corporation
Native化したアプリでの結果
35
©2023 NTT DATA Corporation
ロックに関する分析(5/8)
自動分析の結果(Nativeでの場合)
Javaと同様にブロッキング発生をレポートされる
36
©2023 NTT DATA Corporation
ロックに関する分析(6/8)
スレッドのページ(Native化したアプリでの実行例)
凡例
アクティブ
非アクティブ
Javaと同様にスレッドの競合状況をグラフで確認できる
※下図は説明用に該当する子スレッド以外はグレーアウト表示に加工している
37
©2023 NTT DATA Corporation
ロックに関する分析(7/8)
ロックインスタンスのページ(Native化したアプリケーションでの例)
Javaと同様に競合原因やブロック時間を見ることができる
競合が発生した原因
スレッドごとのブロック時間
38
©2023 NTT DATA Corporation
ロックに関する分析のまとめ
39
©2023 NTT DATA Corporation
ロックに関する分析(8/8)
考察
# ページ 差異 結果
1
レポート
ページ
レポートでチェックポイントとして報告される
2
スレッドの
詳細分析
ビュー
スレッド情報を可視化して確認できる
3
ロックイン
スタンスの
詳細ビュー
原因となったクラスの情報
スレッドごとのブロック時間の集計結果
を見ることできた
Javaと同様のレベルで解析可能
40
©2023 NTT DATA Corporation
検証(3/4) IOパフォーマンス
41
©2023 NTT DATA Corporation
IOパフォーマンス
調査結果
• GraalVMの22.03ではイベント※出力未実装
jdk.FileRead、jdk.FileWrite、jdk.SocketRead、jdk.SocketWrite
• PullRequestが出ていたがマージされていない。
https://github.com/oracle/graal/pull/5497
42
©2023 NTT DATA Corporation
検証(4/4) コード実行パフォーマンス
43
©2023 NTT DATA Corporation
コード実行パフォーマンス(1/10)
■検証アプリケーション
bubble_sort メソッドが処理時間の大半を占めるように実行
■期待
bubble_sort メソッドが改善対象としてレポートされること
検証アプリケーション
44
©2023 NTT DATA Corporation
Javaでの実行結果
45
©2023 NTT DATA Corporation
コード実行パフォーマンス(2/10)
自動分析の結果(Javaの場合)
bubble_sort が実行時間の大半を占めることがレポートされた
46
©2023 NTT DATA Corporation
コード実行パフォーマンス(3/10)
メソッド・プロファイリング(Javaの場合)
対象メソッドやスタックトレースの情報を確認できる
47
©2023 NTT DATA Corporation
Native化したアプリでの結果
48
©2023 NTT DATA Corporation
コード実行パフォーマンス(4/10)
自動分析の結果(Nativeの場合)
Nativeの場合はbubble_sort が改善対象として出てこなかった
49
©2023 NTT DATA Corporation
コード実行パフォーマンス(5/10)
メソッド・プロファイリング(Nativeでの例)
Nativeの実行例では何の情報も出ていない
50
©2023 NTT DATA Corporation
出力されない原因を調べてみた
51
©2023 NTT DATA Corporation
コード実行パフォーマンス(6/10)
Javaでの実行例から、何のイベントを元にしているかを調べてみた
jdk.ExecutionSampleが出力されていないから
$jfr print --events jdk.ExecutionSample app-startup.jfr で見た例
jdk.ExecutionSample {
startTime = 22:17:35.853
sampledThread = "main" (javaThreadId = 1)
state = "STATE_RUNNABLE"
stackTrace = [
com.example.App.bubble_sort(int[]) line: 14
com.example.App.main(String[]) line: 50
]
}
■Javaでの実行例
52
©2023 NTT DATA Corporation
コード実行パフォーマンス(7/10)
Nativeでメソッドプロファイリングに引っかからない原因
3つ目のケースと違ってイベント出力は実装されていた
jfr コマンドで確認したイベントの集計結果(抜粋)
$ jfr summary native-start.jfr
Version: 2.0
Chunks: 1
Start: 2023-02-16 13:18:33 (UTC)
Duration: 126 s
Event Type CountSize (bytes)
========================================
jdk.JavaMonitorWait 6407171229
:
jdk.ExecutionSample 0 0
jdk.NativeMethodSample 0 0
:
該当イベントが出力されていない。
実際に、関連するPull-Requestはmergeされていことも確認済み
https://github.com/oracle/graal/pull/4005
※https://github.com/oracle/graal/issues/5410
GraalVMのイベント対応状況のIssue※抜粋
実装済みにはなっている
53
©2023 NTT DATA Corporation
追加検証
23年3月のGraalVMのmasterで実施
※JDKは17になっています
54
©2023 NTT DATA Corporation
コード実行パフォーマンス(8/10)
自動分析の結果(追加検証)
レポートは出るがメソッド名が異なる
期待 bubble_sort
結果 invokeCallback
55
©2023 NTT DATA Corporation
コード実行パフォーマンス(9/10)
メソッド・プロファイリング(追加検証)
レポートに表示されたメソッド名と同様に期待値と異なる
invokeCallback
56
©2023 NTT DATA Corporation
コード実行パフォーマンス(10/10)
考察
何かしらの不具合があるようだが、
現時点では不明
JavaでチューニングしてからNative化
57
©2023 NTT DATA Corporation
まとめ
58
©2023 NTT DATA Corporation
検証結果サマリ -再掲-
対応状況はケースによってまちまちだった
# JDK公式ドキュメント 検証ケース
1
ガベージ・コレクション
のパフォーマンス
2 同期(ロック競合)
3 IOパフォーマンス
4 コード実行パフォーマンス
無駄なオブジェクトで徐々にヒープサイズを圧迫
マルチスレッドで実行していて、
排他制御箇所がボトルネックになっている
File/NWなど外部資源とのIOボトルネックで
性能が出ない
アルゴリズムの選択ミスによって、
特定のメソッドがボトルネックになっている
59
©2023 NTT DATA Corporation
まちまち 悪いこと
60
©2023 NTT DATA Corporation
イベント出力対象が増えれば
Javaの解析手法を活用できる
61
©2023 NTT DATA Corporation
拡充に期待!!
62
©2023 NTT DATA Corporation
JJUG発表後 追加スライド
63
©2023 NTT DATA Corporation
jdk.GCHeapSummaryの出力機能の拡張について
https://github.com/oracle/graal/pull/6466
こんな感じで見れるようになります!
(Serial GC限定です)
提出したPull-Requestが採用されました!
64
©2023 NTT DATA Corporation
参考資料
65
©2023 NTT DATA Corporation
参考資料
# タイトル 記載者 概要 URL
1 OpenJDK での JDK Flight Recorder の使用 Redhat(公式) Flight RecorderやJMCの使い方の概要など
https://access.redhat.com/documentation/
ja-jp/openjdk/11/html/using_jdk_flight_rec
order_with_openjdk/index
2 JFR Events SAP(公式) JDKバージョンごとの取得可能なイベントの一覧(サンプル付き)
https://sap.github.io/SapMachine/jfre
vents/
3 JDK Flight Recorder Javaコミュニティ
Flight Recorder関連のアーキテクチャや、トラブルシュートの例な
ど
https://foojay.io/today/category/tools
/jdk-flight-recorder/
4 OpenJDK(GitHub) OpenJDK(公式) JDKのソースコード https://github.com/openjdk/jdk
5
GraalVM(ドキュメント) Oracle(公式)
GraalVMの公式サイト https://www.graalvm.org/
6
Flight Recorderを有効にしてビルドする方法などが記載されてい
ます
https://www.graalvm.org/latest/refer
ence-manual/native-image/debugging
-and-diagnostics/JFR/
7 ユーザ独自のイベントを発行して記録する方法
https://www.graalvm.org/latest/refer
ence-manual/native-image/guides/bui
ld-and-run-native-executable-with-jfr/
8
GraalVM(GitHub) Oracle(公式)
トップページ https://github.com/oracle/graal/
9 JFRに関するディスカッション
https://github.com/oracle/graal/discussion
s?discussions_q=jfr
10 Native-Imageの変更履歴
https://github.com/oracle/graal/blob/
master/substratevm/CHANGELOG.md
11 Flight RecorderのEvent対応状況
https://github.com/oracle/graal/issue
s/5410
12 GraalVM 最新事情
Oracle Cloud
Hang out Cafe
GraalVMとは?やNativeimgeコマンドとは?といった概要を知り
たい場合はこちらから読まれるとわかりやすいと思います。
https://ochacafe.connpass.com/event
/259128/presentation/
66
©2023 NTT DATA Corporation
本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。
©2023 NTT DATA Corporation

More Related Content

PDF
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PDF
Unified JVM Logging
PDF
DockerとPodmanの比較
PDF
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PPTX
本当は恐ろしい分散システムの話
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
Unified JVM Logging
DockerとPodmanの比較
PostgreSQL13でのレプリケーション関連の改善について(第14回PostgreSQLアンカンファレンス@オンライン)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
本当は恐ろしい分散システムの話
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する

What's hot (20)

PDF
マルチテナント化で知っておきたいデータベースのこと
PPTX
世界一わかりやすいClean Architecture
PDF
アーキテクチャから理解するPostgreSQLのレプリケーション
PDF
Docker Compose 徹底解説
PDF
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
PDF
マルチテナントのアプリケーション実装〜実践編〜
PPTX
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PDF
AlmaLinux と Rocky Linux の誕生経緯&比較
PDF
[GKE & Spanner 勉強会] GKE 入門
PDF
Dockerからcontainerdへの移行
PDF
Linux女子部 systemd徹底入門
PPTX
Redisの特徴と活用方法について
PDF
コンテナにおけるパフォーマンス調査でハマった話
PPTX
MongoDBが遅いときの切り分け方法
PPTX
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
PPTX
ゲームエンジニアのためのデータベース設計
PPTX
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PDF
ソーシャルゲームのためのデータベース設計
マルチテナント化で知っておきたいデータベースのこと
世界一わかりやすいClean Architecture
アーキテクチャから理解するPostgreSQLのレプリケーション
Docker Compose 徹底解説
YugabyteDBを使ってみよう(NewSQL/分散SQLデータベースよろず勉強会 #1 発表資料)
マルチテナントのアプリケーション実装〜実践編〜
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
AlmaLinux と Rocky Linux の誕生経緯&比較
[GKE & Spanner 勉強会] GKE 入門
Dockerからcontainerdへの移行
Linux女子部 systemd徹底入門
Redisの特徴と活用方法について
コンテナにおけるパフォーマンス調査でハマった話
MongoDBが遅いときの切り分け方法
え、まって。その並列分散処理、Kafkaのしくみでもできるの? Apache Kafkaの機能を利用した大規模ストリームデータの並列分散処理
ゲームエンジニアのためのデータベース設計
PostgreSQLのロール管理とその注意点(Open Source Conference 2022 Online/Osaka 発表資料)
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
ソーシャルゲームのためのデータベース設計
Ad

Similar to GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring) (16)

PDF
Java Flight Recorderの紹介 at Java Day Tokyo 2015
PDF
Oracle code one 2018 報告会概要
PDF
テスト駆動開発の進化
PDF
GCをみればRTSが見えてくる、かも。。。
PDF
軽量開発プロセスにおけるTracを利用したメトリクスの収集とプロジェクト管理
PDF
perfを使ったpostgre sqlの解析(後編)
PDF
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
PPT
Jvm reading-parallel gc
PPT
JVM-Reading-ParalleGC
PDF
"Global Distcloud File System" ~インタークラウド広域分散ファイルシステム 大陸間横断ライブマイグレーションを実現する技術
PDF
軽量開発プロセスにおけるTracを用いたメトリクスの収集・蓄積・利用
PDF
perfを使ったPostgreSQLの解析(前編)
PDF
Scalaで実装するGC
PDF
『じゃらん』『ホットペッパーグルメ』を支えるクラウド・データ基盤
PPT
第一回Soft layer勉強会 グローバル分散アーキテクチャ
PDF
「効率、品質、統制」の共通課題に着目した現場主導によるITS導入の効果検証
Java Flight Recorderの紹介 at Java Day Tokyo 2015
Oracle code one 2018 報告会概要
テスト駆動開発の進化
GCをみればRTSが見えてくる、かも。。。
軽量開発プロセスにおけるTracを利用したメトリクスの収集とプロジェクト管理
perfを使ったpostgre sqlの解析(後編)
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Jvm reading-parallel gc
JVM-Reading-ParalleGC
"Global Distcloud File System" ~インタークラウド広域分散ファイルシステム 大陸間横断ライブマイグレーションを実現する技術
軽量開発プロセスにおけるTracを用いたメトリクスの収集・蓄積・利用
perfを使ったPostgreSQLの解析(前編)
Scalaで実装するGC
『じゃらん』『ホットペッパーグルメ』を支えるクラウド・データ基盤
第一回Soft layer勉強会 グローバル分散アーキテクチャ
「効率、品質、統制」の共通課題に着目した現場主導によるITS導入の効果検証
Ad

More from NTT DATA Technology & Innovation (20)

PDF
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
2025年現在のNewSQL (最強DB講義 #36 発表資料)
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...

GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)

  • 1. ©2023 NTT DATA Corporation GraalVMでのFlight Recorderを使ったパフォーマンス解析 2023年6月4日 株式会社NTTデータ テレコム・ユーティリティ事業本部 古賀和久
  • 2. 2 ©2023 NTT DATA Corporation はじめに
  • 3. 3 ©2023 NTT DATA Corporation 自己紹介  株式会社 NTTデータ 所属 古賀 和久  好きなこと  バーベキュー  川遊び  ソースコードを読むこと  普段の仕事  通信業界のシステム開発(C/C++メイン)  ITアーキテクト
  • 4. 4 ©2023 NTT DATA Corporation 本日の内容
  • 5. 5 ©2023 NTT DATA Corporation このセッション内容 Javaの アプリケーション JDK Mission Control FlightRecord ファイル Native化した アプリケーション FlightRecord ファイル 同じように解析できるのか? JDK Mission Control
  • 6. 6 ©2023 NTT DATA Corporation 検証内容 # JDK公式ドキュメント 検証ケース 1 ガベージ・コレクション のパフォーマンス 2 同期(ロック競合) 3 IOパフォーマンス 4 コード実行パフォーマンス 実際の運用でよくあるだろうケースを想定 ※検証目的に特化した単純なコードで実施(実サービスのものではありません) 無駄なオブジェクトで徐々にヒープを圧迫 GCが原因で性能劣化 マルチスレッド処理で排他制御がボトルネックになる File/NWなど外部資源とのIOがボトルネックになる アルゴリズムの選択ミスなどによって 特定のメソッドがボトルネックになる
  • 7. 7 ©2023 NTT DATA Corporation ■発表を聞いて得られること - どこまで組み込みイベントで解析できるようになっているか - 今はまだ何ができないか ■発表を聞いても得られないこと - ユーザ独自のEventを実装してチューニングする方法 GraalVMの公式ドキュメントに 載っています
  • 8. 8 ©2023 NTT DATA Corporation 本セッションで話さないこと • そもそもGraalVMとは • GraalVMのNative化とは • Native化の仕方 • FlightRecordの取得方法 →OCHaCafe6 #2 GraalVM 最新事情 わかりやすいです
  • 9. 9 ©2023 NTT DATA Corporation 検証環境 Windows11 x64 Core(TM) i5-11400H / RAM32GB WSL2 Ubuntu 20.04.5 LTS GraalVM CE java11-22.3.0 検証用アプリケーション (Java版) ケースごとに実装 検証用アプリケーション (Native版) GraalVMの native-imageコマンドで 変換
  • 10. 10 ©2023 NTT DATA Corporation 検証結果サマリ # JDK公式ドキュメント 検証ケース 1 ガベージ・コレクション のパフォーマンス 2 同期(ロック競合) 3 IOパフォーマンス 4 コード実行パフォーマンス 無駄なオブジェクトで徐々にヒープサイズを圧迫 GCが原因で性能劣化 マルチスレッド処理で排他制御がボトルネックになる File/NWなど外部資源とのIOボトルネックになる アルゴリズムの選択ミスによって、 特定のメソッドがボトルネックになる
  • 11. 11 ©2023 NTT DATA Corporation ケースごとの説明の流れ • 検証アプリケーションの概要 • Javaでの実行例 • Native化したアプリでの結果 • 原因調査/代替手段など
  • 12. 12 ©2023 NTT DATA Corporation 検証(1/4) ガベージ・コレクションのパフォーマンス
  • 13. 13 ©2023 NTT DATA Corporation ガベージ・コレクションのパフォーマンス(1/8) 検証アプリケーション • 解放されないオブジェクトを徐々に増加 ※ループ内で100Byteのオブジェクトをリストに追加 • GCのアルゴリズムは”Serial GC※” ※GraalVM CE版ではSerial GCしか使えないので条件を合わせるため
  • 14. 14 ©2023 NTT DATA Corporation Javaでの実行結果
  • 15. 15 ©2023 NTT DATA Corporation ガベージ・コレクションのパフォーマンス(2/8) 自動分析レポート(Javaの場合) 最長休止時間 アプリケーション実行時間に対する 休止時間の比率 GCで止まっている時間が 自動分析レポートで分析されている
  • 16. 16 ©2023 NTT DATA Corporation ガベージ・コレクションのパフォーマンス(3/8) ガベージコレクションページ(Javaの場合) ヒープ使用状況の グラフ GCイベントごとの 詳細情報 停止時間の グラフ
  • 17. 17 ©2023 NTT DATA Corporation Native化したアプリでの結果
  • 18. 18 ©2023 NTT DATA Corporation ガベージ・コレクションのパフォーマンス(4/8) 自動分析レポート(Native化したアプリケーションの場合) アプリケーション実行時間 に対する休止時間の比率 最長休止時間 GCで止まっている時間が Javaと同じように分析されました
  • 19. 19 ©2023 NTT DATA Corporation ガベージ・コレクションのパフォーマンス(5/8) ガベージコレクションページ(Native化したアプリケーションの場合) ヒープの使用状況の グラフは確認できない GCイベントの情報 停止時間のグラフ 停止時間のグラフは 同様に見れる
  • 20. 20 ©2023 NTT DATA Corporation なぜグラフが出ないのか?
  • 21. 21 ©2023 NTT DATA Corporation Q. そもそも何をもとに グラフは出ているのか
  • 22. 22 ©2023 NTT DATA Corporation A. 「jdk.GCHeapSummary」
  • 23. 23 ©2023 NTT DATA Corporation jdk.GCHeapSummary { startTime = 22:03:30.764 gcId = 11 when = "Before GC" heapSpace = { start = 0xE7000000 committedEnd = 0xFF2B0000 committedSize = 386.7 MB reservedEnd = 0x100000000 reservedSize = 400.0 MB } heapUsed = 294.2 MB } jdk.GCHeapSummary { startTime = 22:03:30.776 gcId = 11 when = "After GC" heapSpace = { start = 0xE7000000 committedEnd = 0xFF2B0000 committedSize = 386.7 MB reservedEnd = 0x100000000 reservedSize = 400.0 MB } heapUsed = 65.5 MB } ガベージ・コレクションのパフォーマンス(6/8) Javaのヒープグラフ 実際のグラフとの対応です
  • 24. 24 ©2023 NTT DATA Corporation ガベージ・コレクションのパフォーマンス(7/8) Native化したアプリケーションでヒープのグラフが出ない原因 jfr コマンドで確認したイベントの集計結果 該当イベントが出力されていない。 https://github.com/oracle/graal/issues/5410 GraalVMのイベント対応状況のIssue抜粋 そもそも実装されていない
  • 25. 25 ©2023 NTT DATA Corporation 代替手段は? GC Logで代替可能
  • 26. 26 ©2023 NTT DATA Corporation GC Logのサンプル [ [36555093917095 GC: before epoch: 7 cause: CollectOnAllocation] [Full GC (CollectOnAllocation) 222900K->20067K, 0.0056789 secs] [36555099612242 GC: after epoch: 7 cause: CollectOnAllocation policy: adaptive type: complete collection time: 5678909 nanoSeconds] ] [ [36555359491355 GC: before epoch: 8 cause: CollectOnAllocation] [Incremental GC (CollectOnAllocation) 123681K->122657K, 0.0002136 secs] [36555359717573 GC: after epoch: 8 cause: CollectOnAllocation policy: adaptive type: incremental collection time: 213647 nanoSeconds] ] GCのタイプ(実施理由) GC前のヒープ、GC後のヒープ、休止時間
  • 27. 27 ©2023 NTT DATA Corporation ガベージ・コレクションのパフォーマンス(8/8) 考察 # ページ 差異 運用 1 レポート ページ チューニング要否はJMCを利用できる。 (休止時間については分析されるため) 2 ガベージコ レクション のページ ヒープサイズの使用状況の分析は 当面はGCログで分析する必要あり。 ヒープグラフが出ない チューニング要否の判断(休止時間の分析)はJMCでもできる。
  • 28. 28 ©2023 NTT DATA Corporation 検証(2/4) ロックに関する分析
  • 29. 29 ©2023 NTT DATA Corporation ロックに関する分析(1/8) ■検証アプリケーション • マルチスレッド(3つ) • Counter(共有オブジェクト)を排他取得 • ロック時間は長め ■期待 競合状況や競合原因などを見られること 検証アプリケーション
  • 30. 30 ©2023 NTT DATA Corporation Javaでの実行結果
  • 31. 31 ©2023 NTT DATA Corporation ロックに関する分析(2/8) 自動分析レポート(Javaの場合) ブロッキングの発生状況が分析結果として出てきています
  • 32. 32 ©2023 NTT DATA Corporation ロックに関する分析(3/8) スレッドの情報(Javaの場合) 凡例 アクティブ 非アクティブ ロック開放待ちで順次スレッドが実行されている ※下図は説明用に該当する子スレッド以外はグレーアウト表示に加工しています
  • 33. 33 ©2023 NTT DATA Corporation ロックに関する分析(4/8) ロックインスタンスの詳細ビュー(Javaの場合) 競合原因やスレッドごとのブロック時間を見ることができる 競合が発生した原因 スレッドごとのブロック時間
  • 34. 34 ©2023 NTT DATA Corporation Native化したアプリでの結果
  • 35. 35 ©2023 NTT DATA Corporation ロックに関する分析(5/8) 自動分析の結果(Nativeでの場合) Javaと同様にブロッキング発生をレポートされる
  • 36. 36 ©2023 NTT DATA Corporation ロックに関する分析(6/8) スレッドのページ(Native化したアプリでの実行例) 凡例 アクティブ 非アクティブ Javaと同様にスレッドの競合状況をグラフで確認できる ※下図は説明用に該当する子スレッド以外はグレーアウト表示に加工している
  • 37. 37 ©2023 NTT DATA Corporation ロックに関する分析(7/8) ロックインスタンスのページ(Native化したアプリケーションでの例) Javaと同様に競合原因やブロック時間を見ることができる 競合が発生した原因 スレッドごとのブロック時間
  • 38. 38 ©2023 NTT DATA Corporation ロックに関する分析のまとめ
  • 39. 39 ©2023 NTT DATA Corporation ロックに関する分析(8/8) 考察 # ページ 差異 結果 1 レポート ページ レポートでチェックポイントとして報告される 2 スレッドの 詳細分析 ビュー スレッド情報を可視化して確認できる 3 ロックイン スタンスの 詳細ビュー 原因となったクラスの情報 スレッドごとのブロック時間の集計結果 を見ることできた Javaと同様のレベルで解析可能
  • 40. 40 ©2023 NTT DATA Corporation 検証(3/4) IOパフォーマンス
  • 41. 41 ©2023 NTT DATA Corporation IOパフォーマンス 調査結果 • GraalVMの22.03ではイベント※出力未実装 jdk.FileRead、jdk.FileWrite、jdk.SocketRead、jdk.SocketWrite • PullRequestが出ていたがマージされていない。 https://github.com/oracle/graal/pull/5497
  • 42. 42 ©2023 NTT DATA Corporation 検証(4/4) コード実行パフォーマンス
  • 43. 43 ©2023 NTT DATA Corporation コード実行パフォーマンス(1/10) ■検証アプリケーション bubble_sort メソッドが処理時間の大半を占めるように実行 ■期待 bubble_sort メソッドが改善対象としてレポートされること 検証アプリケーション
  • 44. 44 ©2023 NTT DATA Corporation Javaでの実行結果
  • 45. 45 ©2023 NTT DATA Corporation コード実行パフォーマンス(2/10) 自動分析の結果(Javaの場合) bubble_sort が実行時間の大半を占めることがレポートされた
  • 46. 46 ©2023 NTT DATA Corporation コード実行パフォーマンス(3/10) メソッド・プロファイリング(Javaの場合) 対象メソッドやスタックトレースの情報を確認できる
  • 47. 47 ©2023 NTT DATA Corporation Native化したアプリでの結果
  • 48. 48 ©2023 NTT DATA Corporation コード実行パフォーマンス(4/10) 自動分析の結果(Nativeの場合) Nativeの場合はbubble_sort が改善対象として出てこなかった
  • 49. 49 ©2023 NTT DATA Corporation コード実行パフォーマンス(5/10) メソッド・プロファイリング(Nativeでの例) Nativeの実行例では何の情報も出ていない
  • 50. 50 ©2023 NTT DATA Corporation 出力されない原因を調べてみた
  • 51. 51 ©2023 NTT DATA Corporation コード実行パフォーマンス(6/10) Javaでの実行例から、何のイベントを元にしているかを調べてみた jdk.ExecutionSampleが出力されていないから $jfr print --events jdk.ExecutionSample app-startup.jfr で見た例 jdk.ExecutionSample { startTime = 22:17:35.853 sampledThread = "main" (javaThreadId = 1) state = "STATE_RUNNABLE" stackTrace = [ com.example.App.bubble_sort(int[]) line: 14 com.example.App.main(String[]) line: 50 ] } ■Javaでの実行例
  • 52. 52 ©2023 NTT DATA Corporation コード実行パフォーマンス(7/10) Nativeでメソッドプロファイリングに引っかからない原因 3つ目のケースと違ってイベント出力は実装されていた jfr コマンドで確認したイベントの集計結果(抜粋) $ jfr summary native-start.jfr Version: 2.0 Chunks: 1 Start: 2023-02-16 13:18:33 (UTC) Duration: 126 s Event Type CountSize (bytes) ======================================== jdk.JavaMonitorWait 6407171229 : jdk.ExecutionSample 0 0 jdk.NativeMethodSample 0 0 : 該当イベントが出力されていない。 実際に、関連するPull-Requestはmergeされていことも確認済み https://github.com/oracle/graal/pull/4005 ※https://github.com/oracle/graal/issues/5410 GraalVMのイベント対応状況のIssue※抜粋 実装済みにはなっている
  • 53. 53 ©2023 NTT DATA Corporation 追加検証 23年3月のGraalVMのmasterで実施 ※JDKは17になっています
  • 54. 54 ©2023 NTT DATA Corporation コード実行パフォーマンス(8/10) 自動分析の結果(追加検証) レポートは出るがメソッド名が異なる 期待 bubble_sort 結果 invokeCallback
  • 55. 55 ©2023 NTT DATA Corporation コード実行パフォーマンス(9/10) メソッド・プロファイリング(追加検証) レポートに表示されたメソッド名と同様に期待値と異なる invokeCallback
  • 56. 56 ©2023 NTT DATA Corporation コード実行パフォーマンス(10/10) 考察 何かしらの不具合があるようだが、 現時点では不明 JavaでチューニングしてからNative化
  • 57. 57 ©2023 NTT DATA Corporation まとめ
  • 58. 58 ©2023 NTT DATA Corporation 検証結果サマリ -再掲- 対応状況はケースによってまちまちだった # JDK公式ドキュメント 検証ケース 1 ガベージ・コレクション のパフォーマンス 2 同期(ロック競合) 3 IOパフォーマンス 4 コード実行パフォーマンス 無駄なオブジェクトで徐々にヒープサイズを圧迫 マルチスレッドで実行していて、 排他制御箇所がボトルネックになっている File/NWなど外部資源とのIOボトルネックで 性能が出ない アルゴリズムの選択ミスによって、 特定のメソッドがボトルネックになっている
  • 59. 59 ©2023 NTT DATA Corporation まちまち 悪いこと
  • 60. 60 ©2023 NTT DATA Corporation イベント出力対象が増えれば Javaの解析手法を活用できる
  • 61. 61 ©2023 NTT DATA Corporation 拡充に期待!!
  • 62. 62 ©2023 NTT DATA Corporation JJUG発表後 追加スライド
  • 63. 63 ©2023 NTT DATA Corporation jdk.GCHeapSummaryの出力機能の拡張について https://github.com/oracle/graal/pull/6466 こんな感じで見れるようになります! (Serial GC限定です) 提出したPull-Requestが採用されました!
  • 64. 64 ©2023 NTT DATA Corporation 参考資料
  • 65. 65 ©2023 NTT DATA Corporation 参考資料 # タイトル 記載者 概要 URL 1 OpenJDK での JDK Flight Recorder の使用 Redhat(公式) Flight RecorderやJMCの使い方の概要など https://access.redhat.com/documentation/ ja-jp/openjdk/11/html/using_jdk_flight_rec order_with_openjdk/index 2 JFR Events SAP(公式) JDKバージョンごとの取得可能なイベントの一覧(サンプル付き) https://sap.github.io/SapMachine/jfre vents/ 3 JDK Flight Recorder Javaコミュニティ Flight Recorder関連のアーキテクチャや、トラブルシュートの例な ど https://foojay.io/today/category/tools /jdk-flight-recorder/ 4 OpenJDK(GitHub) OpenJDK(公式) JDKのソースコード https://github.com/openjdk/jdk 5 GraalVM(ドキュメント) Oracle(公式) GraalVMの公式サイト https://www.graalvm.org/ 6 Flight Recorderを有効にしてビルドする方法などが記載されてい ます https://www.graalvm.org/latest/refer ence-manual/native-image/debugging -and-diagnostics/JFR/ 7 ユーザ独自のイベントを発行して記録する方法 https://www.graalvm.org/latest/refer ence-manual/native-image/guides/bui ld-and-run-native-executable-with-jfr/ 8 GraalVM(GitHub) Oracle(公式) トップページ https://github.com/oracle/graal/ 9 JFRに関するディスカッション https://github.com/oracle/graal/discussion s?discussions_q=jfr 10 Native-Imageの変更履歴 https://github.com/oracle/graal/blob/ master/substratevm/CHANGELOG.md 11 Flight RecorderのEvent対応状況 https://github.com/oracle/graal/issue s/5410 12 GraalVM 最新事情 Oracle Cloud Hang out Cafe GraalVMとは?やNativeimgeコマンドとは?といった概要を知り たい場合はこちらから読まれるとわかりやすいと思います。 https://ochacafe.connpass.com/event /259128/presentation/
  • 66. 66 ©2023 NTT DATA Corporation 本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です。
  • 67. ©2023 NTT DATA Corporation