我这里同样的2台机器,一台系统是ubuntu 22.04 ,一台是centos 7.9 。
在centos 7.9 上,docker的资源限制正常功能。在容器内的jvm能正常识别到容器的内存限制。
这个容器限制了4G内存,在容器内的jvm能看到Max Heap大小为910M,大约1/4的占用。
[root@8841b7c15a66 /]# java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 910.50M
Ergonomics Machine Class: server
Using VM: Java HotSpot(TM) 64-Bit Server VM
java version "1.8.0_333"
Java(TM) SE Runtime Environment (build 1.8.0_333-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.333-b02, mixed mode)
相同的镜像,放在ubuntu 22.04的服务器上,同样限制4G内存,但是在容器内看到的却是:
[root@060999c42ca4 /]# java -XshowSettings:vm -version
VM settings:
Max. Heap Size (Estimated): 6.59G
Ergonomics Machine Class: server
Using VM: Java HotSpot(TM) 64-Bit Server VM
java version "1.8.0_333"
Java(TM) SE Runtime Environment (build 1.8.0_333-b02)
Java HotSpot(TM) 64-Bit Server VM (build 25.333-b02, mixed mode)
看上去好像没有正常识别到。
两个服务器上安装的都是 docker-ce 20.10.21 版本。
有人遇到过这个问题吗,似乎在ubuntu 22.04 系统上是必现的,有点像bug。
破案了,ubuntu上安装的docker默认的 cgroup driver 是systemd,centos 默认的cgroup driver 是 cgroupfs v1,把ubuntu修改为 cgroupfs v1 就正常了。
修改方法:
修改
/etc/docker/daemon.json
,指定cgroupdriver为cgroupfs重启后,cgroupdriver 被修改为cgroupfs,但是版本仍然为v2,这里需要修改为v1。
官方文档有描述:
编辑
/etc/default/grub
,在GRUB_CMDLINE_LINUX
一行中增加systemd.unified_cgroup_hierarchy=0
,然后运行sudo update-grub
,重启系统后version 被修改成 v1。虽然成功让它生效了,但是仍然不清楚为什么
Cgroup Driver
为systemd
时资源限制无效。20230715 update:
因为java 8u372 之后才会有cgroupv2支持。
所以实际docker的资源限制是生效的,只不过是java的并不识别。