limits.conf и лимиты потребления


limits.conf — файл в Linux системах в котором можно задавать ограничения для системных пользователей, чаще всего на практике оказывается полезным ограничивать количество выделенных ресурсов центрального процессора или оперативной памяти. Файл находится на Debian подобных системах по пути /etc/security/limits.conf



limits.conf и лимиты потребления ресурсов для пользователей в Linux


Прежде всего, как выяснить процессы каких пользователей потребляют больше всего ресурсов CPU оперативной памяти.



Для текущего момента посмотреть процессы можно при помощи утилиты ps

ps aux --sort=%cpu | grep -v 'root' | head -n 35

ps aux --sort=%mem | grep -v 'root' | head -n 35



Команды выведут сортированные списки процессов в одной из колонок каждого списка будет указано имя пользователя. Процессы, запущенные от имени root показываться не будут и выведутся только 35 самых активных процессов.


Пример вывода для cpu:

limits.conf


Пример вывода для mem:

лимиты потребления mem для системных пользователей



Подобным образом достоверные данные получить не удастся, например, для веб-сервера с mod_php, процессы всех пользователей при такой конфигурации будут запускаться от имени пользователя с правами которого работает веб-сервер.




В большинстве случаев в выводе как раз та информация, которая нужна для того чтобы выбрать пользователей для которых нужно предусмотреть ограничения.

Ограничения нужны на нагруженных серверах, они существуют, например, у каждого хостинг провайдера.


Лимитировать количество процессов можно используя механизм ядра cgroups — на практике проще всего установить ограничения отредактировав файл /etc/security/limits.conf и перезагрузив сервер.



Изменять /etc/security/limits.conf  может только пользователь root или другой пользователь работающий из под sudo


Файл хорошо задокументирован, вся необходимая информация находится в нем в комментариях, правила меняются с помощью любого текстового редактора

mcedit /etc/security/limits.conf



В общем виде любое правило выглядит так:

<domain> <type> <item> <item>

domain — это пользователь или группа, для которых лимитируем ресурсы

type — тип ограничения: soft или hard, ограничение soft может быть переопределено пользователем.

item — ресурс, который ограничиваем — обычно это cpu (в минутах) или as — максимальное количество оперативной памяти (в Кб); также можно задать nice level, который не сможет быть превышен процессами пользователя/группы (минимум 20, максимум -19); здесь же можно задать chroot (только для debian)

item — само численное значение


Для того чтобы изменения вступили в силу нужна перезагрузка.



ulimit в Linux и ограничение ресурсов для пользователя


Soft лимиты пользователь может переопределить используя ulimit

Выполнение команды с аргументом -a выведет актуальные ограничения

ulimit -a

ulimit -as 1500000
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 14685
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 14685
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited


Ключи из вывода можно брать и использовать в командах, которые будут задавать ограничения для текущей терминальной сессии.



Дополнительно следует указывать тип ограничения:

-H — hard

-S — soft

Если не указывать ничего лимиты будут заданы жестко. hard здесь можно задать для текущего пользователя даже без прав root, но изменения не сохранятся после перезагрузки и чтобы ограничения были установлены постоянно нужно редактировать файл, который был рассмотрен ранее.



Создадим ограничение по оперативной памяти в 1500 Мб для пользователя

ulimit -Sm 1500000


ulimit set soft limit


Выполнив ulimit -Sm или ulimit -a сейчас можно увидеть, что ограничение установлено.



Получить ту же информацию можно просмотрев лимиты для процесса

cat /proc/PID/limits


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

Сказать спасибо