2 回答

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% 之间的任何位置,因此必须乘以内核数。

TA贡献1783条经验 获得超4个赞
下面提到的几点将清楚地了解docker中的CPU利用率计算:
带有“system”关键字的指标始终是指运行 docker 的 HOST 指标。
没有关键字“系统”的指标总是指与在 docker 中运行的 CONTAINER 相关的指标。
SystemUsage = 运行 docker 的 HOST 的 CPU 使用率。这相当于百分比公式中的“WHOLE”。
TotalUsage = 在 docker 中运行的 CONTAINER 每个核心的 CPU 利用率。这相当于百分比公式中的“PART”。
PercpuUsage = 分配给 CONTAINER 的 CPU 内核的单独利用率。这也让我们知道分配给 CONTAINER 的 CPU 内核数。
每个内核利用率的 CONTAINER CPU 变化
= CONTAINER CPU 的先前值 - CONTAINER CPU 的当前值
主机 CPU 利用率的变化
= 主机 CPU 的先前值 - 主机 CPU 的当前值
CONTAINER CPU 利用率的总变化=每个内核利用率的 CONTAINER CPU 变化 * 分配给容器的内核数[PercpuUsage 内核数]
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
}
},
- 2 回答
- 0 关注
- 681 浏览
添加回答
举报