containers for java: optimizing your applications · containers for java: optimizing your...

39
Containers for Java: Optimizing your applications Mofe Salami Developer Advocate

Upload: others

Post on 22-May-2020

37 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Containers for Java: Optimizing your applications—Mofe SalamiDeveloper Advocate

Page 2: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Containers are great!

Physical Server

Host Operating System

Container Engine

Bins/Libs Bins/Libs Bins/Libs

App 1 App 2 App 3

Physical Server

Host Operating System

Hypervisor

Guest OS Guest OS Guest OS

Bins/Libs Bins/Libs Bins/Libs

App 1 App 2 App 3

2

Page 3: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Java and containers, not so great

Java is nice but:

• Large application size• Long start-up times• Not ideal for FaaS

3

Page 4: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

How can we address these issues?

Takeaways:

1. How to reduce application size2. Hotspot features that improve start-up times3. Other optimizations

4

Page 5: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

What this talk will not cover

5

Important, but not in scope:

• Security• JVM vs. resource limits• Running multiple JVMs

Page 6: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

1. How to reduce application size

6

Page 7: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Defining “application size”

7

• Containers are isolated environments• Dependencies are packaged with the application• Java code depends on a JVM

Application size = Linux distribution + JVM + Application Code

Page 8: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Choosing the “right” JDK distribution

8

Points for consideration:

• Vendor• Support and Updates• Support periods• Commercial vs. “Free”• TCK’d binaries

Read more:

Life Beyond Java 8 – Trisha GeePanel: Java Is Still Free?

OracleOpenJDKBuild

Release date Free updates superseded / ended (by Oracle)

8 (LTS) March 2014

At least through January 2020 (Personal desktop use) Commercial use ended in January 2019

9 Sept 2017 Superseded by Oracle OpenJDK build 10

10 March 2018 Superseded by Oracle OpenJDK build 11 in Sept 2018

11 (LTS) Sept 2018

To be superseded by Oracle OpenJDK build 12 in March 2019 (may be extended)

12 March 2019 To be superseded by Oracle OpenJDK build 13

13 Sept 2019 To be superseded by Oracle OpenJDK build 14

Page 9: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Choosing AdoptOpenJDK

9

• Free as in beer and as in speech• Built from OpenJDK source repo• Backporting patches are community-led• Maintained by the OpenJDK community• Docker images:

• latest (Full JDK)• slim (Stripped down JDK)• alpine (Full JDK)• alpine-slim (Stripped down JDK)

AdoptOpenJDK Build

Release date

Update/Support period

8 (LTS) March 2014 At least September 2023

9 Sept 2017 -

10 March 2018 -

11 (LTS) Sept 2018 At least September 2022

Page 10: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Choosing the “right” Linux distribution

10

docker pull adoptopenjdk/${VERSION}:${VARIANT}

Page 11: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Building the application

11

Simple Spring Boot Application

Dockerfile

Page 12: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Building the application

12

docker build -t java-containers:adoptopenjdk-${VERSION}:${VARIANT} Dockerfile

Page 13: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Demo #1

13

• Verify the start of java application:

docker run -p 8080:8080 --rm java-containers:adoptopenjdk-8-alpine-slim

• Verify we can reach the /ping endpoint

Go to: localhost:8080/ping

Page 14: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

2. HotSpot features that improve start-up times

14

Page 15: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

JVM Start-up times

15

Total start-up time = JVM start-up time + application start-up time

• What JDK will you use?• What type of application are you running?

Let’s experiment with:

• AdoptOpenJDK 11• Our sample rest application

Page 16: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Class Data Sharing (CDS)

16

• Oracle JVM feature• Reduces the start-up time• Creates a cache of Java Class Data• Does not factor in classes within custom JARs• Available since JDK 5

Generate cache with:• java -Xshare:dump

Use with:• -Xshare:on

Classes from system jar file

Private internal representation

Dump to shared archive file

Page 17: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Benchmarking our application

17

• Test start-up times on average:

• Add config to exit application after starting up:

Page 18: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Benchmark Results: CDS (Off vs. On)

18

Page 19: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Application Class Data Sharing (AppCDS)

19

• CDS for external libraries• Enables pre-processing of classes to be loaded• Speeds up start-up time • Was commercial only until JDK 10

Steps to use:

• Identify a list of classes to cache• Generate the cache• Run application with AppCDS cache

Page 20: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

AppCDS: Generating shared cache file

20

• Create classes.lst which stores list of classes to cache:

• Create application cache from classes.lst at app-cds.jsa

Page 21: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

AppCDS: Run application with AppCDS cache

21

• Run application with AppCDS cache:

• Note the cache size:

Page 22: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Benchmark Results: CDS vs AppCDS

22

Page 23: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Ahead-of-time Compilation (AOT)

23

• Compile java classes to native code• Skips JVM JIT compilation at start-up time • Restricted to Linux x64 systems running 64-bit Java • Available since JDK 9

Steps to use:

• Identify a list of classes to cache• Generate the the AOT cache• Run application with AOT cache

Page 24: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

AOT: Generating shared cache file

24

• Reuse classes.lst from AppCDS use case

• Create AOT cache from classes.lst at lib.so

Page 25: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

AOT: Run application with CDS + AppCDS + AOT

25

• Run application with AOT cache:

• Note the cache size:

Page 26: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Benchmark Results: CDS vs CDS + AppCDS + AOT

26

Page 27: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Things to note

27

• Down to experimentation• Optimisations depend on application mark-up• AOT Cache size trade-off• Bigger caches can increase start-up times!• Exclude some classes from AOT cache• Classpath on launch and cache must match• More benefits for multiple JVMs using caches• Cache is OS-specific!

Page 28: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

But wait… this is also a container talk…

28

• Let’s make a new Dockerfile:

• Java 11 for features• Use alpine-slim to reduce image size• Copy in the caches• We add the appropriate flags

Page 29: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

But wait… this is also a container talk…

29

• Let’s build the image:

docker build -t java-container-opt:adoptopenjdk-11-alpine-slim .

• Check the output:

Page 30: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

3. Other optimizations

30

Page 31: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

An alternative JVM: OpenJ9

31

• Contributed by IBM to the Eclipse Foundation in 2017• Boasts “Low memory footprint” & “Fast start-up time”• CDS and AOT implementations also included• Builds by AdoptOpenJDK available for Java 8+

Stephen Hellberg – Open J9: Compelling Java for Cloud Workloads

Page 32: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

OpenJ9: Putting it to the test (AdoptOpenJDK 11)

32

Page 33: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

OpenJ9: Putting it to the test (AdoptOpenJDK 8)

33

Page 34: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

They have images for it too!

34

Page 35: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Demo #2

35

AdoptOpenJDK 11 (CDS, AppCDs, AOT)

Vs.

AdoptOpenJDK 8 OpenJ9 (CDS, AOT)

Page 36: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Honorable mention 1: Graal and Subtrate VM

36

• Takes AOT to a new level• Compiles Java code into self-contained executables• Does not run on the Java HotSpot VM• Runs in SubstrateVM in the executable• Boasts faster start-up times & lower runtime memory overhead

Duncan McGregor - Graal: Not Just a New JIT for the JVM

Page 37: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Honorable mention 2: Using modules & jLink

37

• Java modules and jLink introduced in JDK9• jLink identifies the modules required in the JRE• Strip the JRE of unused classes• Reduce the application size and improve performance• Requires coding efforts to embrace modules

Page 38: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

Try it out!Workshop: https://github.com/IBMCodeLondon/java-containers101

Our London Meetup: https://www.meetup.com/IBM-Code-London

38

Page 39: Containers for Java: Optimizing your applications · Containers for Java: Optimizing your applications ... Host Operating System Container Engine Bins/Libs Bins/Libs Bins/Libs App

39