Мониторинг загрузки ЦП контейнера Docker

Согласно документации докера. Мы можем получить загрузку ЦП контейнера Docker с помощью команды docker stats. Столбец CPU % покажет процент ЦП хоста, который использует контейнер.

Допустим, я ограничиваю использование контейнером 50% одного ЦП хоста. Я могу указать ограничение на 50% одного ядра ЦП с помощью параметра --cpus=0.5 в соответствии с https://docs.docker.com/config/containers/resource_constraints/

Как мы можем получить процент использования ЦП контейнера из разрешенного ядра ЦП с помощью любой команды докера? Например. Из 50% одного ядра ЦП используется 99%.

Есть ли способ получить его с помощью cadvisor или prometheus?


person Nitul    schedule 09.09.2020    source источник


Ответы (1)


Как мы можем получить процент использования ЦП контейнера из разрешенного ядра ЦП с помощью любой команды докера? Например. Из 50% одного ядра ЦП используется 99%.

В Docker есть команда docker stats, которая показывает использование ЦП/памяти и некоторые другие статистические данные:

CONTAINER ID   NAME                                   CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS
c43f085dea8c   foo_test.1.l5haec5oyr36qdjkv82w9q32r   0.00%     11.15MiB / 100MiB     11.15%    7.45kB / 0B      3.29MB / 8.19kB   9

Хотя он показывает использование памяти в отношении ограничения по умолчанию, для ЦП такой функции пока нет. Это можно решить с помощью скрипта, который вычислит значение на лету, но я бы предпочел второй вариант.

Есть ли способ получить его с помощью cadvisor или prometheus?

Да, есть:

irate(container_cpu_usage_seconds_total[2m]) / ignoring(cpu) (container_spec_cpu_quota/container_spec_cpu_period)

Левая сторона представляет собой обычную функцию irate, которая вычисляет, сколько секунд процессорного ядра машины использовал контейнер. Он идет с меткой cpu="total", которой нет на правой стороне, поэтому там ignoring(cpu).

В правой части вычисляется, сколько ядер процессора разрешено использовать контейнеру. Есть две метрики:

container_spec_cpu_quota - фактическое значение квоты. Значение вычисляется из доли ядер ЦП, которую вы установили в качестве предела, и умножается на container_spec_cpu_period.

container_spec_cpu_period — исходит из планировщика CFS и похож на единицу от стоимости квоты.

Я знаю, что это может быть трудно понять поначалу, позвольте мне объяснить на примере:

Учтите, что для container_spec_cpu_period установлено значение по умолчанию, равное 100 000 микросекунд, а ограничение ЦП контейнера равно половине ядра (0,5). В таком случае:

container_spec_cpu_period 100,000
container_spec_cpu_quota  50,000  # =container_spec_cpu_period*0.5

С ограничением ЦП, установленным на два ядра, у вас будет это:

container_spec_cpu_quota  200,000

И таким образом, разделив одно на другое, мы получаем долю ядер ЦП обратно, которая затем используется в другом делении для расчета того, сколько из лимита используется.

person anemyte    schedule 01.07.2021