为了账号安全,请及时绑定邮箱和手机立即绑定

在 docker cpu 使用率计算中,什么是:TotalUsage、SystemUsage

在 docker cpu 使用率计算中,什么是:TotalUsage、SystemUsage

Go
长风秋雁 2021-12-20 10:35:58
我在docker 资源中看到cpu 计算,但我不明白到底是什么总用量系统使用PercpuUsage为什么cpuDelta除以SystemDelta然后又乘以PercpuUsage?文档说 cpuDelta// 计算两次读数之间容器的 CPU 使用率的变化对于systemDelta:// 计算两次读数之间整个系统的变化那么这些 delta 不应该在那个 delta 时间内相加并除以总 cpu(或通过的总纳秒数)吗?毕竟container是耗时两个cpuDelta,也systemDelta更新:我想我明白了,totalUsage 是容器使用量,而 SystemUsage 不是容器使用的,systemCPU而是容器 cpu 之外的整个系统,这就是它们被划分的原因。
查看完整描述

2 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

issue 18615 中有一个类似的讨论,导致PR 13627“更新“docker stats”计算”

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

  • cpuDelta 是所有内核消耗的总时间和

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

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

例如,在 4 核系统上,cpu 使用率可以在 0 到 400% 之间的任何位置,因此必须乘以内核数。


查看完整回答
反对 回复 2021-12-20
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

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

  1. 带有“system”关键字的指标始终是指运行 docker 的 HOST 指标。

  2. 没有关键字“系统”的指标总是指与在 docker 中运行的 CONTAINER 相关的指标。

  3. 记住百分比公式

  4. SystemUsage = 运行 docker 的 HOST 的 CPU 使用率。这相当于百分比公式中的“WHOLE”。

  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 利用率(%)=(容器 CPU 利用率的总变化/主机 CPU 利用率的变化)* 100

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

    }

  },


查看完整回答
反对 回复 2021-12-20
  • 2 回答
  • 0 关注
  • 681 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号