Я использую cgroups с контроллером памяти, чтобы установить предел памяти для каждого пользователя (используя memory.limit_in_bytes
установка).
Проблема в том, что этот параметр также учитывает использование кеша. Следовательно, если ограничение составляет 1 ГБ, а пользователь просто загружает или копирует файл размером 1 ГБ, его процессы прекращаются. Что еще хуже, кэшированные страницы остаются в памяти, поэтому «использование памяти» пользователем остается близким к 1 ГБ, даже когда у них не запущены никакие процессы.
Естественно, в этом нет смысла. Я хочу ограничить только общее использование частной (неанонимной) памяти для каждого пользователя. Как я могу этого добиться?
В качестве альтернативы, попросите OOM killer попробовать удалить кэшированные страницы пользователя перед тем, как завершить процессы, что даже не освободит кешированные страницы.
Публикация того, что я думаю, может быть лучшим ответом.
Мое требование - предотвратить сбой всей системы неконтролируемым процессом (процессами) одного пользователя.
В Linux уже есть функция для этого: убийца OOM.
В OOM убийца запускается, когда системе не хватает памяти, и отдает предпочтение процессам, которые быстро потребляют много оперативной памяти. Кроме того, менее вероятно, что он убьет долго работающие / системные (суперпользовательские) процессы.
Убийца OOM можно дополнительно настроить, настроив /proc/<pid>/oom_score_adj
файл. Этот параметр наследуется дочерними процессами, поэтому вам нужно установить его только для каждого корневого процесса пользователя. (Видеть Документация / файловые системы / proc.txt, раздел 3.1)