Установить лимит ЦП в Docker Compose

У меня есть локальный сервер, на котором я хотел бы развернуть множество микросервисов. Я использую файл docker-compose для объявления всех служб и хотел бы установить ограничение процессора. Я ссылаюсь на документы ниже: https://docs.docker.com/compose/compose-file/ Мой файл компоновки докеров выглядит так:

version: "3.7"
services:
  redis:
    image: redis:alpine
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 256M
        reservations:
          cpus: '0.25'
          memory: 64M
  service1:
    image: service1 image
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 64M

...

Я запутался, чтобы рассчитать пределы процессора. Например, у процессора 8 ядер. Есть 20 микросервисов. Есть ли способ рассчитать лимит ЦП для каждой службы? Или какие-либо формулы для этого?

----- ОБНОВЛЕНИЕ ------ Чтобы было понятнее, моя главная мысль здесь - ограничение ЦП. Это потому, что я хотел бы отправить предупреждение, если ЦП одного микросервиса использует 80% ЦП для этого микросервиса. Если я не установлю ограничение ЦП, правда ли, что использование ЦП микросервиса будет таким же, как использование ЦП хоста? Я не использую Docker's Swarn, а только Docker.

Любые идеи действительно ценятся.

Спасибо,


person Kenny Tai Huynh    schedule 09.01.2020    source источник


Ответы (1)


Перегрузка ЦП на самом деле не проблема. Если у вас есть 16 процессов, и все они пытаются выполнить работу, требующую 100% загрузки ЦП в 8-ядерной системе, ядро ​​будет распределять время между процессами; на практике вы должны ожидать, что каждый из этих процессов получит 50% ЦП, а задача займет вдвое больше времени. Один совет, который я слышал (в пространстве Kubernetes), заключается в том, чтобы устанавливать запросы ЦП на основе требований к стационарной нагрузке службы и не устанавливать ограничения ЦП.

Не существует волшебной формулы для установки любого из этих чисел. Лучший способ — настроить какую-нибудь систему метрик, например Prometheus, запустить вашу комбинированную систему и посмотреть на фактическое использование ресурсов. В некоторых случаях можно узнать, что процесс является однопоточным и никогда не будет использовать более 1 ядра, или что вы ожидаете, что процесс будет привязан к вводу-выводу, и если это не так, он должен быть ограничен, но на основе этих настроек на фактических использование, вероятно, лучше.

(Память отличается тем, что у вас может фактически закончиться физическая память, но также и то, что процессы способны удерживать гораздо больше памяти, чем им на самом деле нужно. Опять же, здесь будет полезен инструмент метрик.)

Ваш вопрос предполагает один хост. Раздел deploy: работает только с диспетчером кластера Docker Swarm. Если вы не используете Swarm, вам нужно использовать файл version: '2' docker-compose.yml с другой набор объявлений ограничений ресурсов (и в основном не имеет понятия "резервирование"). Например,

version: '2'
services:
  redis:
    image: redis:alpine
    # cpus: 2.0
    mem_limit: 256m
    mem_reservation: 64m
person David Maze    schedule 09.01.2020
comment
+1 для @David Maze, по крайней мере, за ответ. Да, в моем случае требуется просто использовать Docker на локальном сервере. Нет Docker's Swarm. Моя главная мысль здесь - ограничение ЦП. Это потому, что я хотел бы отправить предупреждение, если ЦП одного микросервиса использует 80% ЦП для этого микросервиса. Если я не установлю ограничение ЦП, правда ли, что использование ЦП микросервиса будет таким же, как использование ЦП хоста? - person Kenny Tai Huynh; 09.01.2020