有时从 "docker stats" 流式传输时,Docker 容器的 CPU 使用率会超过 100%

3
当使用docker stats时,Docker容器的统计数据超过了100%,这是怎么可能的?最大CPU不应该是<= 100吗?
类似输出:
$ 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%吗?还是因为我只有2个核心而是200%?


这不是通常的Unix CPU负载吗?如果有超过一个进程始终准备运行,负载将超过100%。例如,如果有两个进程持续运行,您将获得200%的CPU负载。 - Kuba hasn't forgotten Monica
1
我认为这更像是核心使用而不是CPU,我对吗? - ndrwnaguib
是的,我认为@AndrewNaguib是正确的。这实际上不仅仅是一个Docker问题。我看到其他进程也可能显示超过100%的使用率 - scipsycho
1个回答

10

这是因为您可能有多个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
}

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

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


请问您能否添加引用? - ndrwnaguib
1
核心和线程可以互换使用,因为它们都是超线程(如果有)组成一个虚拟 CPU - 在所有主流操作系统上。所以如果您启用了超线程,则是线程。如果没有,则仍然是线程,但线程与核心之间存在1:1的关系。当然,这些线程与操作系统线程无关。 - Kuba hasn't forgotten Monica
非常感谢你们两位。 - ndrwnaguib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接