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