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

时间:2015-05-16 04:49:46

标签: docker containers cpu-usage lxc

Docker提供交互式统计信息命令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使用率百分比。

有什么想法吗?

3 个答案:

答案 0 :(得分:29)

如果您要使用Stats 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秒的差异,你就可以知道容器使用了多少时间。比如说,我们从容器的0 SystemCPUUsage和0 CPUUsage开始。如果在10秒后,我们有10个SystemCPUUsage和1个CPUUsage,那么我们有10%的使用率。您只是在API中以纳秒而非秒为结果。实际时间无关紧要,SystemCPUUsage的总变化是重要的,然后将CPUUSage与之比较。

答案 1 :(得分:6)

在我们使用远程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%,表示容器X正在使用 50%所有PC电源

答案 2 :(得分:0)

所以我也需要它,以下内容根据内核数量为我提供了正确的CPU使用率。

var cpuDelta = metric.cpu_stats.cpu_usage.total_usage -  metric.precpu_stats.cpu_usage.total_usage;
var systemDelta = metric.cpu_stats.system_cpu_usage - metric.precpu_stats.system_cpu_usage;
var RESULT_CPU_USAGE = cpuDelta / systemDelta * metric.cpu_stats.cpu_usage.percpu_usage.length * 100;

console.log(RESULT_CPU_USAGE);