问题描述
根据docker的文档。 我们可以使用 docker stats 命令获取docker容器的cpu使用率。 “ cpu%”列将给出容器使用的主机cpu的百分比。
假设我限制容器使用50%的主机使用单个cpu。我可以根据https://docs.docker.com/config/containers/resource_constraints/
通过--cpus = 0.5选项指定50%的单cpu内核限制如何通过任何docker命令从允许的cpu内核中获取容器的cpu%使用率? 例如。在50%的单cpu内核中,使用了99%。
有什么方法可以通过cadvisor或prometheus获得它吗?
解决方法
我们如何通过任何 docker 命令从允许的 CPU 内核中获取容器的 CPU% 使用率?例如。在 50% 的单 CPU 内核中,99% 被使用。
Docker 有 docker stats
命令可以显示 CPU/内存使用情况和其他一些统计信息:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c43f085dea8c foo_test.1.l5haec5oyr36qdjkv82w9q32r 0.00% 11.15MiB / 100MiB 11.15% 7.45kB / 0B 3.29MB / 8.19kB 9
虽然它确实显示了关于开箱即用限制的内存使用情况,但 CPU 还没有这样的功能。可以使用脚本来解决这个问题,该脚本将即时计算值,但我宁愿选择第二个选项。
有什么办法可以用cadvisor或prometheus获得吗?
是的,有:
irate(container_cpu_usage_seconds_total[2m]) / ignoring(cpu) (container_spec_cpu_quota/container_spec_cpu_period)
左侧是一个常用的 irate
函数,用于计算容器已使用的所有机器 CPU 内核的秒数。它带有一个标签 cpu="total"
,右侧没有,这就是为什么有 ignoring(cpu)
。
右侧部分计算允许容器使用多少 CPU 内核。有两个指标:
container_spec_cpu_quota
- 实际配额值。该值是根据您设置为限制并乘以 container_spec_cpu_period
的一小部分 CPU 内核计算得出的。
container_spec_cpu_period
- 来自 CFS Scheduler,它就像配额值的单位。
我知道一开始可能很难理解,请允许我举例说明:
假设您已将 container_spec_cpu_period
设置为默认值,即 100,000 微秒,并且容器 CPU 限制设置为半个内核 (0.5)。在这种情况下:
container_spec_cpu_period 100,000
container_spec_cpu_quota 50,000 # =container_spec_cpu_period*0.5
将 CPU 限制设置为两个核心后,您将拥有:
container_spec_cpu_quota 200,000
因此,通过一个除以另一个,我们得到 CPU 内核的分数,然后在另一个除法中使用它来计算使用了多少限制。