Docker容器CPU使用率监控

Nit*_*tul 3 performance monitoring docker prometheus cadvisor

根据 docker 的文档。\n我们可以使用docker stats命令获取 docker 容器的 CPU 使用情况。\nCPU % 列将给出容器正在使用的主机\xe2\x80\x99s CPU 的百分比。

\n

假设我限制容器使用 50% 的主机单个 CPU。我可以根据https://docs.docker.com/config/containers/resource_constraints/通过 --cpus=0.5 选项指定 50% 单 CPU 核心限制

\n

我们如何通过任何 docker 命令获取容器的 CPU% 使用率超出允许的 CPU 核心?\n例如 50% 的单 CPU 核心中,99% 已被使用。

\n

有什么办法可以用cadvisor或prometheus来获取它吗?

\n

ane*_*yte 8

我们如何通过任何 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
Run Code Online (Sandbox Code Playgroud)

虽然它确实显示了关于开箱即用限制的内存使用情况,但 CPU 还没有这样的功能。可以使用动态计算值的脚本来解决这个问题,但我宁愿选择第二个选项。

有什么办法可以用cadvisor或prometheus来获取它吗?

就在这里:

irate(container_cpu_usage_seconds_total{cpu="total"}[1m]) 
/ ignoring(cpu) 
(container_spec_cpu_quota/container_spec_cpu_period)
Run Code Online (Sandbox Code Playgroud)

第一行是一个典型的irate函数,用于计算容器已使用了多少 CPU 秒。它带有一个标签cpu="total",第二部分没有,这就是为什么有ignoring(cpu)

底线计算允许容器使用多少个 CPU 核心。有两个指标:

container_spec_cpu_quota- 实际配额值。该值是根据您设置为限制的 CPU 核心分数乘以计算得出的container_spec_cpu_period

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
Run Code Online (Sandbox Code Playgroud)

将 CPU 限制设置为两个核心后,您将得到以下结果:

container_spec_cpu_quota  200,000
Run Code Online (Sandbox Code Playgroud)

因此,通过除以另一个,我们可以得到 CPU 核心的比例,然后在另一个除法中使用该比例来计算使用了多少限制。