Назад | Перейти на главную страницу

Ограничьте использование частной памяти для каждого пользователя

Я использую cgroups с контроллером памяти, чтобы установить предел памяти для каждого пользователя (используя memory.limit_in_bytes установка).

Проблема в том, что этот параметр также учитывает использование кеша. Следовательно, если ограничение составляет 1 ГБ, а пользователь просто загружает или копирует файл размером 1 ГБ, его процессы прекращаются. Что еще хуже, кэшированные страницы остаются в памяти, поэтому «использование памяти» пользователем остается близким к 1 ГБ, даже когда у них не запущены никакие процессы.

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

В качестве альтернативы, попросите OOM killer попробовать удалить кэшированные страницы пользователя перед тем, как завершить процессы, что даже не освободит кешированные страницы.

Публикация того, что я думаю, может быть лучшим ответом.

Мое требование - предотвратить сбой всей системы неконтролируемым процессом (процессами) одного пользователя.

В Linux уже есть функция для этого: убийца OOM.

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

Убийца OOM можно дополнительно настроить, настроив /proc/<pid>/oom_score_adj файл. Этот параметр наследуется дочерними процессами, поэтому вам нужно установить его только для каждого корневого процесса пользователя. (Видеть Документация / файловые системы / proc.txt, раздел 3.1)