运行在ubuntu 22.04 系统上的docker,内存资源限制似乎不能正常生效?

我这里同样的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。

阅读 3.2k
1 个回答

破案了,ubuntu上安装的docker默认的 cgroup driver 是systemd,centos 默认的cgroup driver 是 cgroupfs v1,把ubuntu修改为 cgroupfs v1 就正常了。

修改方法:

修改 /etc/docker/daemon.json ,指定cgroupdriver为cgroupfs

{
  "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

重启后,cgroupdriver 被修改为cgroupfs,但是版本仍然为v2,这里需要修改为v1。

https://docs.docker.com/config/containers/runmetrics/#changin...

官方文档有描述:
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 一行中增加 systemd.unified_cgroup_hierarchy=0 ,然后运行 sudo update-grub ,重启系统后version 被修改成 v1。


虽然成功让它生效了,但是仍然不清楚为什么Cgroup Driversystemd时资源限制无效。


20230715 update:
因为java 8u372 之后才会有cgroupv2支持。

https://developers.redhat.com/articles/2023/04/19/openjdk-8u3...

所以实际docker的资源限制是生效的,只不过是java的并不识别。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题