【问题标题】:Docker container CPU usage exceeds 100% sometimes when streaming from "docker stats"从“docker stats”流式传输时,Docker 容器 CPU 使用率有时会超过 100%
【发布时间】:2018-11-15 23:40:23
【问题描述】:

使用docker stats时Docker容器统计超过100%怎么可能?最大CPU不应该

类似的输出:

$ docker stats

CONTAINER ID        NAME                                    CPU %               
b95a83497c91        awesome_brattain                        152.28%                              
67b2525d8ad1        foobar                                  0.00%                           
e5c383697914        test-1951.1.kay7x1lh1twk9c0oig50sd5tr   0.00%               
4bda148efbc0        random.1.vnc8on831idyr42slu578u3cr      0.00% 

我的用例是我试图找出容器可以从当前裸机主机的 CPU 中获取的最大使用量。

如果报告结果是关于可用内核的计数。如果我有 4 线程 CPU,最大值会是 400% 吗?还是 200% 因为我只有 2 个核心?

【问题讨论】:

  • 这不是通常的 Unix CPU 负载吗?如果有多个进程随时准备运行,负载将超过 100%。例如。如果两个进程连续运行,您将获得 200% 的 CPU 负载。
  • 我认为这更像是内核使用而不是 CPU,对吗?
  • 是的,我认为@AndrewNaguib 是正确的。事实上,这不仅仅是一个码头问题。我看到other process can also show more than 100% usage

标签: docker


【解决方案1】:

这是因为您可以拥有多个 CPU 内核,很可能就是这种情况。 100% CPU 意味着一个核心完全被占用。

编辑:虽然我没有找到很好的参考,但我深入研究了源代码:

func calculateCPUPercentUnix(previousCPU, previousSystem uint64, v *types.StatsJSON) float64 {
    var (
        cpuPercent = 0.0
        // calculate the change for the cpu usage of the container in between readings
        cpuDelta = float64(v.CPUStats.CPUUsage.TotalUsage) - float64(previousCPU)
        // calculate the change for the entire system between readings
        systemDelta = float64(v.CPUStats.SystemUsage) - float64(previousSystem)
        onlineCPUs  = float64(v.CPUStats.OnlineCPUs)
    )

    if onlineCPUs == 0.0 {
        onlineCPUs = float64(len(v.CPUStats.CPUUsage.PercpuUsage))
    }
    if systemDelta > 0.0 && cpuDelta > 0.0 {
        cpuPercent = (cpuDelta / systemDelta) * onlineCPUs * 100.0
    }
    return cpuPercent
}

https://github.com/docker/docker-ce/blob/master/components/cli/cli/command/container/stats_helpers.go#L181

这是您在示例中使用的 CLI 统计工具使用的代码。

【讨论】:

  • 你能添加参考吗?
  • 核心和线程可以互换使用,因为在所有主流操作系统上,每个都包含一个虚拟 CPU 的是超线程(如果有的话)。所以如果你有超线程,那就是线程。如果你不这样做,那么它仍然是线程,但线程和内核之间存在 1:1 的关系。而这些线程当然与操作系统线程无关。
  • 非常感谢你们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-20
  • 2017-09-26
  • 1970-01-01
相关资源
最近更新 更多