Появилась задача: ограничить используемые ресурсы по пользователям. Соответственно, нужно было ограничить используемую память, процессорное время, размер файлов и прочее. Как это сделать, будет сказано ниже.
Тестовый стенд: Debian Linux 5, kernel 2.6.26-2-686
1) Предварительная настройка.
Для успешной работы нам будет нужна строка
session required pam_limits.so
в файле /etc/pam.d/login
2) Установка параметров.
После этого можно редактировать файл с ограничением. Для этого открываем редактируем файл /etc/security/limits.conf. Вот пример его, с последующим содержанием:
@limit_users hard data 128144
@limit_users hard rss 128144
@limit_users hard memlock 128144
@limit_users hard as 128144
@limit_users hard nice 10
@limit_users hard maxlogins 2
@limit_users hard nproc 20
В данном примере для группы limit_users введены жёсткие ограничения. Формат таков:
группа/юзер лимит(жёсткий/мягкий) параметр значение.
Приведу из справки описание параметров (привожу без перевода, что бы не терялся смысл):
- core - размер core файлов (KB)
- data - максимальный размер данных (KB)
- fsize - максимальный размер файла (KB)
- memlock - максимальное заблокированное адресное пространство (KB)
- nofile - максимальное количество открытых файлов
- rss - максимальный размер памяти для резидент-программ (KB)
- stack - максимальный размер стэка (KB)
- cpu - максимальное процессорное время (MIN)
- nproc - максимальное количество процессов
- as - ограничение адресного пространства (KB)
- maxlogins - максимальное число одновременных регистраций в системе
- maxsyslogins - максимальное количество учётных записей
- priority - приоритет запущенных процессов
- locks - максимальное количество блокируемых файлов пользователем
- sigpending - максимальное количество сигналов, которые можно передать процессу
- msgqueue - максимальный размер памяти для очереди POSIX сообщений (bytes)
- nice - максимальный приоритет, который можно выставить: [-20, 19]
- rtprio - максимальный приоритет времени выполнения
- chroot - изменить директорию root'a (Debian-specific)
Вместо групп/юзера можно использовать групповой символ * (для всех) и групповой символ % для wildcast’a групп.
3) Проверка.
Параметры вступают в силу сразу после перелогина пользователя. Что бы посмотреть какие действуют ограничения, используем команду ulimit:
$ ulimit -aH
core file size (blocks, -c) 128144
data seg size (kbytes, -d) 128144
scheduling priority (-e) 10
file size (blocks, -f) 128144
pending signals (-i) 16000
max locked memory (kbytes, -l) 128144
max memory size (kbytes, -m) 128144
open files (-n) 50
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 128144
cpu time (seconds, -t) 180
max user processes (-u) 20
virtual memory (kbytes, -v) 128144
file locks (-x) unlimited
Причём команду нужно запускать непосредственно под залогинившимся пользователем. Если зайти под другим пользователем и переключится на него через su, то будут показаны ограничения не текущего пользователя, а непосредственно того, под кем зашли на сервер.
Что бы применять ограничения на лету, нужно выполнить команду ulimit с указанием параметра и желаемого лимита. Пример:
$ulimit -d 256000
4) Послесловие.
Есть ещё одно средство для введения ограничений – cgroups. Разница между limits состоит в том, что limit ограничивает на каждый процесс отдельно, а cgroups – для контроля группы процессов(control groups).
5) Аналоги.
Для ограничения CPU можно использовать cpulimit