获取Docker容器CPU使用率作为百分比

Docker提供了一个交互式的stats命令, docker stats [cid] ,它提供了CPU使用情况的最新信息,如下所示:

 CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O 36e8a65d 0.03% 4.086 MiB/7.798 GiB 0.05% 281.3 MiB/288.3 MiB 

我试图以可消化格式的CPU使用率作为百分比来做一些分析。

我已经看到/ sys / fs中的统计信息,它们似乎提供了与Docker Remote API类似的值,它给了我这个JSON blob:

 { "cpu_usage": { "usage_in_usermode": 345230000000, "total_usage": 430576697133, "percpu_usage": [ 112999686856, 106377031910, 113291361597, 97908616770 ], "usage_in_kernelmode": 80670000000 }, "system_cpu_usage": 440576670000000, "throttling_data": { "throttled_time": 0, "periods": 0, "throttled_periods": 0 } } 

但我不确定如何得到一个确切的CPU使用率的百分比。

有任何想法吗?

如果您打算使用统计API调用 – 您可以看看docker客户端是如何执行的: https : //github.com/docker/docker/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go# L175-L188

 func calculateCPUPercent(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 } 

基本上,你有一个参考点,然后在10秒内看到差异,然后你可以知道有多less时间被容器使用。 说,我们从容器的0 SystemCPUUsage和0 CPUUsage开始。 如果10秒后,我们有10个SystemCPUUsage和1个CPUUsage,那么我们有10%的使用率。 您只需在纳秒内获得结果,而不是在API中获得结果。 实际时间并不重要,总SystemCPUUsage更改是重要的,然后比较CPUUSage。

在我们使用远程API之后,我们得到了这些字段: precpu_stats / cpu_stats

那么,基本上这里是代码:(javascript例子)

 var res <---- remote api response var cpuDelta = res.cpu_stats.cpu_usage.total_usage - res.precpu_stats.cpu_usage.total_usage; var systemDelta = res.cpu_stats.system_cpu_usage - res.precpu_stats.system_cpu_usage; var RESULT_CPU_USAGE = cpuDelta / systemDelta * 100; 

只是为了澄清RESULT_CPU_USAGE …这是从物理硬件消耗的资源量,所以假设您将RESULT_CPU_USAGE设置50% ,这意味着您的PC功耗的50%正在被容器X使用