O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

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

2020年10月22日
株式会社NTTデータ 技術開発本部
阪田 浩一

  • Entre para ver os comentários

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

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

×