Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Java is Container Ready - Vaibhav - Container Conference 2018

2,842 views

Published on

This presentation is part of Container Conference 2018 presented by Vaibhav Choudhary, Principal Staff Engineer, Oracle: www.containerconf.in
--
Container become the fundamental building block unit of modern application and for cloud. So, lets learn in this session that how you can containerize (dockerize in the demo) a java image. What are the effort we put to make Java, Container aware. How Java started understanding Container and start respecting the container boundary. We will also learn how you can leverage java features like AppCDS, AOT inside the container and make it faster than even.
--

Published in: Software
  • Be the first to comment

Java is Container Ready - Vaibhav - Container Conference 2018

  1. 1. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Java for the containers Vaibhav Choudhary (@vaibhav_c) Java Platforms Team https://blogs.oracle.com/vaibhav
  2. 2. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. 3
  3. 3. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Agenda of the day … A brief on Container Java - as first class citizen in Container Respect Container Boundary Leverage features inside container Final thoughts 1 2 3 4 4 5
  4. 4. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Respective the container Boundary
  5. 5. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Processor Boundary (--cpu-shares) 6 public class CoreCheck { public static void main(String[] args) {   System.out.println(Runtime.getRuntime().availableProcessors());  }} JDK8 : docker run --rm --cpu-shares 2048 -v /root/:/mnt/mydata -it ubuntu bash root@7599aae2613d:/mnt/mydata/jdk-8/bin# ./java CoreCheck 8 FROM openjdk:10 ADD CoreCheck.java . WORKDIR . RUN javac CoreCheck.java CMD ["java", "CoreCheck" ] docker build -t hello-world . docker run --cpu-shares 2048 java-helloworld 2
  6. 6. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Processor Boundary (--cpuset-cpus) 7 public class CoreCheck { public static void main(String[] args) {   System.out.println(Runtime.getRuntime().availableProcessors());  }} JDK8 : docker run --rm --cpuset-cpus 3,4,6 -v /root/:/mnt/mydata -it ubuntu bash root@7599aae2613d:/mnt/mydata/jdk-8/bin# ./java CoreCheck 8 (ideally it should say 3) FROM openjdk:10 ADD CoreCheck.java . WORKDIR . RUN javac CoreCheck.java CMD ["java", "CoreCheck" ] docker build -t hello-world . docker run --cpuset-cpus 3,4,6 java- helloworld 3 (Processor 3rd, 4th and 6th)
  7. 7. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Here are the results (Respecting Logs) 8 public class HelloWorld { public static void main(String[] args) {   System.out.println(Runtime.getRuntime().availableProcessors());  }} JDK10 : root@4795a54e037e:/mnt/mydata/jdk-10b38/bin# ./java -Xlog:os+container=trace HelloWorld [0.001s][trace][os,container] OSContainer::init: Initializing Container Support [0.001s][trace][os,container] Path to /memory.limit_in_bytes is /sys/fs/cgroup/memory/ memory.limit_in_bytes JDK9 : root@4795a54e037e:/mnt/mydata/jdk-9/bin# ./java -Xlog:os+container=trace HelloWorld [0.001s][error][logging] Invalid tag 'container' in what-expression. Invalid -Xlog option '-Xlog:os+container=trace'
  8. 8. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Here are the results (ActiveProcessorCount) 9 public class HelloWorld { public static void main(String[] args) {   System.out.println(Runtime.getRuntime().availableProcessors());  }} JDK10 : root@4795a54e037e:/mnt/mydata/jdk-10b38/bin# ./java - XX:ActiveProcessorCount=4 HelloWorld 4 JDK8 : root@4795a54e037e:/mnt/mydata/jdk1.8.0_152/bin# ./java - XX:ActiveProcessorCount=4 HelloWorld Unrecognized VM option 'ActiveProcessorCount=4' Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
  9. 9. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Cont.. (Respecting Memory Boundaries) 10 public class MemoryCheck { public static void main(String[] args) {   System.out.println(Runtime.getRuntime().maxMemory());  }} JDK8 : docker run --rm --memory 100m -v /root/:/mnt/mydata -it ubuntu bash root@7599aae2613d:/mnt/mydata/jdk-8/bin# ./java CoreCheck It will print 1/4 of the Physical Memory (It should understand docker memory limit) FROM openjdk:10 ADD MemoryCheck.java . WORKDIR . RUN javac MemoryCheck.java CMD ["java", "MemoryCheck" ] docker build -t hello-world . docker run --memory 100m java-helloworld Half of the docker limit (50m)
  10. 10. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Solution 1 : Application Class Data Sharing (AppCDS)
  11. 11. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted How Application Class Data Sharing (AppCDS) Help? • CDS only supports archiving classes on the bootstrap class path, which provides limited (or no) benefit for large applications in today’s cloud environment as majority of loaded classes are application classes. • AppCDS extends the archiving support beyond core library classes – Enables archiving classes loaded by all class loaders • PlatformClassLoader (the ExtensionClassLoader in JDK 8 and earlier versions) • AppClassLoader • User defined class loaders • AppCDS allows archiving and sharing read-only java heap objects with G1 GC • AppCDS provides further reduction in storage for archived class metadata 12
  12. 12. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted A Quick Look at CDS/AppCDS Evolution 13 JDK 1.5 JDK 8 JDK 9JDK8u40 CDS AppCDS v1 (experimental) AppCDS v2 (experimental) Cache classes from boot loader only Cache classes from built-in class loaders Boot, Extension and App class loaders Cache classes from built-in and user defined class loaders
  13. 13. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted AppCDS Architectural View 14 JVM Instance 1 JVM Instance 1 Java Heap Space Shared Space Meta Space Heap Objects Class Metadata Shared String Objects Class Metadata Archive File Shared Classes Heap Objects Shared String Objects Shared Classes
  14. 14. Copyright © 2016, Oracle and/or its affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted • About 30% startup time improvement observed with AppCDS for Oracle Web Logic Server (WLS) base domain 15 Startup Time Improvements for Oracle Web Logic Server 0s 2.875s 5.75s 8.625s 11.5s WLS BaseDomain 7.7s 11.4s No AppCDS AppCDS
  15. 15. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | AppCDS inside Container - How to use • Simple CDS use in Docker DockerFile FROM openjdk:10 ADD HelloWorld.java . WORKDIR . RUN javac HelloWorld.java RUN ["java", "-Xshare:dump" ] CMD ["java", "-showversion" , "-Xshare:on", "HelloWorld" ]
  16. 16. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Cont… • Determine the class to archive java -Xshare:off -XX:+UseAppCDS -XX:DumpLoadedClassList=hello.lst -cp hello.jar HelloWorld • Creating the AppCDS archive java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa -cp hello.jar • Using the AppCDS archive java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa -cp hello.jar HelloWorld
  17. 17. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Solution 2: Ahead of Time Compilation (AOT)
  18. 18. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 19 At Compile Time At Runtime Time Java Source [*.java] Java Bytecode [*.class] javac Classloader Verifier Java Interpreter JIT Compiler (C1, C2) Native Level (OS, Hardware) Most of the code get optimized here Shared Object [*.so] jaotc
  19. 19. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | • jaotc --output HelloWorld.so HelloWorld.class • java -XX:AOTLibrary=./HelloWorld.so HelloWorld 20 -bash-4.1$ ./java -XX:+PrintAOT -XX:AOTLibrary=./HelloWorld.so HelloWorld 15 1 loaded ./HelloWorld.so aot library 153 1 aot[ 1] HelloWorld.<init>()V 153 2 aot[ 1] HelloWorld.main([Ljava/lang/String;)V Hello AOT • jaotc --output base.so --module java.base
  20. 20. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | AOT run (jaotc) 21 -bash-4.1$ ./jaotc --info --output HelloWorld.so HelloWorld.class Compiling HelloWorld... 1 classes found (62 ms) 2 methods total, 2 methods to compile (6 ms) Compiling with 2 threads . 2 methods compiled, 0 methods failed (923 ms) Parsing compiled code (2 ms) Processing metadata (21 ms) Preparing stubs binary (1 ms) Preparing compiled binary (0 ms) Creating binary: HelloWorld.o (17 ms) Creating shared library: HelloWorld.so (26 ms) Total time: 1886 ms
  21. 21. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 22 Dynamic (JIT) Static (AOT) Start-up performance Tunable, but not so good Best Steady-state performance Best Good Interactive performance Not so good Good Deterministic performance Tunable, but not best Best * https://www.ibm.com/developerworks/library/j-rtj2/index.html
  22. 22. Copyright © 2018, Oracle and/or its affiliates. All rights reserved. | 23 * https://www.ibm.com/developerworks/library/j-rtj2/index.html
  23. 23. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Solution 3: Modularity
  24. 24. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | DockerFile should look like FROM openjdk:10 as small ADD jdk-10.tar.gz /jdk ENV PATH=$PATH:/jdk/jdk-10/bin RUN [“jlink”, “—compress=2”, “—module-path”, “/jdk/jdk-10/jmods”, “—add-modules”, “java.base”, “—output”, “/linked” ] FROM openjdk:10 COPY —from=small /linked /jdk ADD HelloWorld.class CMD [“java”, “-showversion”, “HelloWorld”]
  25. 25. Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Links • For any query, you can drop me mail at vaibhav.x.choudhary@oracle.com • Good links :- • Bangalore JUG resource - http://bangalorejug.org/downloads/ • Container Aware Java - http://openjdk.java.net/jeps/8182070 • JDK-8146115 - https://bugs.openjdk.java.net/browse/JDK-8146115 • Better containerization by JDK10 : https://mjg123.github.io/ 2018/01/10/Java-in-containers-jdk10.html • VJUG Talk :- Java in Container world

×