来自docker stats与cgroups的cpuPercent度量标准

时间:2017-07-19 16:45:05

标签: docker cgroups

我是cgroups的新手,并尝试使用cgroup获取容器统计信息。以前我使用的是docker stats,但也尝试使用cgroups收集类似的指标。

在docker stats中,cpu stats部分如下所示:

"cpu_usage": {
        "total_usage": 27120642519,
        "percpu_usage": [27120642519],
        "usage_in_kernelmode": 4550000000,
        "usage_in_usermode": 19140000000
    },
    "system_cpu_usage": 42803030000000,

并且,cpu%指标使用以下等式计算:

cpuDelta = float64(v.CpuStats.CpuUsage.TotalUsage - previousCPU)
systemDelta = float64(v.CpuStats.SystemUsage - previousSystem)
cpuPct = cpuDelta/systemDelta

我正在寻找cgroup来收集systemUsagetotalUsage,但它似乎没有类似的指标:

cgroups有一个伪文件cpuacct.stats,它有usersystem个刻度,但这些只与usage_in_user_mode中的usage_in_kernel_modedocker stats匹配输出

和cpuacct.usage_per_cpu伪文件具有每个cpu的使用量,它与上面的docker stats输出中的total_usage匹配。

$cat cpuacct.stat 
user 1914
system 455

$cat cpuacct.usage_percpu 
27120642519 

但是,我找不到任何方法来弄清楚如何从cgroups收集“systemUsage”。

任何线索都会有很大的帮助!

谢谢!

1 个答案:

答案 0 :(得分:3)

你的问题的答案并不在于cgroups。请参考下面提到的要点:

String url = (String) getIntent().getExtras().get(KEY);
  1. " system_cpu_usage" Docker stats API指的是主机的CPU使用情况。
  2. " cpu_usage" > " TOTAL_USAGE" Docker stats API指的是容器的每CPU使用情况。
  3. 因此,在计算了(cpuDelta / systemDelta)之后,我们得到了每个系统CPU的每CPU使用率。
  4. 现在我们需要将步骤3的结果与分配给docker容器的CPU总数相乘,以获得每个系统CPU的总CPU使用率。
  5. 步骤4的结果乘以100得出CPU利用率百分比。
  6. 回到问题: 如何通过docker计算系统CPU?

    要计算系统CPU使用率,docker使用" / proc / stat"由POSIX定义。它查找CPU统计信息行,然后汇总提供的前七个字段。为执行所需步骤而编写的golang代码如下所述。

    https://github.com/rancher/docker/blob/3f1b16e236ad4626e02f3da4643023454d7dbb3f/daemon/stats_collector_unix.go#L137

    [IIF(<frxDBDataSet1."IDPAY"> = 'NE', 'NIBUNG ESTATE', 'SARANG ESTATE')]
    

    请匹配&#34; system_cpu_usage&#34; docker stats API与下面提到的命令输出确认:

    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
    }