SlideShare a Scribd company logo
© 2020 NTT DATA Corporation
GraalVMを3つの主機能から眺めてみよう
2020年10月22日 Oracle Groundbreakers APAC Virtual Tour 2020
株式会社NTTデータ 技術開発本部
阪田 浩一
© 2020 NTT DATA Corporation 2
自己紹介
• 阪田 浩一(さかた -)
• 通称 じゅくちょー
• JVMになりたい人
• NTTデータでJava/OpenJDK + GraalVMの
研究開発とそのサポート業に従事しています
• OpenJDK Author
jyukutyo
© 2020 NTT DATA Corporation 3
このセッションの役割
GraalVMの
真の力に目覚める!
(3つの主機能について、
その開発経緯を踏まえながら
概要を理解する)
© 2020 NTT DATA Corporation 4
真の力…?
GraalVMって、
ネイティブイメージ作って
起動を速くする
ツールじゃないの…??
© 2020 NTT DATA Corporation 5
GraalVMの3つの主機能
1. 新JITコンパイラによるパフォーマンス向上
2. JavaScript、Ruby、Pythonといった
(JVM言語でない)言語を実行可能
3. アプリケーションをネイティブイメージにして
JVMなしで実行可能
(JVMでの実行時とは異なる特性を持つ)
© 2020 NTT DATA Corporation 6
結論として
GraalVMは
ネイティブイメージ生成用ツール
ではありません
© 2020 NTT DATA Corporation 7
GraalVMで検索するとネイティブイメージのことばかりなので…
このセッションでは
JITコンパイラと多言語実行に
比重を置きます
© 2020 NTT DATA Corporation
1. 新JITコンパイラ
© 2020 NTT DATA Corporation 9
GraalVM JITコンパイラは
Javaで書かれた
新しいJITコンパイラ
© 2020 NTT DATA Corporation 10
そのJITコンパイラを
HotSpot VM上に搭載
© 2020 NTT DATA Corporation 11
GraalVMとHotSpot VM
• GraalVMはHotSpot VMがベース
HotSpot VM
Compiler Interface
C2C1
HotSpot VM
C++
GraalVM
Compiler
Interface
GraalVM
JITコンパイラC1
HotSpot VM
JVMCI
Java
© 2020 NTT DATA Corporation 12
GraalVMは
JVMの機能を
すべて包含します
© 2020 NTT DATA Corporation 13
既存のJVMにできることは
すべてできます
© 2020 NTT DATA Corporation 14
Oracle Labsが
開発
© 2020 NTT DATA Corporation 15
GraalVMの2つのエディション
https://www.graalvm.org/
© 2020 NTT DATA Corporation 16
GraalVMの2つのエディション
1. Community Edition (CE)
• OSS (クラスパス例外付き GPL v2)
2. Enterprise Edition (EE)
• ライセンス契約が必要 (評価は無償)
• CEより実行パフォーマンスがよい
• CEよりネイティブコードのセキュリティを強化している
© 2020 NTT DATA Corporation 17
以降は
CEを前提にします
© 2020 NTT DATA Corporation 18
GraalVM JITコンパイラの
利点は?
© 2020 NTT DATA Corporation 19
アロケーションの多い
アプリケーションには、
GraalVM JITコンパイラが
有効
© 2020 NTT DATA Corporation 20
たとえば
リアクティブストリーム
で構築したものや
© 2020 NTT DATA Corporation 21
Scalaなど
関数型プログラミング
モデルで構築したもの
© 2020 NTT DATA Corporation 22
C2コンパイラより
パフォーマンスが
向上する場合がある
© 2020 NTT DATA Corporation 23
ベンチマーク
https://renaissance.dev/
Higher is better
© 2020 NTT DATA Corporation 24
Twitter社の事例
• OpenJDKベースの独自JDKにGraalVM JITコンパイラを
バックポート
• 2017年ですでに本番環境で活用
• 数千台のサーバ、Scalaアプリケーション
• サーバリソースを削減し、台数削減
• 大きなコスト削減になった
• 事例発表動画
• Twitter’s Quest for a Wholly Graal Runtime
(JavaOne 2017) https://www.youtube.com/watch?v=G-vlQaPMAxg
© 2020 NTT DATA Corporation 25
GraalVM JITコンパイラの利点
1. Javaで書かれている
• C++で書かれたC2コンパイラは
長年の変更で複雑化
• 新規に開発することで新機能追加、設計改善
• Javaに変更することで開発参加の門戸を広く
• 以前はこのJITコンパイラをGraalと呼んでいた
© 2020 NTT DATA Corporation 26
参考:OpenJDKにもポートされている(Experimental)
http://openjdk.java.net/jeps/317
© 2020 NTT DATA Corporation 27
GraalVM JITコンパイラの利点
2. このJITコンパイラ向けに作られた
言語実装用フレームワーク Truffle がある
• このライブラリを用いて実装した言語は、
すべてGraalVM上で実行できる
• トラフル (英)、トリュフ (仏)
© 2020 NTT DATA Corporation
2. 多言語実行環境
© 2020 NTT DATA Corporation 29
GraalVM JITコンパイラの利点
2. このJITコンパイラ向けに作られた
言語実装用フレームワーク Truffle がある
• このライブラリを用いて実装した言語は、
すべてGraalVM上で実行できる
• トラフル (英)、トリュフ (仏)
© 2020 NTT DATA Corporation 30
サポートする言語
GraalVM バージョン20.1.0時点のもの
言語 プロダクト名 ステータス 対応バージョン
Java - - OpenJDK 8もしくは11から選択
JavaScript graaljs GA ECMAScript 2020準拠
Ruby TruffleRuby Experimental 2.6.2ベース
R FastR Experimental 3.6.1ベース
Python GraalPython Experimental 3.7ベース
WebAssembly GraalWasm Experimental WebAssembly MVP仕様
LLVM Sulong Experimental bitcodeバージョン3.8~9.0を実行可能
© 2020 NTT DATA Corporation 31
(なお、Java 11で
Nashornは非推奨に
なりました)
© 2020 NTT DATA Corporation 32
Truffleでの言語実装
HotSpot VM
JVMCI
GraalVM JITコンパイラ
JVM Lang Truffle
LLVMJS R Ruby
C C++
Fortran
Interpreter
© 2020 NTT DATA Corporation 33
言語実装の仕組み
対象言語の
ASTインタプリタを
Truffle APIを用いて
Javaで実装する
© 2020 NTT DATA Corporation 34
他言語でも高パフォーマンス
対象言語コードのASTと
インタプリタの両方を
JITコンパイラに評価させ
高性能のコードを生成
© 2020 NTT DATA Corporation 35
ゴールドマン・サックス社の事例
• 1990年代初め、独自に言語を開発
• 現在までコードが増え続ける
• 言語自体の運用開発が課題に
© 2020 NTT DATA Corporation 36
ゴールドマン・サックス社の事例
• その言語をTruffleベースに移行
• 他言語との相互呼び出しが可能に
• メトリクス取得やデバッグが容易に
• 実行パフォーマンスが向上
• 事例発表動画
• One VM to Rule Them All? Lessons Learned with
Truffle and Graal (Oracle Code One 2018)
https://www.youtube.com/watch?v=MUECwHdr07Q
© 2020 NTT DATA Corporation 37
究極的には
自分で実装した
プログラミング言語を
GraalVMで実行できる
© 2020 NTT DATA Corporation 38
言語実装サンプル
• GraalVMのリポジトリ内
• SimpleLanguage
• https://github.com/graalvm/simplelanguage
• Simpleとあるけれど、読むのは簡単ではない
© 2020 NTT DATA Corporation 39
私もやってみました(古いバージョンでの実装です)
https://github.com/jyukutyo/JVM-Math-Language
© 2020 NTT DATA Corporation 40
サポートする言語
GraalVM バージョン20.1.0時点のもの
言語 プロダクト名 ステータス 対応バージョン
Java - - OpenJDK 8もしくは11から選択
JavaScript graaljs GA ECMAScript 2020準拠
Ruby TruffleRuby Experimental 2.6.2ベース
R FastR Experimental 3.6.1ベース
Python GraalPython Experimental 3.7ベース
WebAssembly GraalWasm Experimental WebAssembly MVP仕様
LLVM Sulong Experimental bitcodeバージョン3.8~9.0を実行可能
© 2020 NTT DATA Corporation 41
参考:GraalPythonの検証
• 実プロジェクトでの利用は(まだ)現実的ではない
• C拡張しているライブラリの利用するとエラーが発生する可能性があり、
確実性に不安が残る
• Pythonコードの実行が長い
たとえばインポート文の処理に時間がかかる
• Pandasであれば、インポートが数十秒単位であった
• SSLをサポートしておらず、
PythonコードでのHTTPSのAPI呼び出しはできない
• 20.2でpycファイルによるキャッシュ機能が導入されたが、
パフォーマンスは不十分である
© 2020 NTT DATA Corporation 42
デモ(Python3とGraalPythonでのPandasの実行)
© 2020 NTT DATA Corporation 43
Pythonに関しては
やはりまだ
Experimental
© 2020 NTT DATA Corporation 44
単に各言語を
実行できるだけでは
ない
© 2020 NTT DATA Corporation 45
Interoperability
パフォーマンスを大幅に
低下させることなく、
言語間で
相互呼び出しができる
© 2020 NTT DATA Corporation 46
Java <-> Truffle言語
はもちろん
© 2020 NTT DATA Corporation 47
Truffle言語間でも
(Ruby <-> JavaScriptなど)
© 2020 NTT DATA Corporation 48
GraalVMのビジョン
パフォーマンスを
犠牲にせず、
言語間の抽象化をする
© 2020 NTT DATA Corporation 49
あの処理、
別の言語のライブラリを
使うとすぐできるのに…
© 2020 NTT DATA Corporation 50
Javaから先ほどのPandasコードを呼び出す例
© 2020 NTT DATA Corporation 51
開発ツールの
サポートもある
© 2020 NTT DATA Corporation 52
Google Chrome DevToolsでのデバッグ
© 2020 NTT DATA Corporation 53
デモ(Chrome DevToolsでのデバッグ)
© 2020 NTT DATA Corporation 54
Graal VisualVM
© 2020 NTT DATA Corporation
3. ネイティブイメージ生成機能
© 2020 NTT DATA Corporation 56
GraalVMのネイティブイメージ生成
• ネイティブイメージ
(実行可能なバイナリ) を生成する機能
• 生成したイメージ (ファイル) だけで実行可能
• つまり、起動にJVM (JDK/JRE) が不要
© 2020 NTT DATA Corporation 57
Oracle Database
• ユーザ定義関数をJavaで作成できる
しかし、
• GraalVM自体をデータベースに組み込めば、
Javaはもちろん、他言語も使える
• 機能の更新をGraalVM側に任せられる
© 2020 NTT DATA Corporation 58
Oracle Databaseに
GraalVMを組み込む
© 2020 NTT DATA Corporation 59
Oracle Databaseへ組み込むには
• JVMが課題
• サイズが大きい
• 初期化処理が長い
• メモリ使用量が大きい
• そのままではデータベースでの利用はできない
© 2020 NTT DATA Corporation 60
GraalVM自体を
ネイティブイメージに
する!
© 2020 NTT DATA Corporation 61
ネイティブイメージにすると
• JVMが不要
• サイズが小さく済む
• 起動時間が短くなる
• メモリ使用量が少なくなる
• ただし、同じプラットフォームでしか動作しない
© 2020 NTT DATA Corporation 62
参考:Oracle Database MLE
• MLE: Multilingal Engine
• https://www.oracle.com/technetwork/database/multilingual-
engine/overview/index.html
select
validator.isEmail('alice@example.com’)
from dual;
© 2020 NTT DATA Corporation 63
こうした経緯で開発した
ネイティブイメージ
生成機能が
GraalVMの機能の1つ
となった
© 2020 NTT DATA Corporation 64
ネイティブイメージの現状
• Experimental
• サポートプラットフォーム
• x86 64ビットシステム
• Linux、macOS、Windows
© 2020 NTT DATA Corporation 65
ネイティブイメージ生成プロセス
アプリケーション
ライブラリ
JDK
SubstrateVM
下記の繰り返し:
解析ポイント
↓
初期化処理実行
↓
ヒープのスナップショット生成
ELFファイル
コード
(textセクション)
イメージヒープ
(dataセクション)
© 2020 NTT DATA Corporation 66
生成時に
初期化処理を実行し、
起動時間を
短縮する
© 2020 NTT DATA Corporation 67
デモ(ネイティブイメージ生成)
© 2020 NTT DATA Corporation 68
ネイティブイメージ対応フレームワーク
• Micronaut
• Quarkus
• Helidon
• Spring Framework, Bootも対応作業中
(現在はExperimental)
© 2020 NTT DATA Corporation 69
ネイティブイメージのメリットまとめ
• 起動時間が短くなる
• メモリ使用量が少なくなる
• サイズが小さくなる
© 2020 NTT DATA Corporation 70
どんなアプリケーション
でも、
ネイティブイメージに
する方がよいのか?
© 2020 NTT DATA Corporation 71
JITコンパイル (JVM)
と
AOTコンパイル (GraalVM)
© 2020 NTT DATA Corporation 72
GraalVMのネイティブイメージ機能
• AOT(Ahead-of-Time:事前)コンパイル
「実行前」に
機械語へコンパイル!
© 2020 NTT DATA Corporation 73
JITコンパイル
「実行中」に
機械語へコンパイル!
JVM
© 2020 NTT DATA Corporation 74
超簡略化して考えると…
❌
「実行中」に
機械語へコンパイル!
「実行前」に
機械語へコンパイル!
© 2020 NTT DATA Corporation 75
同じようなことを
やっているように
見えませんか?
© 2020 NTT DATA Corporation 76
2つのコンパイラの処理は
重なる部分があるため、
JITコンパイラを元にして
ネイティブイメージ生成機能を
作ることができた
© 2020 NTT DATA Corporation 77
https://openjdk.java.net/jeps/295
© 2020 NTT DATA Corporation 78
ネイティブコンパイルを採用するトレードオフ
• 事前にコンパイルしたものを使うので、
利用できない機能が出てくる
• コードのinstrumentation
• 動的な再最適化
• 性能のトレードオフ
https://twitter.com/thomaswue/status/1145603781108928513
© 2020 NTT DATA Corporation 79
ネイティブイメージが適切なケース
• FaaS
• 起動してすぐに終了する
• クラウドで実行する
大規模アプリケーション
• リソースを節約し、コストを削減する
© 2020 NTT DATA Corporation 80
GraalVMの2つのモード
• JITモード
• JVMとGraalVM JITコンパイラで
アプリケーションを実行
• AOTモード
• ネイティブイメージを生成し、JVMなしで
アプリケーションを実行
• どちらのモードのことなのか、意識する
© 2020 NTT DATA Corporation
4. GraalVMとOpenJDK
© 2020 NTT DATA Corporation 82
Project Metropolis
OpenJDK: Metropolis https://openjdk.java.net/projects/metropolis/
© 2020 NTT DATA Corporation 83
JVMを
再実装する!
(ランタイムの重要な部分中心)
© 2020 NTT DATA Corporation 84
再実装とは?
C++の既存実装
↓
Javaで再実装
© 2020 NTT DATA Corporation 85
Project Metropolisの現在
• 現在:Java 15ベースのEAビルドがある
• https://jdk.java.net/metropolis/
• GraalVM JITコンパイラがデフォルトコンパイラ
• ネイティブコンパイル済み
• 次にどのコンポーネントがJava on Javaとなるのかは明らかでない
• たとえばGCは難しいだろうと言われている
© 2020 NTT DATA Corporation 86
JITコンパイラが
Javaで書かれていると
© 2020 NTT DATA Corporation 87
JITコンパイラの
Javaコードも
JITコンパイルする
必要がある
© 2020 NTT DATA Corporation 88
つまり
アプリケーション起動時に
その分の時間がかかる
© 2020 NTT DATA Corporation 89
JITコンパイラの
コードをAOTコンパイル
(ネイティブコンパイル)
してしまえば
ある程度解決できる
© 2020 NTT DATA Corporation 90
JITコンパイラコードのコンパイル
JavaでJITコンパイラを書く
↓
そうなるとJITコンパイラのJavaコードを
JITコンパイルすることが必要
↓
あらかじめJITコンパイラのJavaコードを
ネイティブコンパイルしておく
(libgraal/libjvmcicompiler)
© 2020 NTT DATA Corporation 91
JVMとGraalVMは
互いに影響を
及ぼし合っている
© 2020 NTT DATA Corporation 92
ただし、互いに
独立した開発
となっている
© 2020 NTT DATA Corporation 93
GraalVMの3つの主機能
1. 新JITコンパイラによるパフォーマンス向上
2. JavaScript、Ruby、Pythonといった
(JVM言語でない)言語を実行可能
3. アプリケーションをネイティブイメージにして
JVMなしで実行可能
(JVMでの実行時とは異なる特性を持つ)
みんなのJava OpenJDKから始まる大変革期! https://gihyo.jp/book/2020/978-4-297-11199-1
© 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です

More Related Content

PPTX
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
PPTX
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
PDF
今話題のいろいろなコンテナランタイムを比較してみた
PDF
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
PPTX
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
PPTX
Prometheus入門から運用まで徹底解説
PDF
Ingress on Azure Kubernetes Service
GraalVMの多言語実行機能が凄そうだったので試しにApache Sparkに組み込んで動かしてみたけどちょっとまだ早かったかもしれない(Open So...
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
今話題のいろいろなコンテナランタイムを比較してみた
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
9/14にリリースされたばかりの新LTS版Java 17、ここ3年間のJavaの変化を知ろう!(Open Source Conference 2021 O...
Prometheus入門から運用まで徹底解説
Ingress on Azure Kubernetes Service

What's hot (20)

PDF
Docker道場オンライン#1 Docker基礎概念と用語の理解
PDF
分散トレーシング技術について(Open tracingやjaeger)
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PDF
BuildKitの概要と最近の機能
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
PDF
DockerとPodmanの比較
PDF
JVMのGCアルゴリズムとチューニング
PDF
Spring fest2020 spring-security
PDF
GKE multi-cluster Ingress
PDF
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
PDF
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PPTX
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
PPTX
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
PPTX
Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)
PDF
Docker Compose 徹底解説
PPTX
Dockerからcontainerdへの移行
PDF
インフラCICDの勘所
PDF
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
PDF
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
PDF
オブジェクト指向エクササイズのススメ
Docker道場オンライン#1 Docker基礎概念と用語の理解
分散トレーシング技術について(Open tracingやjaeger)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
BuildKitの概要と最近の機能
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
DockerとPodmanの比較
JVMのGCアルゴリズムとチューニング
Spring fest2020 spring-security
GKE multi-cluster Ingress
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
GraalVMで使われている、他言語をJVM上に実装する仕組みを学ぼう
分析指向データレイク実現の次の一手 ~Delta Lake、なにそれおいしいの?~(NTTデータ テクノロジーカンファレンス 2020 発表資料)
Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)
Docker Compose 徹底解説
Dockerからcontainerdへの移行
インフラCICDの勘所
より速く より運用しやすく 進化し続けるJVM(Java Developers Summit Online 2023 発表資料)
わかる!metadata.managedFields / Kubernetes Meetup Tokyo 48
オブジェクト指向エクササイズのススメ
Ad

Similar to GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料) (20)

PPTX
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
PPTX
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
PPTX
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
PDF
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
ODP
"Up" with vagrant and docker
PDF
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
PDF
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
PDF
【Oracle Cloud ウェビナー】WebLogic Serverのご紹介
PDF
Grailsのススメ(仮)
PDF
"Up" with vagrant and docker
PDF
HeapStats: Introduction and Technical Preview
PPTX
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
PPTX
Introduction to GraalVM
PDF
Storm×couchbase serverで作るリアルタイム解析基盤
PDF
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PPTX
GAE + Spannerで目指せ No (Uncomfortable) Ops
PDF
GPU Container as a Service を実現するための最新OSS徹底比較
PPTX
Introduction to GraalVM and Native Image
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
PDF
Prometheus超基礎公開用.pdf
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVM を普通の Java VM として使う ~クラウドベンチマークなどでの比較~
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
"Up" with vagrant and docker
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
GraalVMでのFlight Recorderを使ったパフォーマンス解析(JJUG CCC 2023 Spring)
【Oracle Cloud ウェビナー】WebLogic Serverのご紹介
Grailsのススメ(仮)
"Up" with vagrant and docker
HeapStats: Introduction and Technical Preview
JAVA_HOME/binにあるコマンド、いくつ使っていますか?[JVM関連ツール編](JJUGナイトセミナー「Java解析ツール特集」 発表資料)
Introduction to GraalVM
Storm×couchbase serverで作るリアルタイム解析基盤
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
GAE + Spannerで目指せ No (Uncomfortable) Ops
GPU Container as a Service を実現するための最新OSS徹底比較
Introduction to GraalVM and Native Image
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
Prometheus超基礎公開用.pdf
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
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...
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
開発中の新機能 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 ...
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...
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)

GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)

  • 1. © 2020 NTT DATA Corporation GraalVMを3つの主機能から眺めてみよう 2020年10月22日 Oracle Groundbreakers APAC Virtual Tour 2020 株式会社NTTデータ 技術開発本部 阪田 浩一
  • 2. © 2020 NTT DATA Corporation 2 自己紹介 • 阪田 浩一(さかた -) • 通称 じゅくちょー • JVMになりたい人 • NTTデータでJava/OpenJDK + GraalVMの 研究開発とそのサポート業に従事しています • OpenJDK Author jyukutyo
  • 3. © 2020 NTT DATA Corporation 3 このセッションの役割 GraalVMの 真の力に目覚める! (3つの主機能について、 その開発経緯を踏まえながら 概要を理解する)
  • 4. © 2020 NTT DATA Corporation 4 真の力…? GraalVMって、 ネイティブイメージ作って 起動を速くする ツールじゃないの…??
  • 5. © 2020 NTT DATA Corporation 5 GraalVMの3つの主機能 1. 新JITコンパイラによるパフォーマンス向上 2. JavaScript、Ruby、Pythonといった (JVM言語でない)言語を実行可能 3. アプリケーションをネイティブイメージにして JVMなしで実行可能 (JVMでの実行時とは異なる特性を持つ)
  • 6. © 2020 NTT DATA Corporation 6 結論として GraalVMは ネイティブイメージ生成用ツール ではありません
  • 7. © 2020 NTT DATA Corporation 7 GraalVMで検索するとネイティブイメージのことばかりなので… このセッションでは JITコンパイラと多言語実行に 比重を置きます
  • 8. © 2020 NTT DATA Corporation 1. 新JITコンパイラ
  • 9. © 2020 NTT DATA Corporation 9 GraalVM JITコンパイラは Javaで書かれた 新しいJITコンパイラ
  • 10. © 2020 NTT DATA Corporation 10 そのJITコンパイラを HotSpot VM上に搭載
  • 11. © 2020 NTT DATA Corporation 11 GraalVMとHotSpot VM • GraalVMはHotSpot VMがベース HotSpot VM Compiler Interface C2C1 HotSpot VM C++ GraalVM Compiler Interface GraalVM JITコンパイラC1 HotSpot VM JVMCI Java
  • 12. © 2020 NTT DATA Corporation 12 GraalVMは JVMの機能を すべて包含します
  • 13. © 2020 NTT DATA Corporation 13 既存のJVMにできることは すべてできます
  • 14. © 2020 NTT DATA Corporation 14 Oracle Labsが 開発
  • 15. © 2020 NTT DATA Corporation 15 GraalVMの2つのエディション https://www.graalvm.org/
  • 16. © 2020 NTT DATA Corporation 16 GraalVMの2つのエディション 1. Community Edition (CE) • OSS (クラスパス例外付き GPL v2) 2. Enterprise Edition (EE) • ライセンス契約が必要 (評価は無償) • CEより実行パフォーマンスがよい • CEよりネイティブコードのセキュリティを強化している
  • 17. © 2020 NTT DATA Corporation 17 以降は CEを前提にします
  • 18. © 2020 NTT DATA Corporation 18 GraalVM JITコンパイラの 利点は?
  • 19. © 2020 NTT DATA Corporation 19 アロケーションの多い アプリケーションには、 GraalVM JITコンパイラが 有効
  • 20. © 2020 NTT DATA Corporation 20 たとえば リアクティブストリーム で構築したものや
  • 21. © 2020 NTT DATA Corporation 21 Scalaなど 関数型プログラミング モデルで構築したもの
  • 22. © 2020 NTT DATA Corporation 22 C2コンパイラより パフォーマンスが 向上する場合がある
  • 23. © 2020 NTT DATA Corporation 23 ベンチマーク https://renaissance.dev/ Higher is better
  • 24. © 2020 NTT DATA Corporation 24 Twitter社の事例 • OpenJDKベースの独自JDKにGraalVM JITコンパイラを バックポート • 2017年ですでに本番環境で活用 • 数千台のサーバ、Scalaアプリケーション • サーバリソースを削減し、台数削減 • 大きなコスト削減になった • 事例発表動画 • Twitter’s Quest for a Wholly Graal Runtime (JavaOne 2017) https://www.youtube.com/watch?v=G-vlQaPMAxg
  • 25. © 2020 NTT DATA Corporation 25 GraalVM JITコンパイラの利点 1. Javaで書かれている • C++で書かれたC2コンパイラは 長年の変更で複雑化 • 新規に開発することで新機能追加、設計改善 • Javaに変更することで開発参加の門戸を広く • 以前はこのJITコンパイラをGraalと呼んでいた
  • 26. © 2020 NTT DATA Corporation 26 参考:OpenJDKにもポートされている(Experimental) http://openjdk.java.net/jeps/317
  • 27. © 2020 NTT DATA Corporation 27 GraalVM JITコンパイラの利点 2. このJITコンパイラ向けに作られた 言語実装用フレームワーク Truffle がある • このライブラリを用いて実装した言語は、 すべてGraalVM上で実行できる • トラフル (英)、トリュフ (仏)
  • 28. © 2020 NTT DATA Corporation 2. 多言語実行環境
  • 29. © 2020 NTT DATA Corporation 29 GraalVM JITコンパイラの利点 2. このJITコンパイラ向けに作られた 言語実装用フレームワーク Truffle がある • このライブラリを用いて実装した言語は、 すべてGraalVM上で実行できる • トラフル (英)、トリュフ (仏)
  • 30. © 2020 NTT DATA Corporation 30 サポートする言語 GraalVM バージョン20.1.0時点のもの 言語 プロダクト名 ステータス 対応バージョン Java - - OpenJDK 8もしくは11から選択 JavaScript graaljs GA ECMAScript 2020準拠 Ruby TruffleRuby Experimental 2.6.2ベース R FastR Experimental 3.6.1ベース Python GraalPython Experimental 3.7ベース WebAssembly GraalWasm Experimental WebAssembly MVP仕様 LLVM Sulong Experimental bitcodeバージョン3.8~9.0を実行可能
  • 31. © 2020 NTT DATA Corporation 31 (なお、Java 11で Nashornは非推奨に なりました)
  • 32. © 2020 NTT DATA Corporation 32 Truffleでの言語実装 HotSpot VM JVMCI GraalVM JITコンパイラ JVM Lang Truffle LLVMJS R Ruby C C++ Fortran Interpreter
  • 33. © 2020 NTT DATA Corporation 33 言語実装の仕組み 対象言語の ASTインタプリタを Truffle APIを用いて Javaで実装する
  • 34. © 2020 NTT DATA Corporation 34 他言語でも高パフォーマンス 対象言語コードのASTと インタプリタの両方を JITコンパイラに評価させ 高性能のコードを生成
  • 35. © 2020 NTT DATA Corporation 35 ゴールドマン・サックス社の事例 • 1990年代初め、独自に言語を開発 • 現在までコードが増え続ける • 言語自体の運用開発が課題に
  • 36. © 2020 NTT DATA Corporation 36 ゴールドマン・サックス社の事例 • その言語をTruffleベースに移行 • 他言語との相互呼び出しが可能に • メトリクス取得やデバッグが容易に • 実行パフォーマンスが向上 • 事例発表動画 • One VM to Rule Them All? Lessons Learned with Truffle and Graal (Oracle Code One 2018) https://www.youtube.com/watch?v=MUECwHdr07Q
  • 37. © 2020 NTT DATA Corporation 37 究極的には 自分で実装した プログラミング言語を GraalVMで実行できる
  • 38. © 2020 NTT DATA Corporation 38 言語実装サンプル • GraalVMのリポジトリ内 • SimpleLanguage • https://github.com/graalvm/simplelanguage • Simpleとあるけれど、読むのは簡単ではない
  • 39. © 2020 NTT DATA Corporation 39 私もやってみました(古いバージョンでの実装です) https://github.com/jyukutyo/JVM-Math-Language
  • 40. © 2020 NTT DATA Corporation 40 サポートする言語 GraalVM バージョン20.1.0時点のもの 言語 プロダクト名 ステータス 対応バージョン Java - - OpenJDK 8もしくは11から選択 JavaScript graaljs GA ECMAScript 2020準拠 Ruby TruffleRuby Experimental 2.6.2ベース R FastR Experimental 3.6.1ベース Python GraalPython Experimental 3.7ベース WebAssembly GraalWasm Experimental WebAssembly MVP仕様 LLVM Sulong Experimental bitcodeバージョン3.8~9.0を実行可能
  • 41. © 2020 NTT DATA Corporation 41 参考:GraalPythonの検証 • 実プロジェクトでの利用は(まだ)現実的ではない • C拡張しているライブラリの利用するとエラーが発生する可能性があり、 確実性に不安が残る • Pythonコードの実行が長い たとえばインポート文の処理に時間がかかる • Pandasであれば、インポートが数十秒単位であった • SSLをサポートしておらず、 PythonコードでのHTTPSのAPI呼び出しはできない • 20.2でpycファイルによるキャッシュ機能が導入されたが、 パフォーマンスは不十分である
  • 42. © 2020 NTT DATA Corporation 42 デモ(Python3とGraalPythonでのPandasの実行)
  • 43. © 2020 NTT DATA Corporation 43 Pythonに関しては やはりまだ Experimental
  • 44. © 2020 NTT DATA Corporation 44 単に各言語を 実行できるだけでは ない
  • 45. © 2020 NTT DATA Corporation 45 Interoperability パフォーマンスを大幅に 低下させることなく、 言語間で 相互呼び出しができる
  • 46. © 2020 NTT DATA Corporation 46 Java <-> Truffle言語 はもちろん
  • 47. © 2020 NTT DATA Corporation 47 Truffle言語間でも (Ruby <-> JavaScriptなど)
  • 48. © 2020 NTT DATA Corporation 48 GraalVMのビジョン パフォーマンスを 犠牲にせず、 言語間の抽象化をする
  • 49. © 2020 NTT DATA Corporation 49 あの処理、 別の言語のライブラリを 使うとすぐできるのに…
  • 50. © 2020 NTT DATA Corporation 50 Javaから先ほどのPandasコードを呼び出す例
  • 51. © 2020 NTT DATA Corporation 51 開発ツールの サポートもある
  • 52. © 2020 NTT DATA Corporation 52 Google Chrome DevToolsでのデバッグ
  • 53. © 2020 NTT DATA Corporation 53 デモ(Chrome DevToolsでのデバッグ)
  • 54. © 2020 NTT DATA Corporation 54 Graal VisualVM
  • 55. © 2020 NTT DATA Corporation 3. ネイティブイメージ生成機能
  • 56. © 2020 NTT DATA Corporation 56 GraalVMのネイティブイメージ生成 • ネイティブイメージ (実行可能なバイナリ) を生成する機能 • 生成したイメージ (ファイル) だけで実行可能 • つまり、起動にJVM (JDK/JRE) が不要
  • 57. © 2020 NTT DATA Corporation 57 Oracle Database • ユーザ定義関数をJavaで作成できる しかし、 • GraalVM自体をデータベースに組み込めば、 Javaはもちろん、他言語も使える • 機能の更新をGraalVM側に任せられる
  • 58. © 2020 NTT DATA Corporation 58 Oracle Databaseに GraalVMを組み込む
  • 59. © 2020 NTT DATA Corporation 59 Oracle Databaseへ組み込むには • JVMが課題 • サイズが大きい • 初期化処理が長い • メモリ使用量が大きい • そのままではデータベースでの利用はできない
  • 60. © 2020 NTT DATA Corporation 60 GraalVM自体を ネイティブイメージに する!
  • 61. © 2020 NTT DATA Corporation 61 ネイティブイメージにすると • JVMが不要 • サイズが小さく済む • 起動時間が短くなる • メモリ使用量が少なくなる • ただし、同じプラットフォームでしか動作しない
  • 62. © 2020 NTT DATA Corporation 62 参考:Oracle Database MLE • MLE: Multilingal Engine • https://www.oracle.com/technetwork/database/multilingual- engine/overview/index.html select validator.isEmail('alice@example.com’) from dual;
  • 63. © 2020 NTT DATA Corporation 63 こうした経緯で開発した ネイティブイメージ 生成機能が GraalVMの機能の1つ となった
  • 64. © 2020 NTT DATA Corporation 64 ネイティブイメージの現状 • Experimental • サポートプラットフォーム • x86 64ビットシステム • Linux、macOS、Windows
  • 65. © 2020 NTT DATA Corporation 65 ネイティブイメージ生成プロセス アプリケーション ライブラリ JDK SubstrateVM 下記の繰り返し: 解析ポイント ↓ 初期化処理実行 ↓ ヒープのスナップショット生成 ELFファイル コード (textセクション) イメージヒープ (dataセクション)
  • 66. © 2020 NTT DATA Corporation 66 生成時に 初期化処理を実行し、 起動時間を 短縮する
  • 67. © 2020 NTT DATA Corporation 67 デモ(ネイティブイメージ生成)
  • 68. © 2020 NTT DATA Corporation 68 ネイティブイメージ対応フレームワーク • Micronaut • Quarkus • Helidon • Spring Framework, Bootも対応作業中 (現在はExperimental)
  • 69. © 2020 NTT DATA Corporation 69 ネイティブイメージのメリットまとめ • 起動時間が短くなる • メモリ使用量が少なくなる • サイズが小さくなる
  • 70. © 2020 NTT DATA Corporation 70 どんなアプリケーション でも、 ネイティブイメージに する方がよいのか?
  • 71. © 2020 NTT DATA Corporation 71 JITコンパイル (JVM) と AOTコンパイル (GraalVM)
  • 72. © 2020 NTT DATA Corporation 72 GraalVMのネイティブイメージ機能 • AOT(Ahead-of-Time:事前)コンパイル 「実行前」に 機械語へコンパイル!
  • 73. © 2020 NTT DATA Corporation 73 JITコンパイル 「実行中」に 機械語へコンパイル! JVM
  • 74. © 2020 NTT DATA Corporation 74 超簡略化して考えると… ❌ 「実行中」に 機械語へコンパイル! 「実行前」に 機械語へコンパイル!
  • 75. © 2020 NTT DATA Corporation 75 同じようなことを やっているように 見えませんか?
  • 76. © 2020 NTT DATA Corporation 76 2つのコンパイラの処理は 重なる部分があるため、 JITコンパイラを元にして ネイティブイメージ生成機能を 作ることができた
  • 77. © 2020 NTT DATA Corporation 77 https://openjdk.java.net/jeps/295
  • 78. © 2020 NTT DATA Corporation 78 ネイティブコンパイルを採用するトレードオフ • 事前にコンパイルしたものを使うので、 利用できない機能が出てくる • コードのinstrumentation • 動的な再最適化 • 性能のトレードオフ https://twitter.com/thomaswue/status/1145603781108928513
  • 79. © 2020 NTT DATA Corporation 79 ネイティブイメージが適切なケース • FaaS • 起動してすぐに終了する • クラウドで実行する 大規模アプリケーション • リソースを節約し、コストを削減する
  • 80. © 2020 NTT DATA Corporation 80 GraalVMの2つのモード • JITモード • JVMとGraalVM JITコンパイラで アプリケーションを実行 • AOTモード • ネイティブイメージを生成し、JVMなしで アプリケーションを実行 • どちらのモードのことなのか、意識する
  • 81. © 2020 NTT DATA Corporation 4. GraalVMとOpenJDK
  • 82. © 2020 NTT DATA Corporation 82 Project Metropolis OpenJDK: Metropolis https://openjdk.java.net/projects/metropolis/
  • 83. © 2020 NTT DATA Corporation 83 JVMを 再実装する! (ランタイムの重要な部分中心)
  • 84. © 2020 NTT DATA Corporation 84 再実装とは? C++の既存実装 ↓ Javaで再実装
  • 85. © 2020 NTT DATA Corporation 85 Project Metropolisの現在 • 現在:Java 15ベースのEAビルドがある • https://jdk.java.net/metropolis/ • GraalVM JITコンパイラがデフォルトコンパイラ • ネイティブコンパイル済み • 次にどのコンポーネントがJava on Javaとなるのかは明らかでない • たとえばGCは難しいだろうと言われている
  • 86. © 2020 NTT DATA Corporation 86 JITコンパイラが Javaで書かれていると
  • 87. © 2020 NTT DATA Corporation 87 JITコンパイラの Javaコードも JITコンパイルする 必要がある
  • 88. © 2020 NTT DATA Corporation 88 つまり アプリケーション起動時に その分の時間がかかる
  • 89. © 2020 NTT DATA Corporation 89 JITコンパイラの コードをAOTコンパイル (ネイティブコンパイル) してしまえば ある程度解決できる
  • 90. © 2020 NTT DATA Corporation 90 JITコンパイラコードのコンパイル JavaでJITコンパイラを書く ↓ そうなるとJITコンパイラのJavaコードを JITコンパイルすることが必要 ↓ あらかじめJITコンパイラのJavaコードを ネイティブコンパイルしておく (libgraal/libjvmcicompiler)
  • 91. © 2020 NTT DATA Corporation 91 JVMとGraalVMは 互いに影響を 及ぼし合っている
  • 92. © 2020 NTT DATA Corporation 92 ただし、互いに 独立した開発 となっている
  • 93. © 2020 NTT DATA Corporation 93 GraalVMの3つの主機能 1. 新JITコンパイラによるパフォーマンス向上 2. JavaScript、Ruby、Pythonといった (JVM言語でない)言語を実行可能 3. アプリケーションをネイティブイメージにして JVMなしで実行可能 (JVMでの実行時とは異なる特性を持つ) みんなのJava OpenJDKから始まる大変革期! https://gihyo.jp/book/2020/978-4-297-11199-1
  • 94. © 2020 NTT DATA Corporation本資料に記載されている会社名、商品名、又はサービス名は、各社の登録商標又は商標です