1

As per the documentation of docker. We can get CPU usage of docker container with docker stats command. The column CPU % will give the percentage of the host’s CPU the container is using.

Let say I limit the container to use 50% of hosts single CPU. I can specify 50% single CPU core limit by --cpus=0.5 option as per https://docs.docker.com/config/containers/resource_constraints/

How can we get the CPU% usage of container out of allowed CPU core by any docker command? E.g. Out of 50% Single CPU core, 99% is used.

Is there any way to get it with cadvisor or prometheus?

4

1 回答 1

2

我们如何通过任何 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- 实际配额值。该值是根据您设置为限制并乘以 的一部分 CPU 内核计算得出的container_spec_cpu_period

container_spec_cpu_period- 来自CFS 调度器,它就像配额值的一个单位。

我知道一开始可能很难掌握,请允许我举例说明:

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

于 2021-07-01T21:29:52.090 回答