在容器内获取Docker的CPU/内存限制

3
我正在实现一个功能,使得在docker化的服务器中当cpu和内存使用率过高时会忽略一些请求。
我已经找到了如何获取容器内进程的内存和cpu使用时间 这里,但我还需要一种方法来获取cpu限制和内存限制的方式(运行时选项中设置),以计算百分比。
此外,我可以从/proc/loadavg读取主机系统的负载,是否有“每个容器的负载”可供阅读呢?
我正在使用Java/Kotlin开发并使用openjdk 14。
更新:我发现我可以从/sys/fs/cgroup/memory/memory.limit_in_bytes获取内存限制。

1
现代JVM已经知道如何根据cgroup内存限制设置堆大小,因此这应该减少到更可移植的问题,即找出当前Java堆利用率。 - David Maze
2个回答

10

所有这些都是由cgroups控制的。因此,您可以检查cgroup的限制和利用率:

$ docker run -it --rm --cpus 1.5 --memory 1g busybox /bin/sh
/ # cat /sys/fs/cgroup/memory/memory.usage_in_bytes
3043328
/ # cat /sys/fs/cgroup/memory/memory.limit_in_bytes
1073741824
/ # cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
150000
/ # cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
/ # cat /sys/fs/cgroup/cpu/cpuacct.usage
97206588

内存使用和限制的监控相对比较简单。这种方法比监控 Java 堆使用更加准确,因为堆仅是 Java 使用的内存的一部分。

在一段时间内,CPU 配额告诉您已分配的小数 CPU 数量,150000/100000 = 1.5。您可以随着时间推移监控 cpuacct.usage,以计算何时超出限制并使进程受到限制。


我相信memory.usage_in_bytes包括磁盘缓存使用的内存?有没有一种方法可以获取没有磁盘缓存的内存?(memory.stat中的total_rss呢?) - Pegasis
2023年:不确定在当前版本的podman和docker中,正确的查找位置似乎应该是/sys/fs/cgroup/cpu.max,因为其他位置不可见。 - undefined

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接