获取Docker容器CPU使用百分比

u4dcyp6a  于 2023-03-17  发布在  Docker
关注(0)|答案(3)|浏览(251)

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类似,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使用率作为一个百分比。
有什么想法吗?

jmp7cifd

jmp7cifd1#

如果您打算使用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%的使用率。您只需要以纳秒(而不是秒)为单位给出结果,实际时间并不重要,重要的是SystemCPUUsage的总变化,然后将CPUUsage与之进行比较。

von4xj4u

von4xj4u2#

在使用远程API之后,我们会得到以下字段:预处理器统计信息/CPU统计信息
下面是代码:(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_USAGE50%,这意味着**50%**的PC功率被container X使用

3b6akqbq

3b6akqbq3#

所以我也需要这个,下面给我正确的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);

相关问题