Ограничения используемых ресурсов учётной записи

Появилась задача: ограничить используемые ресурсы по пользователям. Соответственно, нужно было ограничить используемую память, процессорное время, размер файлов и прочее. Как это сделать, будет сказано ниже.

Тестовый стенд: 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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


*