OpenJ9和docker容器?

时间:2017-10-17 05:53:02

标签: openj9

历史上,HotSpot在docker容器中运行的记录不佳,错误地判断了分配的资源(例如RAM)。然而,事情正在慢慢改善。

OpenJ9如何与docker容器对齐,以及它知道容器提供的资源(内存,套接字,线程等)的范围

此外,在JavaOne 2017演示期间,提到OpenJ9可以跨不同的OpenJ9 VM缓存jit-compilled类。如果容器化的JVM共享一个docker卷,那么当VM被限制在不同的容器(或)时,这个共享缓存是否可行?

2 个答案:

答案 0 :(得分:2)

  1. 目前正在处理容器支持,对于cgroup感知,请查看此PR。这也将导致增加容器支持。
  2. 关于共享类高速缓存(SCC),两种方案都是可能的。有关共享泊坞窗卷的示例,请参阅here中的“使用类数据共享功能”。当JVM被限制在没有共享卷的不同容器时,建议使用预构建的SCC构建docker容器。你的dockerfile看起来像这样。

    FROM adoptopenjdk / openjdk9-openj9:x86_64-alpine-jdk-9.181

    运行mkdir / opt / shareclasses     &安培;&安培; mkdir / opt / app

    COPY japp.jar / opt / app

    CMD [“java”,“ - Xshareclasses:cacheDir = / opt / shareclasses”,“ - jar”,“/ opt / app / japp.jar”]

  3. 然后,您需要构建并运行图像并提交生成的容器,并将其作为基本图像。

    docker build -t japp:latest . docker run japp docker commit container_id japp

答案 1 :(得分:0)

可以创建一个共享类缓存并将其包含在Docker文件中

共享类缓存可以在开发环境或预生产环境中创建,也可以在应用程序上运行某些测试时创建。 在Pre-prod中创建缓存可能会更有效,但是在构建过程中通过测试进行测试 要简单得多。 我用一个Spring Boot应用程序对其进行了测试,并且任何新生成的Spring Boot项目都随附了简单的“ contextLoads”测试

这是使用Maven进行测试的示例,但是相同的VM选项也可以在不同的情况下使用。

1。在启用共享类缓存的情况下运行测试

您可以使用Surefire插件在Maven中完成此操作,我不确定如何使用Gradle做到这一点

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <argLine>-Xquickstart -Xshareclasses:cacheDir=classCache,name=appname -Xscmx32m </argLine>
  </configuration>
</plugin>

VM参数:-Xquickstart -Xshareclasses:cacheDir = classCache,name = appname -Xscmx32m

  • cacheDir 子选项可用于指定缓存文件夹,以使其更容易包含在Docker映像中
  • 名称子选项可以避免难以预测的自动缓存名称
  • -Xscmx 选项可以限制缓存大小,应针对应用程序进行调整,在启动速度和图像大小之间进行权衡
  • -Xquickstart 选项指示JVM与-Xshareclasses选项结合使用时执行尽可能多的AOT

您可以使用 printStats 子选项检查使用了多少缓存大小,如下所示:java -jar -Xshareclasses:cacheDir = classCache,name = appname,readonly ,printStats application.jar

2。将预热的缓存添加到Docker映像

只需将cacheDir子选项设置的目录添加到映像中,在这种情况下,将classCache

ADD classCache classCache

由于这些文件每次都会更改,因此classCache 应最后添加到图像

然后使用缓存运行应用程序

ENTRYPOINT exec java -Xquickstart -Xtune:virtualized -Xshareclasses:cacheDir=classCache,name=appname,readonly -jar application.jar

虚拟机参数:-Xquickstart -Xtune:虚拟化-Xshareclasses:cacheDir = classCache,name = appname,只读-jar application.jar

可以使用 classCache和name子选项来指定缓存,不使用这些选项,JVM可能会创建一个新的缓存文件夹,而忽略添加到映像中的那个。 < / p>

根据我的经验,只读选项使该操作更快,但这并不是绝对必要的。由于在销毁容器时将删除此缓存,因此无需持久保存容器。

-Xquickstart和-Xtune:virtualized 选项可以进一步优化容器中的启动速度