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

时间:2018-11-15 14:52:45

标签: docker

使用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%吗?还是200%,因为我只有2个内核?

1 个答案:

答案 0 :(得分:2)

这是因为您可以拥有多个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统计工具使用的代码。