Linux cgroups

Чтобы ограничить ресурсы с помощью cgroup не обязательно заводить отдельное окружение (lxc-контейнер). Достаточно завести свою группу, выставить ей нужные лимиты и приписать свой процесс туда.

Пример:

Утилиты для работы входят в пакет libcgroup-tools (для CentOS). При желании таким же макаром можно прописать ограничения для системных пользователей или групп.

Собственно контейнера lxc по такому принципу и работают.

https://habrahabr.ru/post/266083/#comment_8560049

CGroups: Лимит на разделение ресурсов, а не на ограничение

Linux_kernel_unified_hierarchy_cgroups_and_systemd.svg

В отличие от CentOS у Debian 7 Wheezy фактически нет нормального мейнтенера подсистемы cgroups, поэтому обойтись установкой пары пакетов и правкой 1-2х конфигов не получится.

 

Копируем примеры конфигов:

 

Создаем спец-папку (без нее поймаем ошибку «touch: cannot touch /var/lock/subsys/cgconfig: No such file or directory [FAIL] Failed to touch /var/lock/subsys/cgconfig … failed!»):

 

Теперь добавляем cgroup для тестов, пусть это будет cpuacct, так как она не приводит к деградациям и ее можно использовать безвредно и на боевом ПО.

Добавляем в конфиг: /etc/cgconfig.conf следующие строки:

 

Теперь попробуем стартануть его:

 

Убеждаемся, что cgroup была корректно смонтирована:

 

А сама папка выглядит примерно так:

 

Теперь нам нужно добиться того, чтобы процессы конкретного пользователя загонялись в определенную cgroup.

Снова копируем конфиги:

 

Далее правим баги мейнтейнеров Debian:

 

Потом добавялем туда (/etc/cgrules.conf) одну строчку в самый низ:

 

Далее отключаем создание дефалт группы (в которую система будет помещать все процессы кроме тех, которые помещены в иные группы):

 

Таким образом мы настраиваем помещение всех процессов пользователя www-data в группу с именем wwwdata.

После этого несколько раз (потому что что-то в скриптах не то и с первого раза у него не выходит размонтировать cgroup) дергаем команду:

 

И потом запускаем:

 

После этого настраиваем демона cgred, который, собственно, должен распихивать процессы по cgroup:

 

Но нас постигнет ужасное разочарование — init скрипт тупо взят из RedHat без должной доработки под особенности Debian (впрочем, в /etc/init.d/cgconfig примерное тоже самое — там вместо /etc/default используется путь /etc/sysconfig):

/etc/init.d/cgred: line 43: /etc/rc.d/init.d/functions: No such file or directory
Starting CGroup Rules Engine Daemon: /etc/init.d/cgred: line 85: daemon: command not found

Чтобы исправить это открываем /etc/init.d/cgred и комментируем 43ю строку с кодом: «/etc/rc.d/init.d/functions».

Потом ищем строку

и заменяем на:

 

Далее правим:

 

Еще нужно исправить группу, от имени которой будет работать демон:

 

и заменяем SOCKET_GROUP=»cgred» на SOCKET_GROUP=»»

Далее нам нужно создать папку для нашей cgroup:

 

Итак, запускаем демона:

 

После этого нужно инициировать перезапуск процессов, которые нам интересно поместить в cgroup, в моем случае это nginx работающий от имени пользователя www-data:

 

Все, теперь убеждаемся, что процессы попали в нужную cgroup: