Использование процессора Docker Container в процентах

Docker предоставляет команду интерактивных статистических данных docker stats [cid], которая дает актуальную информацию об использовании ЦП, например:

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

Я пытаюсь получить использование ЦП в процентах в удобоваримом формате, чтобы сделать некоторый анализ.

Я видел статистику в /sys/fs, которая, похоже, предоставляет аналогичные значения, такие как Docker Remote API, который дает мне этот BLOB-код JSON:

{
    "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
    }
}

Но я не уверен, как получить точное использование ЦП в процентах от этого.

Любые идеи?

Ответы

Ответ 1

Если вы собираетесь использовать вызов API статистики, вы можете посмотреть, как это делает клиент докер: 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 с этим.

Ответ 2

После использования удаленного 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%, это означает, что 50% всей мощности вашего компьютера используется контейнером X