Ограничьте ЦП и память с помощью cgroup в серверной версии Ubuntu 20.04 LTS
У меня есть 3 группы на сервере Ubuntu 20.04 LTS: группа1, группа2, группа3. Я хотел бы ограничить ЦП и память для каждой группы.
- Группе 1 разрешено использовать только 20% ЦП и 10 ГБ ОЗУ.
- Группе 2 разрешено использовать только 30% ЦП и 15 ГБ ОЗУ.
- Группе 3 разрешено использовать только 50% ЦП и 20 ГБ ОЗУ.
Возможно ли это с помощью systemd и cgroup в серверной версии 20.04 LTS? Или есть какой-то другой метод?
1 ответ
Я знаю, что это может быть поздно, но вот что сработало для меня. Эти шаги были выполнены на Pop! OS 20.04 (после Ubuntu 20.04), но я думаю, что они также будут работать на сервере Ubuntu. Возможно, вы захотите запустить все эти команды в терминале суперпользователя (с повышенными правами). Просто введите его с помощьюsudo su.
Далее я настрою ограничения cgroup таким образом, что пользователям, принадлежащим к группе, будет разрешено использовать только 95% ЦП и 28 ГБ ОЗУ. Вы можете внести соответствующие изменения (добавить несколько групп, изменить имена мест назначения, ограничения и т. д.). Я использую вим (vi), вы можете использовать любой редактор.
Установить
cgroup-toolsупаковкаapt install cgroup-tools -yСкопируйте конфигурации по умолчанию из документации
cp /usr/share/doc/cgroup-tools/examples/cgred.conf /etc/ # Verify file view /etc/cgred.confСоздайте файл для ограничений cgroup (конфигураций)
vi /etc/cgconfig.confВведите в файл следующее
group ucglims { cpu { cpu.cfs_quota_us=95000; } memory { memory.limit_in_bytes = 28g; } }Имя является пунктом назначения (для упоминания ограничений). Это не название группы.
Создайте правила для сопоставления пользователей, групп с ресурсами и пунктами назначения.
vi /etc/cgrules.confВведите в файл следующее
#<user> #<controllers> #<destination> @cglims cpu,memory ucglimsЭто означает, что количество пользователей в группе будет ограничено
cpuиmemory(ОЗУ) ограничения вucglimsназначения (описано ранее).Разобрать и применить конфигурации
# 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 ГБ, остальная часть ОЗУ остается свободной).Вы можете использовать стресс и для других видов предельных тестов.
Мы должны сделать это постоянным (чтобы это все не потерялось после перезагрузки). мы создадим
systemdсервисы для этого.Создать сервис для парсинга
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Создать сервис для применения правил
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Теперь перезагрузите демон 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 в соответствии с вашими потребностями, но я думаю, что вышеизложенное должно работать.
Я приклеил этот раствор клейкой лентой из следующих источников.
- О cgroup и обзоре: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/ch01
- Если вы хотите переместить определенные процессы в контрольную группу: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/sec-moving_a_process_to_a_control_group
- Подробнее о cgroup: https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_cgconfig_cgroups.html
- Еще немного: https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_cgrules_cgroups.html
- Системные службы: https://www.shubhamdipt.com/blog/how-to-create-a-systemd-service-in-linux/
- Что означают теги?: https://www.freedesktop.org/software/systemd/man/systemd.exec.html