我正在我的 dockerized 服务器中实现一个功能,当 cpu 和内存利用率过高时,它将忽略一些请求。
我已经找到了如何获取容器内进程使用的内存和CPU时间,但我还需要一种方法来获取CPU限制和内存限制(由运行时选项设置)来计算百分比。
另外,我可以从 读取主机系统的负载/proc/loadavg,是否有我可以读取的“每个容器负载”?
我在 openjdk 14 上使用 Java/Kotlin。
更新:我发现我可以获得内存限制/sys/fs/cgroup/memory/memory.limit_in_bytes
BMi*_*tch 10
这都是由cgroup控制的。因此您可以检查 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
Run Code Online (Sandbox Code Playgroud)
内存使用情况和限制非常容易监控。这比监视 Java 堆使用情况更准确,因为堆只是 Java 使用的内存的一部分。
这段时间内的 CPU 配额为您提供了分配的 CPU 分数,150000/100000 = 1.5。您可以随着时间的推移监控 cpuacct.usage 来计算它何时超过限制并限制您的进程。
| 归档时间: |
|
| 查看次数: |
5423 次 |
| 最近记录: |