HZERO PaaS平台组装笔记十五-使用IBM OpenJDK_OpenJ9
有同事告诉我换个jdk,使用IBM OpenJDK_OpenJ9(内置OpenJ9 JVM),不仅可以大幅减少内存使用,还可以大幅加快启动速度。
那我们就来实验一下。
一、WSL中jar方式运行微服务,替换成ibm OpenJDK_OpenJ9(内置openJ9 JVM)
Windows PowShell中
#关闭虚拟机
$ wsl –shutdown
#从备份新建虚拟机实例
$ wsl –import Ubuntu-2204-hzero-openjdk D:\wsl\Ubuntu-2204-hzero-openjdk D:\wsl\Ubuntu-22.04-hzero-backup20251225.tar –version 2
#查看导入新建结果
$ wsl –list –verbose
下载openj9-jdk
Semeru Runtime Downloads – IBM Developer
同事说要下载 java17 的0.53版的JDK,他测试过0.56版不稳定。
打开Ubuntu-2204-hzero-openjdk虚拟机
#创建目录
$ mkdir -p /d02/openjdk
#拷贝下载的jdk到虚拟机(powshell中):
$ cp C:\Users\A\Downloads\ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\openjdk\
#解压缩
$ tar -zxvf ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz
# 注册java命令(优先级100,确保优先使用) sudo update-alternatives –install /usr/bin/java java /d02/openjdk/jdk-17.0.16+8/bin/java 100
# 注册javac命令(JDK开发工具,必须配置) sudo update-alternatives –install /usr/bin/javac javac /d02/openjdk/jdk-17.0.16+8/bin/javac 100
# 配置默认java
sudo update-alternatives –config java
# 配置默认javac
sudo update-alternatives –config javac
# 编辑用户环境变量文件 nano ~/.bashrc
# 在文件末尾添加以下内容(直接复制,路径已匹配)
export JAVA_HOME=/d02/openjdk/jdk-17.0.16+8
export PATH=$JAVA_HOME/bin:$PATH
#使配置立即生效
source ~/.bashrc
#执行以下命令,输出版本为 17.0.16 即说明配置完成:
# 验证java版本 java -version
# 验证javac版本(确认JDK生效,而非仅JRE) javac -version
# 验证JAVA_HOME(输出/d02/openjdk/jdk-17.0.16+8) echo $JAVA_HOME
$ java –version
openjdk 17.0.16 2025-07-15
IBM Semeru Runtime Open Edition 17.0.16.0 (build 17.0.16+8)
Eclipse OpenJ9 VM 17.0.16.0 (build openj9-0.53.0, JRE 17 Linux amd64-64-Bit Compressed References 20250715_1115 (JIT enabled, AOT enabled)
OpenJ9 – 017819f167
OMR – 266a8c6f5
JCL – 34b4be01e57 based on jdk-17.0.16+8)
$ javac -version
javac 17.0.16
$ echo $JAVA_HOME
/d02/openjdk/jdk-17.0.16+8
配置完成后,是否需要重新构建jar?
我原来用的是:
download.oracle.com/otn/java/jdk/17.0.15%2B9/4f092786cec841d58ae21840b10204d7/jdk-17.0.15_linux-x64_bin.tar.gz
现在换成了:
github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.16%2B8_openj9-0.53.0/ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz
豆包回答不需要,这次是 同大版本(JDK 17)下的不同发行版更换:从 Oracle JDK 17.0.15 换成 IBM Semeru OpenJDK 17.0.16(带 OpenJ9 虚拟机),这种情况完全不需要重新打包 Jar 包,直接运行即可。
按照同事建议把启动命令所有服务的run_nobuild.sh中min内存设置到128,max保持原来不变。
#启动AI平台服务WSL的30G内存只消耗了17G;
free
total used free shared buff/cache available
Mem: 30802096 17835312 8845568 4624 4121216 12614252
Swap: 8388608 1353216 7035392
再启动低代码3个服务和流程平台1个服务之后,内存消耗增加到21G:
free
total used free shared buff/cache available
Mem: 30802096 21955264 4002200 4632 4844632 8487744
Swap: 8388608 1353216 7035392
再启动集成平台2个服务之后,内存消耗增加到23G
free
total used free shared buff/cache available
Mem: 30802096 23421660 2250812 4632 5129624 7020308
Swap: 8388608 1353216 7035392
而如果使用Oracle的 JDK,但启动AI平台服务就消耗了29G内存,基本把我的WSL虚拟机分配的内存消耗完了,(备注:使用Oracle JDK的WSL虚拟机中所有服务的run_nobuild.sh中min内存也都是设置到128的)。
Oracle JDK,但启动AI平台服务的情况:
$ free
total used free shared buff/cache available
Mem: 30802096 29730108 271104 4456 800884 731628
Swap: 8388608 2041832 6346776
我的笔记本内存40G,因为Windows及常用软件要用掉7~8G,所以我给WSL虚拟机分配了30G内存,以前使用Oracle JDK的时候,单启动一个AI平台就基本把WSL内存耗光了,所以使用AI平台和低代码平台的时候不得不来回关闭相应的服务做切换,现在我把AI平台、低代码平台、集成平台全部启动也才消耗24G,完全不用切换。
除了注册中心服务之外,这三个平台总共起了24个Java服务:
备注:这里遇到个问题,就是刚开始发现hzero-jar服务的侦听IP地址是个10开头的LO地址(用ip a 命令可以看),经检查发现是bootstrap.yml配置有问题,少了spring一级,导致对网卡的忽略配置没起作用,后来更改配置后就正常了。
还有4个docker容器:
这么多服务总共消耗24G内存:
free
total used free shared buff/cache available
Mem: 30802096 24281896 987392 4696 5532808 6152440
Swap: 8388608 1353216 7035392
所有服务启动完成后,CPU消耗也很小:
所以,上述实验结果表明:差异这么大,确实用同事推荐的IBM的open jdk做Demo实验环境是明智选择了。
遇到一个问题lowcodedata服务启动失败:
错误信息是:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.cache.annotation.ProxyCachingConfiguration’: No bean named ‘org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry’ available
分析:这个服务很简单,之前启动也没啥问题,应该不是配置或者依赖导致的问题。
解决方案:重启服务
结果:服务启动成功。这个情况在之前oracle JDK的时候没碰到过,所以是不稳定的原因吗?
问了豆包:说法是:
核心原因:Spring 容器启动时importRegistry Bean 初始化时序滞后,导致缓存配置依赖缺失(偶发,非服务不稳定);
重启恢复的本质:启动时的资源 / 时序条件变化,让 Bean 初始化顺序 “对齐” 了;
根治方案: 提高 JVM 内存;
不过,我们是Demo实验环境,稳定性要求不高,如果因为这个问题导致服务启动失败就针对失败的服务,重新启动一下,JVM内存就先不改了。可以接受。
二、基于IBM OpenJ9+OpenJDK制作Docker镜像
OpenJ9 本身就是为 “低内存占用” 设计的轻量级 JVM,果然是名不虚传。
问豆包:我想重新为这些微服务打包Docker镜像,需要一个包含 IBM Semeru OpenJDK 17.0.16环境的linux基础镜像,你可以提供下吗?
豆包说:可以直接使用 IBM 官方提供的 Semeru OpenJDK 17 镜像(内置 OpenJ9)作为基础镜像
# 拉取IBM官方Semeru OpenJDK 17镜像(内置OpenJ9,匹配你的版本)
FROM ibm-semeru-runtimes:open-17-jdk
看这个镜像的具体信息:是openJDK 17.0.17 + OpenJ9-0.56的:
OpenJ9 是IBM对JVM的一个实现,之前同事说0.56他测试下来有问题,sleep失效,导致涉及schedule的cpu全炸了。经询问元宝,说是open JDK 17.0.56这个版本的问题,并非IBM OpenJ9 0.56这个JVM的问题。 跟openJ9 JVM没有关系,这个bug是open JDK 17.0.56引入的,并在open JDK 17.0.57中被修复,只要避开open JDK 17.0.56就行。
先重构一个测试下:
在运行Docker的WSL中:
$ cd /d01/hzero-dockers/hzero-admin-docker
#编辑Dockerfile
基础镜像更改为:FROM ibm-semeru-runtimes:open-17-jdk
#拷贝Jar包到目标环境
#在windows powershell 中执行
$ cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-admin\target\ps-admin.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-admin-docker\
8.构建Docker镜像
$ cd /d01/hzero-dockers/hzero-admin-docker
$ docker build -t hzero-admin-jk-demo:1.12 .
然后先把mysql,redis,register三个容器启动,再启动这个重构后的admin容器,可以正常启动:
类似的方式完成其他容器的重构,重构后启动HZERO基础开发平台+AI平台;然后在docker Desktop中观察资源消耗:
之前听说,标准的HotSpot JVM, 是性能优先的JVM,是OpenJDK官方推荐的。 如果内存不够要换成OpenJ9的JVM,那个是内存节约优先的。比较起来确实如此,详情如下:
图1- 平台启动后,使用社区OpenJDK 默认的HotSpot JVM 的资源消耗情况(内存消耗多,CPU消耗少):
图2- 平台启动后,使用IBM OpenJDK-OpenJ9 JVM 的资源消耗情况(内存消耗少,CPU消耗大)
这是启动了HZERO 基础开发平台+AI平台后的资源消耗,CPU最低维持在46%,内存在21G
增加启动低代码平台后,CPU消耗最低维持在68%,内存消耗不大,只增加了2个多G
再增加集成平台后,CPU消耗并未显著增加,内存增加1G
关掉AI平台+集成平台仅保留HZERO基础开发平台+低代码平台CPU消耗未显著降低,内存消耗17G:
运行速度上,首次加载界面比使用社区版OpenJDK(带默认HotSport)慢。 但好处是像我这样使用联想昭阳40G内存的笔记本可以把主要平台全跑起来。
做Demo环境的话,要体验好就用官方社区版的OpenJDK(HotSport JVM),性能好;如果内存有限,又想多起几个平台就用IBM OpenJDK(OpenJ9 JVM)
结合之前非Docker环境的运行数据,结论是: Docker+OpenJ9 组合对CPU消耗大; Docker+HotSport组合对CPU消耗小,但直接在linux+OpenJ9 Jar包运行就没有CPU消耗大的缺点了。
附加备注:
问题:如果你的笔记本只有16G内存怎么办?
答:可以跑阉割版HZERO基础开发平台+低代码平台,这个版本去掉了KKfileView文件预览服务、onlyoffice文件在线编辑服务、预警服务、事件服务、动态jar管理服务。保留了基础服务(注册中心服务、网关服务、平台治理服务、系统/开发管理服务、身份认证服务、权限认证服务、License服务、文件服务、消息服务、并发管理服务、报表服务)和三个低代码服务(模型服务、低代码管理服务、自定义领域低代码数据服务),总内存消耗在10G左右,16G内存的笔记本可以跑起来。
该版本下载地址:
通过网盘分享的文件:hzero-demo-docker-openJ9
链接: https://pan.baidu.com/s/1atCVvaDxlR2LHhixVo3Q0Q?pwd=Hand 提取码: Hand (文件大小:大约20G, 建议使用百度超级会员下载大约20分钟,普通用户则会比较慢)
下载后:
一、先解压缩hzero-docker-images.tar.gz,加载docker镜像:
$ tar -xzvf hzero-docker-images.tar.gz
$ cd hzero-docker-images
$ bash load-dockers.sh
二、然后解压缩hzero-dockers-lowcode-min.tar.gz,启动服务:
$ tar -xzvf hzero-dockers-lowcode-min.tar.gz
启动服务命令:
$ cd hzero-dockers
$ bash lowcode-min-dockers-start.sh
关闭服务命令:
$ cd hzero-dockers
$ bash lowcode-min-dockers-stop.sh
三、访问系统,请参考 Jack.Shang的技术博客 » HZERO PaaS平台-Docker版demo笔记(五)安装部署readme (http://blog.retailsolution.cn/archives/5006)第三部分:访问系统。
关于作者:
| 昵称:Jack.shang 档案信息:jack.shang 程序员->项目经理->技术总监->项目总监->部门总监->事业部总经理->子公司总经理->集团产品运营支持 联系方式:你可以通过syfvb@hotmail.com联系作者 点击查看Jack.shang发表过的所有文章... 本文永久链接: http://blog.retailsolution.cn/archives/5062 |
对本文的评价:
