Этот вопрос очень актуален, например, на десктопе: у меня opera время от времени начинает выедать всю доступную память и весь swap. Было принято решение ограничить её аппетиты.
Банальный ulimit не подходит, так как он ограничит для всех приложений, запускаемых от юзера. А мне нужно что бы только одно приложение и под конкретным пользователем. После недолгих гуглений, натолкнулся на cgroups.
Тестовый стенд: Kubuntu 12.10 (kernel 3.5.0-25-generic x86_64), user = skeletor
Устанавливаем:
$ sudo apt-get install cgroup-bin libcgroup1
Проверям что croup работает:
$ lssubsys -am | grep cgroup
cpuset /sys/fs/cgroup/cpuset
cpu /sys/fs/cgroup/cpu
cpuacct /sys/fs/cgroup/cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
Создаём новый тип ограничений для юзера skeletor:
$ sudo cgcreate -a skeletor -t skeletor -g memory,cpu:skeletor
Если не указать -t (указывает владельца задачи – task’a), то после запуска программы через cgexec получим ругань:
cgroup change of group failed
А теперь собственно задаём ограничения:
– About 10 % cpu
# echo 100 > /sys/fs/cgroup/cpu/skeletor/cpu.shares
– 300 Mb of memory
# echo 300000000 > /sys/fs/cgroup/memory/skeletor/memory.limit_in_bytes
– 100 Mb of swap
# echo 100000000 > /sys/fs/cgroup/memory/skeletor/memory.memsw.max_usage_in_bytes
А теперь собственно запуск нужного приложения:
cgexec -g memory,cpu:$USER command <options> &
В данном случае это будет так:
$ cgexec -g memory,cpu:skeletor /usr/bin/opera &
Проверяем, что интересующие нас процессы попали под наблюдение:
$ ps -e | grep opera 29165 pts/24 00:14:26 opera 29174 pts/24 00:00:24 opera:flashplug $ cat /sys/fs/cgroup/memory/skeletor/tasks 29165 29168 29174 ... $ cat /sys/fs/cgroup/cpu/skeletor/tasks 29165 29168 29174 ...