В отличие от CentOS у Debian 7 Wheezy фактически нет нормального мейнтенера подсистемы cgroups, поэтому обойтись установкой пары пакетов и правкой 1-2х конфигов не получится.
apt-get install -y cgroup-bin libcgroup1
Копируем примеры конфигов:
cp /usr/share/doc/cgroup-bin/examples/cgconfig.conf /etc/cgconfig.conf cp /usr/share/doc/cgroup-bin/examples/cgconfig.sysconfig /etc/default/cgconfig zcat /usr/share/doc/cgroup-bin/examples/cgconfig.gz > /etc/init.d/cgconfig chmod +x /etc/init.d/cgconfig
Создаем спец-папку (без нее поймаем ошибку «touch: cannot touch /var/lock/subsys/cgconfig: No such file or directory [FAIL] Failed to touch /var/lock/subsys/cgconfig … failed!»):
mkdir -p /var/lock/subsys
Теперь добавляем cgroup для тестов, пусть это будет cpuacct, так как она не приводит к деградациям и ее можно использовать безвредно и на боевом ПО.
Добавляем в конфиг: /etc/cgconfig.conf следующие строки:
mount {
cpuacct = /mnt/cgroups/cpuacct;
}
group wwwdata {
cpuacct {
}
}
Теперь попробуем стартануть его:
/etc/init.d/cgconfig restart
Убеждаемся, что cgroup была корректно смонтирована:
cat /proc/mounts |grep cgroup cgroup /mnt/cgroups/cpuacct cgroup rw,relatime,cpuacct 0 0
А сама папка выглядит примерно так:
ls -al /mnt/cgroups/cpuacct/ total 4.0K drwxr-xr-x. 3 root root 0 Feb 5 14:04 .drwxr-xr-x. 3 root root 4.0K Feb 5 14:04 ..-rw-r--r--. 1 root root 0 Feb 5 14:04 cgroup.clone_children --w--w--w-. 1 root root 0 Feb 5 14:04 cgroup.event_control -rw-r--r--. 1 root root 0 Feb 5 14:04 cgroup.procs -r--r--r--. 1 root root 0 Feb 5 14:04 cpuacct.stat -rw-r--r--. 1 root root 0 Feb 5 14:04 cpuacct.usage -r--r--r--. 1 root root 0 Feb 5 14:04 cpuacct.usage_percpu -rw-r--r--. 1 root root 0 Feb 5 14:04 notify_on_release -rw-r--r--. 1 root root 0 Feb 5 14:04 release_agent -rw-r--r--. 1 root root 0 Feb 5 14:04 tasks drwxr-xr-x. 2 root root 0 Feb 5 14:04 wwwdata
Теперь нам нужно добиться того, чтобы процессы конкретного пользователя загонялись в определенную cgroup.
Снова копируем конфиги:
cp /usr/share/doc/cgroup-bin/examples/cgrules.conf /etc/cgrules.conf cp /usr/share/doc/cgroup-bin/examples/cgred /etc/init.d/cgred cp /usr/share/doc/cgroup-bin/examples/cgred.conf /etc/default/cgred.conf chmod +x /etc/init.d/cgred
Далее правим баги мейнтейнеров Debian:
sed -i 's/sysconfig/default/' /etc/init.d/cgconfig
Потом добавялем туда (/etc/cgrules.conf) одну строчку в самый низ:
@www-data cpuacct wwwdata/
Далее отключаем создание дефалт группы (в которую система будет помещать все процессы кроме тех, которые помещены в иные группы):
vim /etc/default/cgconfig CREATE_DEFAULT=no
Таким образом мы настраиваем помещение всех процессов пользователя www-data в группу с именем wwwdata.
После этого несколько раз (потому что что-то в скриптах не то и с первого раза у него не выходит размонтировать cgroup) дергаем команду:
/etc/init.d/cgconfig stop
И потом запускаем:
/etc/init.d/cgconfig start
После этого настраиваем демона cgred, который, собственно, должен распихивать процессы по cgroup:
/etc/init.d/cgred start
Но нас постигнет ужасное разочарование — 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».
Потом ищем строку
daemon --check $servicename --pidfile $pidfile $CGRED_BIN $OPTIONS
и заменяем на:
start-stop-daemon --start --quiet --pidfile $pidfile --exec $CGRED_BIN -- $OPTIONS
Далее правим:
sed -i 's/sysconfig/default/' /etc/init.d/cgred
Еще нужно исправить группу, от имени которой будет работать демон:
vim /etc/default/cgred.conf
и заменяем SOCKET_GROUP=»cgred» на SOCKET_GROUP=»»
Далее нам нужно создать папку для нашей cgroup:
mkdir /mnt/cgroups/cpuacct/wwwdata
Итак, запускаем демона:
/etc/init.d/cgred start
После этого нужно инициировать перезапуск процессов, которые нам интересно поместить в cgroup, в моем случае это nginx работающий от имени пользователя www-data:
/etc/init.d/nginx reload
Все, теперь убеждаемся, что процессы попали в нужную cgroup:
cat /mnt/cgroups/cpuacct/wwwdata/tasks 28623 28624 28625 28626
