我在docker sources for cpu calculation中看到了,但我不知道究竟是什么
为什么cpuDelta
除以SystemDelta
,为什么然后乘以PercpuUsage
?
文档说明cpuDelta
//计算两者之间容器的CPU使用率的变化 读数
和systemDelta
:
//计算读数之间整个系统的变化
所以不应将这些delta值相加并除以该delta时间内的总cpu(或通过的总纳秒数)?在所有container
同时消耗cpuDelta
和systemDelta
更新:我认为我得到了totalUsage是容器使用情况而SystemUsage不是容器使用的systemCPU
,而是整个系统超出容器cpu这就是为什么他们这样做了分开了。
答案 0 :(得分:3)
在issue 18615中进行了类似的讨论,导致PR 13627 "Update "docker stats " calculations"
我认为
cpuPercent = (cpuDelta / systemDelta) * float64(len(v.CpuStats.CpuUsage.PercpuUsage))
是对的,因为:
cpuDelta
是所有核心消耗的总时间和systemDelta
也是所有核心消耗的总时间,所以
例如,在4核系统上,CPU使用率可以在0到400%之间,因此必须乘以核心数。(cpuDelta / systemDelta)
是每个核心的平均CPU使用率,因此需要乘以cpu核心数来计算总CPU使用率。
答案 1 :(得分:1)
下面提到的几点将清楚地说明docker中的CPU利用率计算:
SystemUsage =正在运行docker的HOST的CPU利用率。这相当于"整个"在百分比公式中。
每个核心利用率的CONTAINER CPU更改
= CONTAINER CPU的上一个值 - CONTAINER CPU的当前值
主机CPU利用率的变化
=主机CPU的上一个值 - 主机CPU的当前值
在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
}
},