繁体   English   中英

获取容器内的 docker cpu/内存限制

[英]Get docker cpu/memory limit inside container

我在我的 dockerized 服务器中实现了一项功能,当 cpu 和 memory 利用率过高时,它会忽略一些请求。

我已经找到了如何获取容器内进程使用的memory和 cpu 时间,但我还需要一种方法来获取 cpu 限制和 memory 限制(由运行时选项设置)来计算百分比。

另外,我可以从/proc/loadavg读取主机系统的负载,是否有我可以读取的“每个容器负载”?

我在 openjdk 14 上使用 Java/Kotlin。

更新:我发现我可以从/sys/fs/cgroup/memory/memory.limit_in_bytes获得 memory 限制

这一切都由 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

memory 的使用和限制非常易于监控。 这比监控 Java 堆使用情况更准确,因为堆只是 Java 使用的 memory 的一部分。

在此期间的 CPU 配额为您提供分配的部分 CPU 数量,150000/100000 = 1.5。 您可以随着时间的推移监控 cpuacct.usage 以计算它何时超过限制并限制您的进程。

对于 cgroup2:

/ # cat /sys/fs/cgroup/memory.current
503808

/ # cat /sys/fs/cgroup/memory.max
1073741824

/ # cat /sys/fs/cgroup/cpu.stat
usage_usec 58384
user_usec 23602
system_usec 34782
nr_periods 37
nr_throttled 0
throttled_usec 0

/ # cat /sys/fs/cgroup/cpu.max
150000 100000

参见: https://facebookmicrosites.github.io/cgroup2/docs/cpu-controller.html

见2: https://facebookmicrosites.github.io/cgroup2/docs/memory-controller.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM