在docker cpu使用计算中有什么:TotalUsage,SystemUsage,PercpuUsage以及计算意味着什么?

时间:2016-02-29 05:39:31

标签: go docker

我在docker sources for cpu calculation中看到了,但我不知道究竟是什么

  1. TotalUsage
  2. SystemUsage
  3. PercpuUsage
  4. 为什么cpuDelta除以SystemDelta,为什么然后乘以PercpuUsage

    文档说明cpuDelta

      

    //计算两者之间容器的CPU使用率的变化   读数

    systemDelta

      

    //计算读数之间整个系统的变化

    所以不应将这些delta值相加并除以该delta时间内的总cpu(或通过的总纳秒数)?在所有container同时消耗cpuDeltasystemDelta

    之后

    更新:我认为我得到了totalUsage是容器使用情况而SystemUsage不是容器使用的systemCPU,而是整个系统超出容器cpu这就是为什么他们这样做了分开了。

2 个答案:

答案 0 :(得分:3)

issue 18615中进行了类似的讨论,导致PR 13627 "Update "docker stats " calculations"

  

我认为cpuPercent = (cpuDelta / systemDelta) * float64(len(v.CpuStats.CpuUsage.PercpuUsage))是对的,因为:

     
      
  • cpuDelta是所有核心消耗的总时间和
  •   
  • systemDelta也是所有核心消耗的总时间,
  •   
     

所以(cpuDelta / systemDelta)是每个核心的平均CPU使用率,因此需要乘以cpu核心数来计算总CPU使用率。

     例如,在4核系统上,CPU使用率可以在0到400%之间,因此必须乘以核心数。

答案 1 :(得分:1)

下面提到的几点将清楚地说明docker中的CPU利用率计算:

  1. 使用"系统"关键字始终引用正在运行docker的HOST指标。
  2. 没有关键字"系统"的指标始终参考与之相关的指标 在docker里面运行的集装箱。
  3. REMEMBER the percentage formula

  4. SystemUsage =正在运行docker的HOST的CPU利用率。这相当于"整个"在百分比公式中。

  5. TotalUsage =在docker中运行的CONTAINER的每个核心的CPU利用率。这相当于" PART"在百分比公式中。
  6. PercpuUsage =分配给CONTAINER的CPU核心的单独利用率。这也让我们知道分配给CONTAINER的CPU核心数量。
  7. 每个核心利用率的CONTAINER CPU更改

    = CONTAINER CPU的上一个值 - CONTAINER CPU的当前值

  8. 主机CPU利用率的变化

    =主机CPU的上一个值 - 主机CPU的当前值

  9. CONTAINER CPU利用率的总变化=每个核心利用率的CONTAINER CPU变化*分配给容器的核心数量[PercpuUsage核心数]
  10. CPU利用率(%)=(CONTAINER CPU利用率的总变化/主机CPU利用率的变化)* 100
  11. 在golang中为docker编写的CPU利用率代码可以更容易理解上面提到的术语: https://github.com/moby/moby/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go#L175-L188

    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)
        )
    
        if systemDelta > 0.0 && cpuDelta > 0.0 {
            cpuPercent = (cpuDelta / systemDelta) * float64(len(v.CPUStats.CPUUsage.PercpuUsage)) * 100.0
        }
        return cpuPercent
    }
    

    来自Docker stats API的CPU统计数据

     "cpu_stats": {
        "cpu_usage": {
          "total_usage": 18730109057613,
          "percpu_usage": [
            2037710936955,
            1481642385431,
            1344435820732,
            1163032744042,
            1204372068508,
            5758852306067,
            1170010183583,
            988020711114,
            1191435357423,
            743892480387,
            715658853679,
            931045209692
          ],
          "usage_in_kernelmode": 856990000000,
          "usage_in_usermode": 17572550000000
        },
        "system_cpu_usage": 123541016890000000,
        "throttling_data": {
          "periods": 0,
          "throttled_periods": 0,
          "throttled_time": 0
        }
      },
    

    来自Docker stats API的先前CPU统计数据[计算初始和最终差异所需的]

    "precpu_stats": {
        "cpu_usage": {
          "total_usage": 18730095876882,
          "percpu_usage": [
            2037709694286,
            1481641884454,
            1344434727538,
            1163031727858,
            1204370950455,
            5758849538503,
            1170009778051,
            988019895578,
            1191434644418,
            743892204863,
            715658782597,
            931042048281
          ],
          "usage_in_kernelmode": 856980000000,
          "usage_in_usermode": 17572550000000
        },
        "system_cpu_usage": 123541004930000000,
        "throttling_data": {
          "periods": 0,
          "throttled_periods": 0,
          "throttled_time": 0
        }
      },