JVM无法获取容器资源限制

JVM无法获取容器资源限制

马草原 472 2021-11-28

JVM无法获取容器资源限制

最近发现一个问题,运行在容器的应用获取到的CPU、内存等资源是其宿主机的全部,而不是容器分配的。打个比方,在16核心 32G内存的宿主机上分配一个4核心 8G内存的容器,里面的程序获取到的系统资源依然是16核心,比如一些GC线程数等影响性能的操作就会因为获取到的资源配额不对而出问题。

经过排查程序代码完全一致,Docker版本一致。
JDK版本不一致。

本地是jdk 8u191
线上是jdk8u144

原来是本地的jdk版本搞错了,从jdk 8u191以后才支持容器
参考:https://www.oracle.com/java/technologies/javase/8u191-relnotes.html#JDK-8146115

如何获取容器资源配额呢?

首先从/proc/self/mounts中读取对应的资源的mount位置

内存

$ cat /sys/fs/cgroup/memory/memory.limit_in_bytes
10737418240 

CPU

可以通过quota/period来算:

核心数 = cpu.cfs_quota_us / cpu.cfs_period_us

CPU 配置为 4 个核心:

$ cat /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us #单CPU总时间片配额,微秒 
100000
$ cat /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us #时间片内,容器可占用的CPU时间
400000

docker