Docker容器CPU使用率监控

问题描述

根据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 内核的分数,然后在另一个除法中使用它来计算使用了多少限制。