OpenJ9 和 docker 容器?
OpenJ9 and docker containers?
从历史上看,HotSpot 在 docker 容器中有 运行 错误判断分配的资源(例如 RAM)的不良记录。不过,情况正在慢慢好转。
OpenJ9 如何与 docker 容器保持一致,它在多大程度上了解容器提供的资源(内存、套接字、线程等)
此外,在 JavaOne 2017 演示期间,有人提到 OpenJ9 可以在不同的 OpenJ9 VM 之间缓存 jit 编译的 类。当 VM 被限制在不同的容器中时(或者)如果容器化的 JVM 共享一个 docker 卷,这种共享缓存是否可能?
- 目前正在开发容器支持,对于 cgroup 意识,请检查此 PR。这也将导致添加容器支持。
关于共享 Class 缓存 (SCC),这两种情况都是可能的。有关共享 docker 卷的示例,请参阅 here 中的 "Using the Class Data Sharing feature"。当 JVM 被限制在没有共享卷的不同容器中时,建议使用预构建的 SCC 构建 docker 容器。您的 docker 文件将如下所示。
来自 adoptopenjdk/openjdk9-openj9:x86_64-alpine-jdk-9.181
运行 mkdir /opt/shareclasses
&& mkdir /opt/app
复制 japp.jar /opt/app
CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/app/japp.jar"]
然后您需要构建和 运行 映像并提交生成的容器并将其作为您的基础映像。
docker build -t japp:latest .
docker run japp
docker commit container_id japp
可以创建共享 类 缓存并将其包含在 Docker 文件中。
共享类缓存 可以在开发环境或预生产环境中创建,或者在对应用程序 运行 进行一些测试时 创建。
在 Pre-prod 中创建 缓存可能更有效 , 但在构建过程中使用测试 进行缓存 更简单。
我用 Spring Boot 应用程序和 甚至简单的 "contextLoads" 测试 测试了它,它包含在任何新生成的 Spring Boot 项目中 有很大的不同。
这是一个使用 Maven 进行测试的示例,但相同的 VM 选项也可以用于不同的场景。
1. 运行 启用共享 类 缓存的测试:
你可以在 Maven 中使用 Surefire 插件来完成,我不确定如何使用 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>
虚拟机参数:-Xquickstart -Xshare类:cacheDir=classCache,name=appname -Xscmx32m
- cacheDir 子选项用于 指定缓存文件夹 以便更容易包含在 Docker 图像中
- name 子选项用于避免 难以预测的自动缓存名称
- -Xscmx选项是为了限制缓存大小,这应该针对应用程序进行调整,启动和启动之间有一个权衡速度和图像大小
- -Xquickstart 选项指示 JVM 在与 -Xshare类 结合使用时 尽可能多地执行 AOT选项
您可以使用 printStats 子选项检查 使用了多少缓存大小,如下所示:java -jar -Xshare类:cacheDir=classCache,name=appname,readonly,printStatsapplication.jar
2。将预热缓存添加到 Docker 图像
只需将cacheDir子选项设置的目录添加到图像在本例中为classCache
ADD classCache classCache
由于这些文件每次都会更改,classCache 应该最后添加到图像
和运行有缓存的应用
ENTRYPOINT exec java -Xquickstart -Xtune:virtualized -Xshareclasses:cacheDir=classCache,name=appname,readonly -jar application.jar
VM 参数:-Xquickstart -Xtune:virtualized -Xshare类:cacheDir=classCache,name=appname,readonly -jar application.jar
可以使用 classCache 和名称子选项、指定缓存,如果没有这些,JVM 可能会创建一个新的缓存文件夹并忽略添加到图片.
根据我的经验,readonly 选项使它 更快 一点,但这不是绝对必要的。由于当容器被销毁时此缓存将被删除,因此没有必要保留 canges。
-Xquickstart 和 -Xtune:virtualized 选项可以进一步优化容器中的启动速度
从历史上看,HotSpot 在 docker 容器中有 运行 错误判断分配的资源(例如 RAM)的不良记录。不过,情况正在慢慢好转。
OpenJ9 如何与 docker 容器保持一致,它在多大程度上了解容器提供的资源(内存、套接字、线程等)
此外,在 JavaOne 2017 演示期间,有人提到 OpenJ9 可以在不同的 OpenJ9 VM 之间缓存 jit 编译的 类。当 VM 被限制在不同的容器中时(或者)如果容器化的 JVM 共享一个 docker 卷,这种共享缓存是否可能?
- 目前正在开发容器支持,对于 cgroup 意识,请检查此 PR。这也将导致添加容器支持。
关于共享 Class 缓存 (SCC),这两种情况都是可能的。有关共享 docker 卷的示例,请参阅 here 中的 "Using the Class Data Sharing feature"。当 JVM 被限制在没有共享卷的不同容器中时,建议使用预构建的 SCC 构建 docker 容器。您的 docker 文件将如下所示。
来自 adoptopenjdk/openjdk9-openj9:x86_64-alpine-jdk-9.181
运行 mkdir /opt/shareclasses && mkdir /opt/app
复制 japp.jar /opt/app
CMD ["java", "-Xshareclasses:cacheDir=/opt/shareclasses", "-jar", "/opt/app/japp.jar"]
然后您需要构建和 运行 映像并提交生成的容器并将其作为您的基础映像。
docker build -t japp:latest .
docker run japp
docker commit container_id japp
可以创建共享 类 缓存并将其包含在 Docker 文件中。
共享类缓存 可以在开发环境或预生产环境中创建,或者在对应用程序 运行 进行一些测试时 创建。 在 Pre-prod 中创建 缓存可能更有效 , 但在构建过程中使用测试 进行缓存 更简单。 我用 Spring Boot 应用程序和 甚至简单的 "contextLoads" 测试 测试了它,它包含在任何新生成的 Spring Boot 项目中 有很大的不同。
这是一个使用 Maven 进行测试的示例,但相同的 VM 选项也可以用于不同的场景。
1. 运行 启用共享 类 缓存的测试:
你可以在 Maven 中使用 Surefire 插件来完成,我不确定如何使用 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>
虚拟机参数:-Xquickstart -Xshare类:cacheDir=classCache,name=appname -Xscmx32m
- cacheDir 子选项用于 指定缓存文件夹 以便更容易包含在 Docker 图像中
- name 子选项用于避免 难以预测的自动缓存名称
- -Xscmx选项是为了限制缓存大小,这应该针对应用程序进行调整,启动和启动之间有一个权衡速度和图像大小
- -Xquickstart 选项指示 JVM 在与 -Xshare类 结合使用时 尽可能多地执行 AOT选项
您可以使用 printStats 子选项检查 使用了多少缓存大小,如下所示:java -jar -Xshare类:cacheDir=classCache,name=appname,readonly,printStatsapplication.jar
2。将预热缓存添加到 Docker 图像
只需将cacheDir子选项设置的目录添加到图像在本例中为classCache
ADD classCache classCache
由于这些文件每次都会更改,classCache 应该最后添加到图像
和运行有缓存的应用
ENTRYPOINT exec java -Xquickstart -Xtune:virtualized -Xshareclasses:cacheDir=classCache,name=appname,readonly -jar application.jar
VM 参数:-Xquickstart -Xtune:virtualized -Xshare类:cacheDir=classCache,name=appname,readonly -jar application.jar
可以使用 classCache 和名称子选项、指定缓存,如果没有这些,JVM 可能会创建一个新的缓存文件夹并忽略添加到图片.
根据我的经验,readonly 选项使它 更快 一点,但这不是绝对必要的。由于当容器被销毁时此缓存将被删除,因此没有必要保留 canges。
-Xquickstart 和 -Xtune:virtualized 选项可以进一步优化容器中的启动速度