我们如何通过任何 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{cpu="total"}[1m])
/ ignoring(cpu)
(container_spec_cpu_quota/container_spec_cpu_period)
第一行是典型的irate
计算容器已使用多少 CPU 秒的函数。它带有一个标签cpu="total"
,第二部分没有,这就是为什么有ignoring(cpu)
.
底线计算允许容器使用多少个 CPU 核心。有两个指标:
container_spec_cpu_quota
- 实际配额值。该值是根据您设置为限制的 CPU 核心分数乘以计算得出的container_spec_cpu_period
.
container_spec_cpu_period
- 来自CFS调度程序 https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt它就像配额值的单位。
我知道一开始可能很难理解,请允许我用一个例子来解释:
考虑一下你有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 核心的比例,然后在另一个除法中使用该比例来计算使用了多少限制。