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