Ограничьте ЦП и память с помощью cgroup в серверной версии Ubuntu 20.04 LTS

У меня есть 3 группы на сервере Ubuntu 20.04 LTS: группа1, группа2, группа3. Я хотел бы ограничить ЦП и память для каждой группы.

  1. Группе 1 разрешено использовать только 20% ЦП и 10 ГБ ОЗУ.
  2. Группе 2 разрешено использовать только 30% ЦП и 15 ГБ ОЗУ.
  3. Группе 3 разрешено использовать только 50% ЦП и 20 ГБ ОЗУ.

Возможно ли это с помощью systemd и cgroup в серверной версии 20.04 LTS? Или есть какой-то другой метод?

1 ответ

Я знаю, что это может быть поздно, но вот что сработало для меня. Эти шаги были выполнены на Pop! OS 20.04 (после Ubuntu 20.04), но я думаю, что они также будут работать на сервере Ubuntu. Возможно, вы захотите запустить все эти команды в терминале суперпользователя (с повышенными правами). Просто введите его с помощьюsudo su.

Далее я настрою ограничения cgroup таким образом, что пользователям, принадлежащим к группе, будет разрешено использовать только 95% ЦП и 28 ГБ ОЗУ. Вы можете внести соответствующие изменения (добавить несколько групп, изменить имена мест назначения, ограничения и т. д.). Я использую вим (vi), вы можете использовать любой редактор.

  1. Установитьcgroup-toolsупаковка

            apt install cgroup-tools -y
    
  2. Скопируйте конфигурации по умолчанию из документации

            cp /usr/share/doc/cgroup-tools/examples/cgred.conf /etc/
    # Verify file
    view /etc/cgred.conf
    
  3. Создайте файл для ограничений cgroup (конфигураций)

            vi /etc/cgconfig.conf
    

    Введите в файл следующее

            group ucglims {
         cpu {
             cpu.cfs_quota_us=95000;
         }
         memory {
             memory.limit_in_bytes = 28g;
         }
    }
    

    Имя является пунктом назначения (для упоминания ограничений). Это не название группы.

  4. Создайте правила для сопоставления пользователей, групп с ресурсами и пунктами назначения.

            vi /etc/cgrules.conf
    

    Введите в файл следующее

            #<user>        #<controllers>         #<destination>
    @cglims        cpu,memory             ucglims
    

    Это означает, что количество пользователей в группе будет ограниченоcpuиmemory(ОЗУ) ограничения вucglimsназначения (описано ранее).

  5. Разобрать и применить конфигурации

            # Parse
    /usr/sbin/cgconfigparser -l /etc/cgconfig.conf
    # Apply
    /usr/sbin/cgrulesengd -vvv
    

    Приведенная выше команда активирует ограничения контрольной группы. Вы можете проверить это. Скажем, у вас есть пользователь в группеcglims. Войдите как этот пользователь и запустите

            # Login as test123 (shouldn't be elevated; open separate terminal)
    su test123
    # See if this is getting populated
    cat /sys/fs/cgroup/memory/ucglims/tasks
    cat /sys/fs/cgroup/cpu/ucglims/tasks
    # Run the following for 'test123' user. It should fail
    # WARN: This tries getting 40 GB RAM
    stress -m 4 --vm-bytes 10G --vm-keep -t 10
    

    Последняя команда выше должна завершиться ошибкой (исходя изtest123). По крайней мере, вы увидите, что после ограничения 28 ГБ на ОЗУ он начнет использовать своп (вместо ОЗУ). Процесс уничтожается, если у него заканчивается пространство подкачки (но остается 28 ГБ, остальная часть ОЗУ остается свободной).

    Вы можете использовать стресс и для других видов предельных тестов.

  6. Мы должны сделать это постоянным (чтобы это все не потерялось после перезагрузки). мы создадимsystemdсервисы для этого.

    1. Создать сервис для парсинга

                vi /etc/systemd/system/cgconfigparser.service
      

      Введите следующее

                [Unit]
      Description=cgroup config parser
      After=network.target
      
      [Service]
      User=root
      Group=root
      ExecStart=/usr/sbin/cgconfigparser -l /etc/cgconfig.conf
      Type=oneshot
      
      [Install]
      WantedBy=multi-user.target
      
    2. Создать сервис для применения правил

                vi /etc/systemd/system/cgrulesgend.service
      

      Введите следующее

                [Unit]
      Description=cgroup rules generator
      After=network.target cgconfigparser.service
      
      [Service]
      User=root
      Group=root
      Type=forking
      EnvironmentFile=-/etc/cgred.conf
      ExecStart=/usr/sbin/cgrulesengd
      Restart=on-failure
      
      [Install]
      WantedBy=multi-user.target
      
    3. Теперь перезагрузите демон systemd, включите службы и запустите их.

                # Reload context daemon to 'discover' everything
      sudo systemctl daemon-reload
      # Enable services to run on boot
      sudo systemctl enable cgconfigparser
      sudo systemctl enable cgrulesgend
      # Start them
      sudo systemctl start cgconfigparser
      sudo systemctl start cgrulesgend
      

Сделанный!

Вы можете добавить больше записей на шагах 3 и 4 в соответствии с вашими потребностями, но я думаю, что вышеизложенное должно работать.

Я приклеил этот раствор клейкой лентой из следующих источников.

Другие вопросы по тегам