SlideShare une entreprise Scribd logo
1  sur  40
Copyright©2021 NTT Corp. All Rights Reserved.
GraalVMのJavaネイティブビルド機能で
どの程度起動が速くなるのか?~サーバレス基盤上での評価~
2021.4.23
NTT OSSセンタ
クラウドの発展形態として注視が必要な主要潮流である “サーバレス化” に対応で
きる、新しいJava実行環境 GraalVM の Navitve Build 機能を検証し、優位性を確認し
ました。
加えて、サーバレス環境と試験ツールについて、広く使われている Knative および
Gatling などを用いて検証環境を構築したので、使用感を報告します。
Copyright©2021 NTT Corp. All Rights Reserved.
• 何 志滔
– chito.ho.yb@hco.ntt.co.jp
• 石井 佑弥
– yuya.ishii.wu@hco.ntt.co.jp
• 髙雄 慎二
– shinji.takao.hd@hco.ntt.co.jp
• NTT OSSセンタ で OpenJDKの技術サポートを担当
– oss-java-ml@hco.ntt.co.jp
2
自己紹介
Copyright©2021 NTT Corp. All Rights Reserved.
• 新しいJava実行環境 GraalVM の Native Build 機能の検証を行
いました。
• 本機能は、 “サーバレス化” 環境で長所を発揮するため、
“サーバレス環境” を構築して評価を行いました。
本検証について
サーバレス環境
ユーザニーズ
ビジネス環境
3
Copyright©2021 NTT Corp. All Rights Reserved.
背景
 “サーバレス” 環境(例 AWS lambda 等)が、クラウドの発展の次の主要な潮流
の一つと考えられ、注視が必要です。
クラウドへの単純
移行(リフト)
サービス不停止で継続
的に低コストでセキュ
リティアップデート
(DevSecOps)
クラウドネ
イティブ化
(シフト)
するか?
モチベーション1
マイクロサービス
・サーバレス環境
対応可能な方式を
選択
アプリケーション
は従来方式+イン
フラにコンテナを
使用するメリット
数年先の将来に
向けて今から検
証すべき事項
(先行調査)
NO YES
ビジネスロジックとインフラ
の切り離しによる、変更コス
ト軽減
無処理時間帯のインスタンス
停止によるサーバコスト軽減
モチベーション2
現状優先す
べき事項
4
Copyright©2021 NTT Corp. All Rights Reserved.
課題
◆サーバレス環境では、処理が無い時間帯に不要なインスタンス(Pod)を停止してリソースの
節約を行えることが長所です。
◆その長所を活かすためには、クラウドネイティブアプリケーションは稼働インスタンス数
がゼロの場合からスタートする「コールドスタート」時の性能が、従来アプリケーションよ
りも格段に速い必要があります。
HTTPクライアント
Auto Scaling group
Cloud
ゲートウェイ
ルーター
管理サービス
オートスケール
管理サービス
稼働インスタンス
(Pod)が無い状態
Auto Scaling group
Podを稼働させた状態
コールド
スタート
従来のアプリ
ケーション
十~数十秒
クラウドネイティブア
プリケーション
1秒以下~数秒
コールドスタート
性能がサービスの
品質に大きく影響
サービスメッシュ
5
Copyright©2021 NTT Corp. All Rights Reserved.
• GraalVMとは、Oracle社が開発した、複数のプログラム言語
をサポートするVM
– 2021年4月時点の最新版は version 21.0.0.2です。
– 起動速度等の検証は version 20.1.0 で行いました。最新版では、本報
告よりも速度性能が高い可能性があります。
– ネイティブビルドのデモは最新版の version 21.0.0.2 で行います。
• Native Buildとは、GraalVMが持つ機能の一つで、実行可能な
Native Imageを作成すること
– Native Imageは、普通のJava Applicationと違い、JVMを使用せずに
Executableとして運用できます。
• Native Buildのメリット
– 起動時間の短縮ができます。
– Memory Footprintを減らせます。
– 上記の二点は、クラウドネイティブアプリケーションでの性能向上や
パフォーマンス管理には重要です。
6
解決手段:GraalVM の Native Build
Copyright©2021 NTT Corp. All Rights Reserved.
• 従来のJavaアプリケーションの実行
– Java Virtual Machine (JVM) 上で実行することにより、複数プラット
フォームでもJavaソースコード、クラスファイルを変更せずに運用で
きることを重視しています。
– しかし、JVMそのものも多くのリソースを使います。例えば、
• GC(Garbage Collection)
• プログラムのメモリー管理
• Just-In-Time(JIT)コンパイル
• Native Image の実行
– JVMに代わって、Substrate (基盤) VMと呼ぶ形態の Virtual Machineを
使います。
– 従来のJITコンパイルに代わって、事前におこなうAhead-Of-
Time(AOT)コンパイルにより、実行時のコンパイルが不要となり、必
要リソースの減軽を期待できます。
– 従来のJVMとの別の実行プランや最適化をしているため、実行速度は
一般のJavaアプリケーションと異なる場合があります。
7
GraalVMのNative Build
Copyright©2021 NTT Corp. All Rights Reserved.
• Minikube
– ローカル環境でKubernetesを簡単に実行するためのツールです。
• 2021年4月時点最新版 version1.19 (Kubernetes v1.20)
• 検証は version 1.9で実施 (Kubernetes v1.18)
• Knative
– Knativeは、元々Google社から開発を始め、k8sの管理を便利化するプ
ラットフォームです。
– 本検証では、コールドスタートを行うことを目的に、 Knativeを使用
しました。
• 2021年4月時点最新版 version 0.23(検証は version 0.13で実施)
• Gatling
– JMeterより少ないメモリ使用量・スレッド数で動作する負荷試験ツー
ルです。
• 2021年4月時点最新版 version 3.5.1(検証は version 3.3.1 で実施)
• Tomcat
– Tomcat9 から、GraalVM Native Build に対応しています。
• 2021年4月時点最新版 version 10.0.5(検証は version 9.0.34 で実施)
8
その他、検証で使用したツール
Copyright©2021 NTT Corp. All Rights Reserved.
• GraalVM
– https://www.graalvm.org/
• Minikube
– https://kubernetes.io/ja/docs/setup/learning-environment/minikube/
• Knative
– https://cloud.google.com/knative
• Gatling
– https://gatling.io/
• Tomcat GraalVM Support
– https://ci.apache.org/projects/tomcat/tomcat9/docs/graal.html
9
参考URL
Copyright©2021 NTT Corp. All Rights Reserved.
Auto Scaling group
検証事項
◆本検証では、新しいJava実行環境「GraalVM」の「Native Build機能」、サーバレス環境「
knative」および検証ツール「Gatling」を用いて検証を行いました。
HTTPクライアント
シナリオ作成
負荷リクエスト実行
Auto Scaling group
ゲートウェイ
ルーター
管理サービス
オートスケール
管理サービス
稼働 Pod が
無い状態
Pod を稼働させた状態
◆以下は、近年注目され広く使用されているため、検証環境を構築する際に採用しました。
今回、構築、使用した所感を共有します。
◆GraalVMは、Oracle社が開発した、複数言語対応、クラウド対応を強化した次世代の言語実行環境。
◆ Knative は、サーバレスのクラウドネイティブ・アプリケーションをデプロイ・実行・管理するためのコンポーネント群
で、kubernetes上のほか、OpenShift上でも使用します。
◆Gatlingは、比較的少ないメモリ使用量・スレッド数で動作する負荷試験ツールです。
https://www.redhat.com/ja/topics/microservices/what-is-knative
https://dzone.com/articles/gatling-vs-jmeter
Tomcat9+example
アプリケーション
※Minikube
コールド
スタート
10
Copyright©2021 NTT Corp. All Rights Reserved.
• GraalVMによる Native Buildの性能優位性を確認
– Native Buildは通常のJava VMよりも起動速度が大幅に速い
– リクエスト処理速度もある程度向上(性能は劣化しない)
• その他の所感
– GraalVMのNative Buildでは、まだ色々な技術的問題点(※2)があり、今
後改善が見込まれるが、現時点の使用では注意すべき点あり
(※2) 次頁参照
11
結果
比較項目 通常の
Java VM
GraalVM
(Native Build)
GraalVM 所見
起動時間(Podを除
いたアプリ部分)
13,594ms 1,117ms 起動時間 91%以上短縮 (※1)
リクエスト処理性
能
平均1464ms 平均1223ms 処理性能ほぼ同じ(16%向上だが、
反復・誤差精査は未実施)
(※1)アプリケーションにより異なります。
Copyright©2021 NTT Corp. All Rights Reserved.
• Fat Jarの作成
– Jarとは、Javaのクラスファイルやメタデータ、リソースを一つのファ
イルにしたものです。
• 通常、Java Project の Deploy に使用します。
– Fat Jarとは、アプリケーションが使用しているライブラリと依存クラ
スを全て含めた Jar のことです。
• Dependencyが自己完結しているため、環境への依存性は普通のJarと比べ
て低いです。
– Fat Jarの作成は、すべてのライブラリをまとめる必要があります。こ
の点については、Projectの規模や使用しているライブラリによって難
易度が変わります。
– Maven等で依存性解決
12
GraalVMの課題(1)
Copyright©2021 NTT Corp. All Rights Reserved.
• Config Fileの作成
– 「クローズワールドの前提」(Closed world assumption)
• コンパイルする時、すべてのコードが既に揃っていること
• 動的操作がビルド時に列挙されていること
– 動的クラスローディングやProxy等
– Config Fileの作成は、Reflection対象のclassの洗い出しが必要です。
これはFat Jarと同じく、Projectの規模やReflectionの利用頻度よって
難易度が変わります。
– GraalがAgentを提供
– 参考
• https://www.graalvm.org/reference-manual/native-image/Limitations/
• 互換性
– 一部のライブラリがJVMとの仕様が変わっています。例えば
java.nio.charset
• https://github.com/oracle/graal/issues/1294
13
GraalVMの課題(2)
Copyright©2021 NTT Corp. All Rights Reserved.
確認・検証項目
Copyright©2021 NTT Corp. All Rights Reserved.
• 1. Native Buildの手順
• 2. 起動時間比較
• 3. リクエスト処理速度比較
15
確認・検証項目
Copyright©2021 NTT Corp. All Rights Reserved.
1. Native Build の手順
Copyright©2021 NTT Corp. All Rights Reserved.
• Apache Tomcatの「Example」Web applicationをNative Build
することにより、Native Buildの手順を確認します。
– Apache Tomcatは、GitHub上の公式リポジトリ 9.0.x Branch、ビルド
資材は、Master Branch の modules/stuffed ディレクトリ*のものを使
用します。
* 構成は常に変化しますので都度確認してください。今回、ネイティ
ブビルドのデモ動画は、Tomcat 10.0.5 で撮り直しました。
– 使用するWeb applicationは
https://tomcat.apache.org/download-90.cgi
からTomcatをダウンロードし、webappsフォルダー内のexamplesを
使用します。
17
1. Native Buildの手順 はじめに
Copyright©2021 NTT Corp. All Rights Reserved.
• Fat Jar 作成
– Apache TomcatではApache Mavenを利用し、Fat Jarを作成するソース
とMaven build用のPOMファイルを提供しています。
– Fat Jarを作成する際、JSPを先にPre-Compileし、.class Fileにする必要
があります。Apache Tomcatでは、この手順をこなすAntファイルを
提供しています。
18
1. Native Buildの手順(1)
Copyright©2021 NTT Corp. All Rights Reserved.
• Config Fileの作成
– ReflectionやJNI、Class Path Resources等動的に生成されるものを含め
るよう指定するため、Config Fileが必要になります。(詳細は
GraalVMの公式サイトを参照)。
– 上記のConfig Fileの準備をより簡単に進めるよう、GraalVMでは、
Trace Agentというツールを提供しています。
– Trace AgentをApplicationにアタッチして実行すれば、 Config Fileが
生成されます。
19
1. Native Buildの手順(2)
Copyright©2021 NTT Corp. All Rights Reserved.
ネイティブビルドの様子(動画)
20
graalvm 21.0.0.2
Tomcat 10.0.5
(2021.4 時点の最新版)
Copyright©2021 NTT Corp. All Rights Reserved.
2. 起動時間比較
Copyright©2021 NTT Corp. All Rights Reserved.
• GraalVMで作成したNative Imageと通常のJVMで起動する場
合の起動時間を比較します。
• Native Imageが提唱している「起動時間の短縮」を確認しま
す。
22
2. 起動時間比較 はじめに
Copyright©2021 NTT Corp. All Rights Reserved.
0
500
1000
1500
2000
2500
3000
3500
4000
Non-Native Native Image
起動時間
起動時間(ms) Webappsデプロイ時間(ms)
23
2. 起動時間比較(通常環境)
Webappsデプロイ完了ま
での時間はNon-Nativeの
3%
(ms)
起動時間 デプロイ時
間
総計
(1) Native
Build
20
ms
98
ms
118.6
ms
(2) JVM 1,593
ms
1,895
ms
3,488.6
ms
(1)/(2) 1.25% 5.17% 3.4%
Copyright©2021 NTT Corp. All Rights Reserved.
• 通常サーバ上で、Apache Tomcat起動(Web Applicationのデ
プロイ完了まで)の時間を比較
• Native Build
2020/04/24 22:33:51:784464046
中略
tomcat: [Apr 24, 2020 10:33:51.902650000 PM] INFO: org.apache.catalina.startup.HostConfig deployDirectory -
Deployment of web application directory [/home/user/workdir/tomcat/res/tomcat-maven/webapps/examples] has
finished in [98] ms
tomcat: [Apr 24, 2020 10:33:51.903057000 PM] INFO: org.apache.coyote.AbstractProtocol start - Starting ProtocolHandler
["http-nio-8080"]
• Non-Native
2020/04/24 22:33:41:034610412
中略
tomcat: [4月 24, 2020 10:33:44.506315000 午後] 情報: org.apache.catalina.startup.HostConfig deployDirectory -
Deployment of web application directory [/home/user/workdir/tomcat/res/tomcat-maven/webapps/examples] has
finished in [1,895] ms
tomcat: [4月 24, 2020 10:33:44.523195000 午後] 情報: org.apache.coyote.AbstractProtocol start - Starting ProtocolHandler
["http-nio-8080"]
Full logは、本資料末尾に記載。
24
【参考】通常サーバ環境での起動時間ログ
118.592954 ms
3,488.584588 ms
Copyright©2021 NTT Corp. All Rights Reserved.
0
5000
10000
15000
20000
25000
30000
Non-Native Native Image
起動時間
Pods反応までの時間(ms) 起動時間(ms) Webappsデプロイ時間(ms)
25
2. 起動時間比較(Knative環境)
リクエストからWebappsをデプロ
イ完了までの時間はNon-Native
の23%
Pods起動時間の差は…
1. Base Imageの違い?
2. JavaプロセスのImagesの処理の違い?
*Base Image については次頁を参照
Pods反
応時間
起動時間 デプロイ
時間
起動+デ
プロイ小
計
総計
(1) Native
Build
5,107
ms
219
ms
898
ms
1,117
ms
6,224
ms
(2) JVM 13,369
ms
5,750
ms
7,844
ms
13,594
ms
26,963
ms
(1)/(2) 38.2% 3.8% 11.4% 8.21% 23%
(ms)
Copyright©2021 NTT Corp. All Rights Reserved.
Native Build
2020/06/05 14:21:26:889692121
tomcat: [Jun 05, 2020 2:21:31.996593000 PM] SEVERE: org.apache.catalina.startup.Catalina initDirs - Cannot find
specified temporary folder at [/var/tmp/]
tomcat: [Jun 05, 2020 2:21:32.159568000 PM] INFO: org.apache.catalina.startup.VersionLoggerListener log - Server version
name: Apache Tomcat/9.0.33
中略
tomcat: [Jun 05, 2020 2:21:32.195433000 PM] INFO: org.apache.coyote.AbstractProtocol init - Initializing ProtocolHandler
["http-nio-8080"]
tomcat: [Jun 05, 2020 2:21:32.208363000 PM] INFO: org.apache.catalina.startup.Catalina load - Server initialization in
[219] milliseconds
中略
tomcat: [Jun 05, 2020 2:21:33.154692000 PM] INFO: org.apache.catalina.startup.HostConfig deployDirectory -
Deployment of web application directory [/deployments/webapps/examples] has finished in [898] ms
tomcat: [Jun 05, 2020 2:21:33.157470000 PM] INFO: org.apache.coyote.AbstractProtocol start - Starting ProtocolHandler
["http-nio-8080"]
中略
tomcat: [Jun 05, 2020 2:21:35.095745000 PM] INFO: org.apache.catalina.core.ApplicationContext log - SessionListener:
sessionCreated('12D54EC0C2464640C9B66CD6B5AC3122')
System time call back (1591334495097)
Fri Jun 05 2020 14:21:35(JPT)
2020/06/05 14:21:35:111728731
26
【参考】コールドスタート時間比較ログ
Copyright©2021 NTT Corp. All Rights Reserved.
Non Native Build
2020/06/05 14:21:35:111728731
tomcat: [Jun 05, 2020 5:21:48.507099000 AM] INFO: org.apache.catalina.startup.VersionLoggerListener log - Server
version name: Apache Tomcat/9.0.33
中略
tomcat: [Jun 05, 2020 5:21:51.717869000 AM] INFO: org.apache.catalina.startup.Catalina load - Server initialization in
[5,750] milliseconds
tomcat: [Jun 05, 2020 5:21:52.411354000 AM] INFO: org.apache.catalina.core.StandardService startInternal - Starting
service [Catalina]
tomcat: [Jun 05, 2020 5:21:52.432468000 AM] INFO: org.apache.catalina.core.StandardEngine startInternal - Starting
Servlet engine: [Apache Tomcat/9.0.33]
tomcat: [Jun 05, 2020 5:21:52.538791000 AM] INFO: org.apache.catalina.startup.HostConfig deployDirectory - Deploying
web application directory [/deployments/webapps/examples]
tomcat: [Jun 05, 2020 5:22:00.232303000 AM] WARNING: org.apache.catalina.util.SessionIdGeneratorBase
createSecureRandom - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [195]
milliseconds.
tomcat: [Jun 05, 2020 5:22:00.382143000 AM] INFO: org.apache.catalina.startup.HostConfig deployDirectory -
Deployment of web application directory [/deployments/webapps/examples] has finished in [7,844] ms
tomcat: [Jun 05, 2020 5:22:00.411739000 AM] INFO: org.apache.coyote.AbstractProtocol start - Starting ProtocolHandler
["http-nio-8080"]
System time call back (1591334521588)
Fri Jun 05 2020 05:22:01(UTC)  Fri Jun 05 2020 14:22:01(JPT)
2020/06/05 14:22:01:647886909
27
【参考】コールドスタート時間比較ログ
Copyright©2021 NTT Corp. All Rights Reserved.
Native Build JVM
Base Images 5.2MB(busybox:glibc) 627MB(openjdk:11-jdk)
With Application Images 83.3MB 647MB
28
2. イメージサイズの比較
合計のImages Size約87%減
busybox:glibc
https://index.docker.io/_/busybox
https://github.com/docker-library/busybox
openjdk:11-jdk
https://index.docker.io/_/openjdk
https://github.com/docker-library/openjdk/tree/master/11/jdk
Copyright©2021 NTT Corp. All Rights Reserved.
29
【参考】イメージサイズ確認コマンド
[user@localhost tomcat-maven]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dev.local/apache/tomcat-maven-native 1.0 b112fb4bfafb 9 days ago 83.3 MB
dev.local/apache/tomcat-maven 1.0 9d5f67e93fc7 12 days ago 647 MB
busybox glibc 7a2331af2292 2 weeks ago 5.2 MB
openjdk 11 22b5134fcd55 4 weeks ago 627 MB
gcr.io/knative-releases/knative.dev/net-istio/cmd/controller <none> 4b229b0760f4 2 months ago 61.5 MB
gcr.io/knative-releases/knative.dev/net-istio/cmd/webhook <none> 8b13dd01e81b 2 months ago 55.2 MB
k8s.gcr.io/kube-proxy v1.18.0 43940c34f24f 2 months ago 117 MB
k8s.gcr.io/kube-controller-manager v1.18.0 d3e55153f52f 2 months ago 162 MB
k8s.gcr.io/kube-scheduler v1.18.0 a31f78c7c8ce 2 months ago 95.3 MB
k8s.gcr.io/kube-apiserver v1.18.0 74060cea7f70 2 months ago 173 MB
kubernetesui/dashboard v2.0.0-rc6 cdc71b5a8a0e 3 months ago 221 MB
gcr.io/knative-releases/knative.dev/serving/cmd/networking/istio <none> bfd5835bb3e2 3 months ago 61.6 MB
gcr.io/knative-releases/knative.dev/serving/cmd/autoscaler <none> ad6d1ef57b5c 3 months ago 68.3 MB
gcr.io/knative-releases/knative.dev/serving/cmd/webhook <none> 50e786c7b248 3 months ago 58.2 MB
gcr.io/knative-releases/knative.dev/serving/cmd/controller <none> 38017b623e91 3 months ago 61.3 MB
gcr.io/knative-releases/knative.dev/serving/cmd/queue <none> 4b940fa4fdd3 3 months ago 53.1 MB
gcr.io/knative-releases/knative.dev/serving/cmd/activator <none> d9d1603fac36 3 months ago 60.6 MB
istio/proxyv2 1.4.6 a4912a7fd5d1 3 months ago 256 MB
istio/pilot 1.4.6 baf12191b2ac 3 months ago 214 MB
k8s.gcr.io/pause 3.2 80d28bedfe5d 4 months ago 683 kB
k8s.gcr.io/coredns 1.6.7 67da37a9a360 4 months ago 43.8 MB
kindest/kindnetd 0.5.3 aa67fec7d7ef 7 months ago 78.5 MB
k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 7 months ago 288 MB
kubernetesui/metrics-scraper v1.0.2 3b08661dc379 7 months ago 40.1 MB
gcr.io/knative-samples/knative-route-demo <none> c56acfb871f9 2 years ago 14.7 MB
gcr.io/knative-samples/knative-route-demo <none> 6120ad7d128e 2 years ago 14.7 MB
gcr.io/k8s-minikube/storage-provisioner v1.8.1 4689081edb10 2 years ago 80.8 MB
Copyright©2021 NTT Corp. All Rights Reserved.
3. リクエスト処理速度比較
Copyright©2021 NTT Corp. All Rights Reserved.
• Gatlingを使い、HTTPのResponse Timeを比較します。
• Native Imageでのリクエスト処理速度と通常のJava VMでの
リクエスト処理速度の差を確認します。
31
3. リクエスト処理速度比較 はじめに
Copyright©2021 NTT Corp. All Rights Reserved.
• GatlingでHTTP Response Timeを記録します。
– HTTP Request  Tomcat receive request  Requestに応じてクラス
ローディング 実行結果をResponseとして返事  HTTP Response
– よって、HTTP Responseは、クラスローディングに大きく左右されま
す。
• Gatlingとは、オープンソースのLoad Testツールです。
– 「Scenario」と言うTest caseが必要です。
• Bundle版では、実際のブラウザでの行動をトラックして「Scenario」を
生成するツールを提供しています。
• https://gatling.io/docs/current/quickstart/
– Gatlingを通じて「Virtual user」を生成して、「Scenario」を実行する
ことによってLoad Testを行います。
32
3. リクエスト処理速度の測定
Copyright©2021 NTT Corp. All Rights Reserved.
• 行ごとに各End point(e.g. /index.jsp)に対してのLoad Test結果が示されま
す。
• 一番上の行(Global Information)が全データをまとめた数値です。
• 数値が小さい=Responseが速い=実行速度が速いことを意味します。
33
3. 測定結果の見方
Copyright©2021 NTT Corp. All Rights Reserved.
Response Time
Global
Information
99th Pct Max Mean
19,750 ms 30,425 ms 949m
s
Response Time
Global
Information
99th Pct Max Mean
20,269 ms 31,463 ms 970ms
34
3. リクエスト処理速度比較(通常環境)
Non Native Native
リクエスト処理にかかる時間の最大値(99%内と全て)と平均値に注目
Copyright©2021 NTT Corp. All Rights Reserved.
35
3. リクエスト処理速度比較(通常環境)
0
5000
10000
15000
20000
25000
30000
35000
99pct Max Mean
実行速度
Non Native Native Image
差は3%以下
(ms)
Copyright©2021 NTT Corp. All Rights Reserved.
Response Time
Global
Information
99th Pct Max Mean
25,916 ms 31,372 ms 1,464ms
Response Time
Global
Informatio
n
99th Pct Max Mean
22,562 ms 31,002 ms 1,223ms
36
3. リクエスト処理速度比較(Knative環境)
Non Native Native
リクエスト処理にかかる時間の最大値(99%内と全て)と平均値に注目
Copyright©2021 NTT Corp. All Rights Reserved.
37
3. リクエスト処理速度比較(Knative環境)
0
5000
10000
15000
20000
25000
30000
35000
99pct Max Mean
実行速度
Non Native Native Image
差は1%前
後
(ms)
Copyright©2021 NTT Corp. All Rights Reserved.
0
50
100
150
200
250
300
350
400
450
ベア環境 k8s Pods
アプリケーションのメモリ利用率
Java Application Native Build
38
3. リソース利用(参考)
MiB
Non Native (1) Native
Build(2)
(2)/(1)
ベア環境 412.484375 42.4453125 10.2%
k8s Pods 139 40 28.7%
【参考】Metrics serverを利用し、k8sのpods
のリソース運用をモニタリングできる
*注意*
今回の検証では、Minikubeを使っています。
デフォルトで2GBが割り当てています
ホスト環境による
Heapサイズ差別
Copyright©2021 NTT Corp. All Rights Reserved.
まとめ
Copyright©2021 NTT Corp. All Rights Reserved.
• GraalVMのNative Buildの手順を確認できました。(Apache Tomcatをベー
スに)
• 起動時間の比較結果より、Native Buildは通常のJava VMよりも起動速度
が大幅に速いことが確認できました。
• Gatlingで連続したリクエスト処理の性能を比較したところ、起動時の比
較とは異なり、Native Build は優位ではなかったが、大きな性能低下は無
いことが確認できました。
• 総合的には、GraalVMによる Native Buildの優位性を確認できました。
– ただし、ビルド手順など今後の改善に期待したい箇所もあります。
40
まとめ
GraalVM
(Native Build)
通常のJava VM
起動時間 ☆☆☆☆☆ ☆ 3%以下で起動
リクエスト処理性能 ☆☆☆ ☆☆☆ 性能差異は1%前後
総合評価 ☆☆☆☆ ☆☆

Contenu connexe

Tendances

Tendances (20)

PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
PostgreSQLクエリ実行の基礎知識 ~Explainを読み解こう~
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
 
分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)分散トレーシング技術について(Open tracingやjaeger)
分散トレーシング技術について(Open tracingやjaeger)
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
とにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みるとにかく分かりづらいTwelve-Factor Appの解説を試みる
とにかく分かりづらいTwelve-Factor Appの解説を試みる
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
PostgreSQLモニタリングの基本とNTTデータが追加したモニタリング新機能(Open Source Conference 2021 Online F...
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 
Fluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターンFluentdのお勧めシステム構成パターン
Fluentdのお勧めシステム構成パターン
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線コンテナネットワーキング(CNI)最前線
コンテナネットワーキング(CNI)最前線
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方ストリーム処理を支えるキューイングシステムの選び方
ストリーム処理を支えるキューイングシステムの選び方
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 

Similaire à GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's Java native build feature launch Java programs? -Evaluation on a serverless platform-

20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会
samemoon
 
20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会
samemoon
 
Osc spring cloud_stack20130223
Osc spring cloud_stack20130223Osc spring cloud_stack20130223
Osc spring cloud_stack20130223
Noriko Suto
 
Open stack reference architecture v1 2
Open stack reference architecture v1 2Open stack reference architecture v1 2
Open stack reference architecture v1 2
Dell TechCenter Japan
 
Agileツール適合化分科会(構成管理・ビルドツール)
Agileツール適合化分科会(構成管理・ビルドツール)Agileツール適合化分科会(構成管理・ビルドツール)
Agileツール適合化分科会(構成管理・ビルドツール)
masanori kataoka
 
OSC 2013.Cloud@Osaka
OSC 2013.Cloud@OsakaOSC 2013.Cloud@Osaka
OSC 2013.Cloud@Osaka
samemoon
 

Similaire à GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's Java native build feature launch Java programs? -Evaluation on a serverless platform- (20)

GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
GraalVMを3つの主機能から眺めてみよう(Oracle Groundbreakers APAC Virtual Tour 2020 講演資料)
 
20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会20130803 OSC@Kyoto CloudStackユーザー会
20130803 OSC@Kyoto CloudStackユーザー会
 
Introduction to Magnum (JP)
Introduction to Magnum (JP)Introduction to Magnum (JP)
Introduction to Magnum (JP)
 
20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会20130714 July Tech Festa 日本CloudStackユーザー会
20130714 July Tech Festa 日本CloudStackユーザー会
 
Osc spring cloud_stack20130223
Osc spring cloud_stack20130223Osc spring cloud_stack20130223
Osc spring cloud_stack20130223
 
第9回しゃちほこオラクル倶楽部
第9回しゃちほこオラクル倶楽部第9回しゃちほこオラクル倶楽部
第9回しゃちほこオラクル倶楽部
 
CloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloudCloudStackユーザ会 OSC.cloud
CloudStackユーザ会 OSC.cloud
 
Oracle Cloud IaaS活用:VMwareをそのままパブリック・クラウドへ&Windowsならオラクル [Oracle Cloud Days T...
Oracle Cloud IaaS活用:VMwareをそのままパブリック・クラウドへ&Windowsならオラクル [Oracle Cloud Days T...Oracle Cloud IaaS活用:VMwareをそのままパブリック・クラウドへ&Windowsならオラクル [Oracle Cloud Days T...
Oracle Cloud IaaS活用:VMwareをそのままパブリック・クラウドへ&Windowsならオラクル [Oracle Cloud Days T...
 
【Oracle Cloud ウェビナー】WebLogic Serverのご紹介
【Oracle Cloud ウェビナー】WebLogic Serverのご紹介【Oracle Cloud ウェビナー】WebLogic Serverのご紹介
【Oracle Cloud ウェビナー】WebLogic Serverのご紹介
 
Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)Apache CloudStack 4.0 インストール(ver0.5)
Apache CloudStack 4.0 インストール(ver0.5)
 
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
[OracleCodeTokyo2019] Kubernetesで実現する運用自動化の新しいアプローチとは
 
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月
Yahoo!Japan北米DCでOCPのツボをみせてもらってきました - OpenStack最新情報セミナー 2016年5月
 
Open stack reference architecture v1 2
Open stack reference architecture v1 2Open stack reference architecture v1 2
Open stack reference architecture v1 2
 
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
JSUG 2018/02/05 SpringOnePlatform2017参加報告 プラットフォーム関連のお話
 
CloudSpiral 2014年度 Webアプリ講義(2日目)
CloudSpiral 2014年度 Webアプリ講義(2日目)CloudSpiral 2014年度 Webアプリ講義(2日目)
CloudSpiral 2014年度 Webアプリ講義(2日目)
 
Agileツール適合化分科会(構成管理・ビルドツール)
Agileツール適合化分科会(構成管理・ビルドツール)Agileツール適合化分科会(構成管理・ビルドツール)
Agileツール適合化分科会(構成管理・ビルドツール)
 
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
[Modern Cloud Day Tokyo 2019] Oracle CloudでDevOps!?Javaアプリケーションのモダン開発を支援するOra...
 
OSC 2013.Cloud@Osaka
OSC 2013.Cloud@OsakaOSC 2013.Cloud@Osaka
OSC 2013.Cloud@Osaka
 
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
Oracle Container Engine for Kubernetes (OKE) ご紹介 [2021年5月版]
 
Node.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたことNode.jsアプリの開発をモダン化するために取り組んできたこと
Node.jsアプリの開発をモダン化するために取り組んできたこと
 

GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's Java native build feature launch Java programs? -Evaluation on a serverless platform-

  • 1. Copyright©2021 NTT Corp. All Rights Reserved. GraalVMのJavaネイティブビルド機能で どの程度起動が速くなるのか?~サーバレス基盤上での評価~ 2021.4.23 NTT OSSセンタ クラウドの発展形態として注視が必要な主要潮流である “サーバレス化” に対応で きる、新しいJava実行環境 GraalVM の Navitve Build 機能を検証し、優位性を確認し ました。 加えて、サーバレス環境と試験ツールについて、広く使われている Knative および Gatling などを用いて検証環境を構築したので、使用感を報告します。
  • 2. Copyright©2021 NTT Corp. All Rights Reserved. • 何 志滔 – chito.ho.yb@hco.ntt.co.jp • 石井 佑弥 – yuya.ishii.wu@hco.ntt.co.jp • 髙雄 慎二 – shinji.takao.hd@hco.ntt.co.jp • NTT OSSセンタ で OpenJDKの技術サポートを担当 – oss-java-ml@hco.ntt.co.jp 2 自己紹介
  • 3. Copyright©2021 NTT Corp. All Rights Reserved. • 新しいJava実行環境 GraalVM の Native Build 機能の検証を行 いました。 • 本機能は、 “サーバレス化” 環境で長所を発揮するため、 “サーバレス環境” を構築して評価を行いました。 本検証について サーバレス環境 ユーザニーズ ビジネス環境 3
  • 4. Copyright©2021 NTT Corp. All Rights Reserved. 背景  “サーバレス” 環境(例 AWS lambda 等)が、クラウドの発展の次の主要な潮流 の一つと考えられ、注視が必要です。 クラウドへの単純 移行(リフト) サービス不停止で継続 的に低コストでセキュ リティアップデート (DevSecOps) クラウドネ イティブ化 (シフト) するか? モチベーション1 マイクロサービス ・サーバレス環境 対応可能な方式を 選択 アプリケーション は従来方式+イン フラにコンテナを 使用するメリット 数年先の将来に 向けて今から検 証すべき事項 (先行調査) NO YES ビジネスロジックとインフラ の切り離しによる、変更コス ト軽減 無処理時間帯のインスタンス 停止によるサーバコスト軽減 モチベーション2 現状優先す べき事項 4
  • 5. Copyright©2021 NTT Corp. All Rights Reserved. 課題 ◆サーバレス環境では、処理が無い時間帯に不要なインスタンス(Pod)を停止してリソースの 節約を行えることが長所です。 ◆その長所を活かすためには、クラウドネイティブアプリケーションは稼働インスタンス数 がゼロの場合からスタートする「コールドスタート」時の性能が、従来アプリケーションよ りも格段に速い必要があります。 HTTPクライアント Auto Scaling group Cloud ゲートウェイ ルーター 管理サービス オートスケール 管理サービス 稼働インスタンス (Pod)が無い状態 Auto Scaling group Podを稼働させた状態 コールド スタート 従来のアプリ ケーション 十~数十秒 クラウドネイティブア プリケーション 1秒以下~数秒 コールドスタート 性能がサービスの 品質に大きく影響 サービスメッシュ 5
  • 6. Copyright©2021 NTT Corp. All Rights Reserved. • GraalVMとは、Oracle社が開発した、複数のプログラム言語 をサポートするVM – 2021年4月時点の最新版は version 21.0.0.2です。 – 起動速度等の検証は version 20.1.0 で行いました。最新版では、本報 告よりも速度性能が高い可能性があります。 – ネイティブビルドのデモは最新版の version 21.0.0.2 で行います。 • Native Buildとは、GraalVMが持つ機能の一つで、実行可能な Native Imageを作成すること – Native Imageは、普通のJava Applicationと違い、JVMを使用せずに Executableとして運用できます。 • Native Buildのメリット – 起動時間の短縮ができます。 – Memory Footprintを減らせます。 – 上記の二点は、クラウドネイティブアプリケーションでの性能向上や パフォーマンス管理には重要です。 6 解決手段:GraalVM の Native Build
  • 7. Copyright©2021 NTT Corp. All Rights Reserved. • 従来のJavaアプリケーションの実行 – Java Virtual Machine (JVM) 上で実行することにより、複数プラット フォームでもJavaソースコード、クラスファイルを変更せずに運用で きることを重視しています。 – しかし、JVMそのものも多くのリソースを使います。例えば、 • GC(Garbage Collection) • プログラムのメモリー管理 • Just-In-Time(JIT)コンパイル • Native Image の実行 – JVMに代わって、Substrate (基盤) VMと呼ぶ形態の Virtual Machineを 使います。 – 従来のJITコンパイルに代わって、事前におこなうAhead-Of- Time(AOT)コンパイルにより、実行時のコンパイルが不要となり、必 要リソースの減軽を期待できます。 – 従来のJVMとの別の実行プランや最適化をしているため、実行速度は 一般のJavaアプリケーションと異なる場合があります。 7 GraalVMのNative Build
  • 8. Copyright©2021 NTT Corp. All Rights Reserved. • Minikube – ローカル環境でKubernetesを簡単に実行するためのツールです。 • 2021年4月時点最新版 version1.19 (Kubernetes v1.20) • 検証は version 1.9で実施 (Kubernetes v1.18) • Knative – Knativeは、元々Google社から開発を始め、k8sの管理を便利化するプ ラットフォームです。 – 本検証では、コールドスタートを行うことを目的に、 Knativeを使用 しました。 • 2021年4月時点最新版 version 0.23(検証は version 0.13で実施) • Gatling – JMeterより少ないメモリ使用量・スレッド数で動作する負荷試験ツー ルです。 • 2021年4月時点最新版 version 3.5.1(検証は version 3.3.1 で実施) • Tomcat – Tomcat9 から、GraalVM Native Build に対応しています。 • 2021年4月時点最新版 version 10.0.5(検証は version 9.0.34 で実施) 8 その他、検証で使用したツール
  • 9. Copyright©2021 NTT Corp. All Rights Reserved. • GraalVM – https://www.graalvm.org/ • Minikube – https://kubernetes.io/ja/docs/setup/learning-environment/minikube/ • Knative – https://cloud.google.com/knative • Gatling – https://gatling.io/ • Tomcat GraalVM Support – https://ci.apache.org/projects/tomcat/tomcat9/docs/graal.html 9 参考URL
  • 10. Copyright©2021 NTT Corp. All Rights Reserved. Auto Scaling group 検証事項 ◆本検証では、新しいJava実行環境「GraalVM」の「Native Build機能」、サーバレス環境「 knative」および検証ツール「Gatling」を用いて検証を行いました。 HTTPクライアント シナリオ作成 負荷リクエスト実行 Auto Scaling group ゲートウェイ ルーター 管理サービス オートスケール 管理サービス 稼働 Pod が 無い状態 Pod を稼働させた状態 ◆以下は、近年注目され広く使用されているため、検証環境を構築する際に採用しました。 今回、構築、使用した所感を共有します。 ◆GraalVMは、Oracle社が開発した、複数言語対応、クラウド対応を強化した次世代の言語実行環境。 ◆ Knative は、サーバレスのクラウドネイティブ・アプリケーションをデプロイ・実行・管理するためのコンポーネント群 で、kubernetes上のほか、OpenShift上でも使用します。 ◆Gatlingは、比較的少ないメモリ使用量・スレッド数で動作する負荷試験ツールです。 https://www.redhat.com/ja/topics/microservices/what-is-knative https://dzone.com/articles/gatling-vs-jmeter Tomcat9+example アプリケーション ※Minikube コールド スタート 10
  • 11. Copyright©2021 NTT Corp. All Rights Reserved. • GraalVMによる Native Buildの性能優位性を確認 – Native Buildは通常のJava VMよりも起動速度が大幅に速い – リクエスト処理速度もある程度向上(性能は劣化しない) • その他の所感 – GraalVMのNative Buildでは、まだ色々な技術的問題点(※2)があり、今 後改善が見込まれるが、現時点の使用では注意すべき点あり (※2) 次頁参照 11 結果 比較項目 通常の Java VM GraalVM (Native Build) GraalVM 所見 起動時間(Podを除 いたアプリ部分) 13,594ms 1,117ms 起動時間 91%以上短縮 (※1) リクエスト処理性 能 平均1464ms 平均1223ms 処理性能ほぼ同じ(16%向上だが、 反復・誤差精査は未実施) (※1)アプリケーションにより異なります。
  • 12. Copyright©2021 NTT Corp. All Rights Reserved. • Fat Jarの作成 – Jarとは、Javaのクラスファイルやメタデータ、リソースを一つのファ イルにしたものです。 • 通常、Java Project の Deploy に使用します。 – Fat Jarとは、アプリケーションが使用しているライブラリと依存クラ スを全て含めた Jar のことです。 • Dependencyが自己完結しているため、環境への依存性は普通のJarと比べ て低いです。 – Fat Jarの作成は、すべてのライブラリをまとめる必要があります。こ の点については、Projectの規模や使用しているライブラリによって難 易度が変わります。 – Maven等で依存性解決 12 GraalVMの課題(1)
  • 13. Copyright©2021 NTT Corp. All Rights Reserved. • Config Fileの作成 – 「クローズワールドの前提」(Closed world assumption) • コンパイルする時、すべてのコードが既に揃っていること • 動的操作がビルド時に列挙されていること – 動的クラスローディングやProxy等 – Config Fileの作成は、Reflection対象のclassの洗い出しが必要です。 これはFat Jarと同じく、Projectの規模やReflectionの利用頻度よって 難易度が変わります。 – GraalがAgentを提供 – 参考 • https://www.graalvm.org/reference-manual/native-image/Limitations/ • 互換性 – 一部のライブラリがJVMとの仕様が変わっています。例えば java.nio.charset • https://github.com/oracle/graal/issues/1294 13 GraalVMの課題(2)
  • 14. Copyright©2021 NTT Corp. All Rights Reserved. 確認・検証項目
  • 15. Copyright©2021 NTT Corp. All Rights Reserved. • 1. Native Buildの手順 • 2. 起動時間比較 • 3. リクエスト処理速度比較 15 確認・検証項目
  • 16. Copyright©2021 NTT Corp. All Rights Reserved. 1. Native Build の手順
  • 17. Copyright©2021 NTT Corp. All Rights Reserved. • Apache Tomcatの「Example」Web applicationをNative Build することにより、Native Buildの手順を確認します。 – Apache Tomcatは、GitHub上の公式リポジトリ 9.0.x Branch、ビルド 資材は、Master Branch の modules/stuffed ディレクトリ*のものを使 用します。 * 構成は常に変化しますので都度確認してください。今回、ネイティ ブビルドのデモ動画は、Tomcat 10.0.5 で撮り直しました。 – 使用するWeb applicationは https://tomcat.apache.org/download-90.cgi からTomcatをダウンロードし、webappsフォルダー内のexamplesを 使用します。 17 1. Native Buildの手順 はじめに
  • 18. Copyright©2021 NTT Corp. All Rights Reserved. • Fat Jar 作成 – Apache TomcatではApache Mavenを利用し、Fat Jarを作成するソース とMaven build用のPOMファイルを提供しています。 – Fat Jarを作成する際、JSPを先にPre-Compileし、.class Fileにする必要 があります。Apache Tomcatでは、この手順をこなすAntファイルを 提供しています。 18 1. Native Buildの手順(1)
  • 19. Copyright©2021 NTT Corp. All Rights Reserved. • Config Fileの作成 – ReflectionやJNI、Class Path Resources等動的に生成されるものを含め るよう指定するため、Config Fileが必要になります。(詳細は GraalVMの公式サイトを参照)。 – 上記のConfig Fileの準備をより簡単に進めるよう、GraalVMでは、 Trace Agentというツールを提供しています。 – Trace AgentをApplicationにアタッチして実行すれば、 Config Fileが 生成されます。 19 1. Native Buildの手順(2)
  • 20. Copyright©2021 NTT Corp. All Rights Reserved. ネイティブビルドの様子(動画) 20 graalvm 21.0.0.2 Tomcat 10.0.5 (2021.4 時点の最新版)
  • 21. Copyright©2021 NTT Corp. All Rights Reserved. 2. 起動時間比較
  • 22. Copyright©2021 NTT Corp. All Rights Reserved. • GraalVMで作成したNative Imageと通常のJVMで起動する場 合の起動時間を比較します。 • Native Imageが提唱している「起動時間の短縮」を確認しま す。 22 2. 起動時間比較 はじめに
  • 23. Copyright©2021 NTT Corp. All Rights Reserved. 0 500 1000 1500 2000 2500 3000 3500 4000 Non-Native Native Image 起動時間 起動時間(ms) Webappsデプロイ時間(ms) 23 2. 起動時間比較(通常環境) Webappsデプロイ完了ま での時間はNon-Nativeの 3% (ms) 起動時間 デプロイ時 間 総計 (1) Native Build 20 ms 98 ms 118.6 ms (2) JVM 1,593 ms 1,895 ms 3,488.6 ms (1)/(2) 1.25% 5.17% 3.4%
  • 24. Copyright©2021 NTT Corp. All Rights Reserved. • 通常サーバ上で、Apache Tomcat起動(Web Applicationのデ プロイ完了まで)の時間を比較 • Native Build 2020/04/24 22:33:51:784464046 中略 tomcat: [Apr 24, 2020 10:33:51.902650000 PM] INFO: org.apache.catalina.startup.HostConfig deployDirectory - Deployment of web application directory [/home/user/workdir/tomcat/res/tomcat-maven/webapps/examples] has finished in [98] ms tomcat: [Apr 24, 2020 10:33:51.903057000 PM] INFO: org.apache.coyote.AbstractProtocol start - Starting ProtocolHandler ["http-nio-8080"] • Non-Native 2020/04/24 22:33:41:034610412 中略 tomcat: [4月 24, 2020 10:33:44.506315000 午後] 情報: org.apache.catalina.startup.HostConfig deployDirectory - Deployment of web application directory [/home/user/workdir/tomcat/res/tomcat-maven/webapps/examples] has finished in [1,895] ms tomcat: [4月 24, 2020 10:33:44.523195000 午後] 情報: org.apache.coyote.AbstractProtocol start - Starting ProtocolHandler ["http-nio-8080"] Full logは、本資料末尾に記載。 24 【参考】通常サーバ環境での起動時間ログ 118.592954 ms 3,488.584588 ms
  • 25. Copyright©2021 NTT Corp. All Rights Reserved. 0 5000 10000 15000 20000 25000 30000 Non-Native Native Image 起動時間 Pods反応までの時間(ms) 起動時間(ms) Webappsデプロイ時間(ms) 25 2. 起動時間比較(Knative環境) リクエストからWebappsをデプロ イ完了までの時間はNon-Native の23% Pods起動時間の差は… 1. Base Imageの違い? 2. JavaプロセスのImagesの処理の違い? *Base Image については次頁を参照 Pods反 応時間 起動時間 デプロイ 時間 起動+デ プロイ小 計 総計 (1) Native Build 5,107 ms 219 ms 898 ms 1,117 ms 6,224 ms (2) JVM 13,369 ms 5,750 ms 7,844 ms 13,594 ms 26,963 ms (1)/(2) 38.2% 3.8% 11.4% 8.21% 23% (ms)
  • 26. Copyright©2021 NTT Corp. All Rights Reserved. Native Build 2020/06/05 14:21:26:889692121 tomcat: [Jun 05, 2020 2:21:31.996593000 PM] SEVERE: org.apache.catalina.startup.Catalina initDirs - Cannot find specified temporary folder at [/var/tmp/] tomcat: [Jun 05, 2020 2:21:32.159568000 PM] INFO: org.apache.catalina.startup.VersionLoggerListener log - Server version name: Apache Tomcat/9.0.33 中略 tomcat: [Jun 05, 2020 2:21:32.195433000 PM] INFO: org.apache.coyote.AbstractProtocol init - Initializing ProtocolHandler ["http-nio-8080"] tomcat: [Jun 05, 2020 2:21:32.208363000 PM] INFO: org.apache.catalina.startup.Catalina load - Server initialization in [219] milliseconds 中略 tomcat: [Jun 05, 2020 2:21:33.154692000 PM] INFO: org.apache.catalina.startup.HostConfig deployDirectory - Deployment of web application directory [/deployments/webapps/examples] has finished in [898] ms tomcat: [Jun 05, 2020 2:21:33.157470000 PM] INFO: org.apache.coyote.AbstractProtocol start - Starting ProtocolHandler ["http-nio-8080"] 中略 tomcat: [Jun 05, 2020 2:21:35.095745000 PM] INFO: org.apache.catalina.core.ApplicationContext log - SessionListener: sessionCreated('12D54EC0C2464640C9B66CD6B5AC3122') System time call back (1591334495097) Fri Jun 05 2020 14:21:35(JPT) 2020/06/05 14:21:35:111728731 26 【参考】コールドスタート時間比較ログ
  • 27. Copyright©2021 NTT Corp. All Rights Reserved. Non Native Build 2020/06/05 14:21:35:111728731 tomcat: [Jun 05, 2020 5:21:48.507099000 AM] INFO: org.apache.catalina.startup.VersionLoggerListener log - Server version name: Apache Tomcat/9.0.33 中略 tomcat: [Jun 05, 2020 5:21:51.717869000 AM] INFO: org.apache.catalina.startup.Catalina load - Server initialization in [5,750] milliseconds tomcat: [Jun 05, 2020 5:21:52.411354000 AM] INFO: org.apache.catalina.core.StandardService startInternal - Starting service [Catalina] tomcat: [Jun 05, 2020 5:21:52.432468000 AM] INFO: org.apache.catalina.core.StandardEngine startInternal - Starting Servlet engine: [Apache Tomcat/9.0.33] tomcat: [Jun 05, 2020 5:21:52.538791000 AM] INFO: org.apache.catalina.startup.HostConfig deployDirectory - Deploying web application directory [/deployments/webapps/examples] tomcat: [Jun 05, 2020 5:22:00.232303000 AM] WARNING: org.apache.catalina.util.SessionIdGeneratorBase createSecureRandom - Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [195] milliseconds. tomcat: [Jun 05, 2020 5:22:00.382143000 AM] INFO: org.apache.catalina.startup.HostConfig deployDirectory - Deployment of web application directory [/deployments/webapps/examples] has finished in [7,844] ms tomcat: [Jun 05, 2020 5:22:00.411739000 AM] INFO: org.apache.coyote.AbstractProtocol start - Starting ProtocolHandler ["http-nio-8080"] System time call back (1591334521588) Fri Jun 05 2020 05:22:01(UTC)  Fri Jun 05 2020 14:22:01(JPT) 2020/06/05 14:22:01:647886909 27 【参考】コールドスタート時間比較ログ
  • 28. Copyright©2021 NTT Corp. All Rights Reserved. Native Build JVM Base Images 5.2MB(busybox:glibc) 627MB(openjdk:11-jdk) With Application Images 83.3MB 647MB 28 2. イメージサイズの比較 合計のImages Size約87%減 busybox:glibc https://index.docker.io/_/busybox https://github.com/docker-library/busybox openjdk:11-jdk https://index.docker.io/_/openjdk https://github.com/docker-library/openjdk/tree/master/11/jdk
  • 29. Copyright©2021 NTT Corp. All Rights Reserved. 29 【参考】イメージサイズ確認コマンド [user@localhost tomcat-maven]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE dev.local/apache/tomcat-maven-native 1.0 b112fb4bfafb 9 days ago 83.3 MB dev.local/apache/tomcat-maven 1.0 9d5f67e93fc7 12 days ago 647 MB busybox glibc 7a2331af2292 2 weeks ago 5.2 MB openjdk 11 22b5134fcd55 4 weeks ago 627 MB gcr.io/knative-releases/knative.dev/net-istio/cmd/controller <none> 4b229b0760f4 2 months ago 61.5 MB gcr.io/knative-releases/knative.dev/net-istio/cmd/webhook <none> 8b13dd01e81b 2 months ago 55.2 MB k8s.gcr.io/kube-proxy v1.18.0 43940c34f24f 2 months ago 117 MB k8s.gcr.io/kube-controller-manager v1.18.0 d3e55153f52f 2 months ago 162 MB k8s.gcr.io/kube-scheduler v1.18.0 a31f78c7c8ce 2 months ago 95.3 MB k8s.gcr.io/kube-apiserver v1.18.0 74060cea7f70 2 months ago 173 MB kubernetesui/dashboard v2.0.0-rc6 cdc71b5a8a0e 3 months ago 221 MB gcr.io/knative-releases/knative.dev/serving/cmd/networking/istio <none> bfd5835bb3e2 3 months ago 61.6 MB gcr.io/knative-releases/knative.dev/serving/cmd/autoscaler <none> ad6d1ef57b5c 3 months ago 68.3 MB gcr.io/knative-releases/knative.dev/serving/cmd/webhook <none> 50e786c7b248 3 months ago 58.2 MB gcr.io/knative-releases/knative.dev/serving/cmd/controller <none> 38017b623e91 3 months ago 61.3 MB gcr.io/knative-releases/knative.dev/serving/cmd/queue <none> 4b940fa4fdd3 3 months ago 53.1 MB gcr.io/knative-releases/knative.dev/serving/cmd/activator <none> d9d1603fac36 3 months ago 60.6 MB istio/proxyv2 1.4.6 a4912a7fd5d1 3 months ago 256 MB istio/pilot 1.4.6 baf12191b2ac 3 months ago 214 MB k8s.gcr.io/pause 3.2 80d28bedfe5d 4 months ago 683 kB k8s.gcr.io/coredns 1.6.7 67da37a9a360 4 months ago 43.8 MB kindest/kindnetd 0.5.3 aa67fec7d7ef 7 months ago 78.5 MB k8s.gcr.io/etcd 3.4.3-0 303ce5db0e90 7 months ago 288 MB kubernetesui/metrics-scraper v1.0.2 3b08661dc379 7 months ago 40.1 MB gcr.io/knative-samples/knative-route-demo <none> c56acfb871f9 2 years ago 14.7 MB gcr.io/knative-samples/knative-route-demo <none> 6120ad7d128e 2 years ago 14.7 MB gcr.io/k8s-minikube/storage-provisioner v1.8.1 4689081edb10 2 years ago 80.8 MB
  • 30. Copyright©2021 NTT Corp. All Rights Reserved. 3. リクエスト処理速度比較
  • 31. Copyright©2021 NTT Corp. All Rights Reserved. • Gatlingを使い、HTTPのResponse Timeを比較します。 • Native Imageでのリクエスト処理速度と通常のJava VMでの リクエスト処理速度の差を確認します。 31 3. リクエスト処理速度比較 はじめに
  • 32. Copyright©2021 NTT Corp. All Rights Reserved. • GatlingでHTTP Response Timeを記録します。 – HTTP Request  Tomcat receive request  Requestに応じてクラス ローディング 実行結果をResponseとして返事  HTTP Response – よって、HTTP Responseは、クラスローディングに大きく左右されま す。 • Gatlingとは、オープンソースのLoad Testツールです。 – 「Scenario」と言うTest caseが必要です。 • Bundle版では、実際のブラウザでの行動をトラックして「Scenario」を 生成するツールを提供しています。 • https://gatling.io/docs/current/quickstart/ – Gatlingを通じて「Virtual user」を生成して、「Scenario」を実行する ことによってLoad Testを行います。 32 3. リクエスト処理速度の測定
  • 33. Copyright©2021 NTT Corp. All Rights Reserved. • 行ごとに各End point(e.g. /index.jsp)に対してのLoad Test結果が示されま す。 • 一番上の行(Global Information)が全データをまとめた数値です。 • 数値が小さい=Responseが速い=実行速度が速いことを意味します。 33 3. 測定結果の見方
  • 34. Copyright©2021 NTT Corp. All Rights Reserved. Response Time Global Information 99th Pct Max Mean 19,750 ms 30,425 ms 949m s Response Time Global Information 99th Pct Max Mean 20,269 ms 31,463 ms 970ms 34 3. リクエスト処理速度比較(通常環境) Non Native Native リクエスト処理にかかる時間の最大値(99%内と全て)と平均値に注目
  • 35. Copyright©2021 NTT Corp. All Rights Reserved. 35 3. リクエスト処理速度比較(通常環境) 0 5000 10000 15000 20000 25000 30000 35000 99pct Max Mean 実行速度 Non Native Native Image 差は3%以下 (ms)
  • 36. Copyright©2021 NTT Corp. All Rights Reserved. Response Time Global Information 99th Pct Max Mean 25,916 ms 31,372 ms 1,464ms Response Time Global Informatio n 99th Pct Max Mean 22,562 ms 31,002 ms 1,223ms 36 3. リクエスト処理速度比較(Knative環境) Non Native Native リクエスト処理にかかる時間の最大値(99%内と全て)と平均値に注目
  • 37. Copyright©2021 NTT Corp. All Rights Reserved. 37 3. リクエスト処理速度比較(Knative環境) 0 5000 10000 15000 20000 25000 30000 35000 99pct Max Mean 実行速度 Non Native Native Image 差は1%前 後 (ms)
  • 38. Copyright©2021 NTT Corp. All Rights Reserved. 0 50 100 150 200 250 300 350 400 450 ベア環境 k8s Pods アプリケーションのメモリ利用率 Java Application Native Build 38 3. リソース利用(参考) MiB Non Native (1) Native Build(2) (2)/(1) ベア環境 412.484375 42.4453125 10.2% k8s Pods 139 40 28.7% 【参考】Metrics serverを利用し、k8sのpods のリソース運用をモニタリングできる *注意* 今回の検証では、Minikubeを使っています。 デフォルトで2GBが割り当てています ホスト環境による Heapサイズ差別
  • 39. Copyright©2021 NTT Corp. All Rights Reserved. まとめ
  • 40. Copyright©2021 NTT Corp. All Rights Reserved. • GraalVMのNative Buildの手順を確認できました。(Apache Tomcatをベー スに) • 起動時間の比較結果より、Native Buildは通常のJava VMよりも起動速度 が大幅に速いことが確認できました。 • Gatlingで連続したリクエスト処理の性能を比較したところ、起動時の比 較とは異なり、Native Build は優位ではなかったが、大きな性能低下は無 いことが確認できました。 • 総合的には、GraalVMによる Native Buildの優位性を確認できました。 – ただし、ビルド手順など今後の改善に期待したい箇所もあります。 40 まとめ GraalVM (Native Build) 通常のJava VM 起動時間 ☆☆☆☆☆ ☆ 3%以下で起動 リクエスト処理性能 ☆☆☆ ☆☆☆ 性能差異は1%前後 総合評価 ☆☆☆☆ ☆☆