Як створити користувача з обмеженим використанням ОЗУ?


43

Тож у мене є 4 ГБ оперативної пам’яті + 4 Гб своп. Я хочу створити користувача з обмеженими операційними програмами та свопом: 3 Гб оперативної пам’яті та 1 Гб своп. Чи таке можливо? Чи можна запускати програми з обмеженою оперативною пам’яттю та підміняти їм доступ, не створюючи окремого користувача (і не встановлюючи жодних спеціальних додатків - маючи лише конфігурацію сервера Debian / CentOS за замовчуванням і не використовуючи sudo)?

Оновлення:

Тож я відкрив термінал і набрав у нього команду ulimit : ulimit -v 1000000яка буде як 976,6Mbобмеження. Далі я зателефонував ulimit -aі побачив, що обмеження "увімкнено". Тоді я запустив якийсь баш-сценарій, який збирає та запускає додаток nohup, довгий nohup ./cloud-updater-linux.sh >& /dev/null & ... але через деякий час я побачив:

введіть тут опис зображення

(що було б нормально, якби не застосовувалися обмеження - він завантажив велику лібку і почав її компілювати.)

Але я думав, що застосував обмеження до оболонки та всіх процесів, запущених із / з неї за допомогою ulimit -v 1000000? Що я помилився? Як зробити термінал, а всі підпроцеси, які він запускає, обмежені у використанні оперативної пам'яті?


1
Ви не можете ставити обмеження на пам'ять для користувача в цілому, лише для кожного процесу. І ви не можете розрізняти оперативну пам’ять і використання своп. Якщо ви хочете більш точного управління, запустіть процеси користувача у віртуальній машині.
Жил "ТАК - перестань бути злим"

@Gilles майже впевнений, що віртуальні машини просто використовують групи груп та простори імен або їх похідні
RapidWebs

@RapidWebs ні, ні. Вони просто емулюють заздалегідь заданий об'єм оперативної пам’яті, і гостьова ОС вирішує, як розподілити її під процеси.
Руслан

Контейнери (не віртуальні машини) використовують групи, щоб обмежити використання пам'яті. Обмеження віртуальної пам’яті не є хорошою ідеєю; Процес може використовувати багато віртуальної пам'яті, але може використовувати лише трохи оперативної пам'яті. Наприклад, у моїй системі виділено 34359738367 кБ віртуальної пам'яті, але набагато менше оперативної пам'яті.
ctrl-alt-delor

Відповіді:


63

ulimitдля цього зроблено. Ви можете встановити параметри за замовчуванням для ulimitкожного користувача або для групи в

/etc/security/limits.conf

ulimit -v KBYTESвстановлює максимальний розмір віртуальної пам'яті. Я не думаю, що ти можеш дати максимальний обмін свопом. Це лише обмеження кількості віртуальної пам’яті, яку користувач може використовувати.

Таким чином, у вас limits.confбуде лінія (максимум 4Gпам'яті)

luser  hard  as   4000000

ОНОВЛЕННЯ - CGroups

Ліміти, що накладаються ulimitта limits.confскладаються на процес. З цього питання я точно не був зрозумілий.

Якщо ви хочете обмежити загальний об'єм пам'яті, яку користувачі використовують (це те, що ви запитали). Ви хочете використовувати контрольні групи .

В /etc/cgconfig.conf:

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

Це створює cgroupобмеження пам'яті в 4GiB.

В /etc/cgrules.conf:

luser   memory   memlimit/

Це призведе до запуску всіх запущених процесів luserвсередині memlimitстворених у cgconfig.conf.


чи можна встановити таке useradd?
myWallJSON

4
@myWallJSON Не безпосередньо, але ви можете негайно додати його до limit.conf, або можете встановити групу з певними обмеженнями у limit.conf і додати користувача до цієї групи.
утопія

1
Це круто! Я не знав, що ти можеш це зробити! Чудова відповідь +1
Янік Жируар

1
@utopiabound: оновив свій Q з деякими даними, які я намагаюся використовувати ulimit.
myWallJSON

1
@ f.ardelian Оновіть ядро. Ось стаття про те, як зробити саме це!
Даніель К. Собрал

4

Ви не можете обмежити використання пам’яті на рівні користувача, але ulimit може це зробити, але лише для одного процесу.

Навіть при використанні обмежень на кожного користувача /etc/security/limits.conf, користувач може використовувати всю пам'ять, запустивши кілька процесів.

Якщо ви дійсно хочете обмежити ресурси, вам потрібно скористатися інструментом управління ресурсами, наприклад, rcapd, який використовується проектами та зонами під Solaris.

Є щось, що, схоже, надає подібні функції в Linux, які ви могли б досліджувати: cgroups .


Ну, я припускаю, що встановлення обмеження на оболонку для входу користувачів чи щось подібне можна трактувати як "встановлення ліміту для користувача", оскільки всі процеси успадковуватимуться від цієї оболонки?
amn

1
@amn Це не буде. Користувач може просто відкрити нову оболонку входу, щоб подолати такий ліміт.
jlliagre

Правильно, це неправдиво моє припущення гаразд.
amn

3

cgroupsце правильний спосіб зробити це, як вказували інші відповіді. На жаль, немає ідеального рішення проблеми, як ми розберемося нижче. Існує маса різних способів встановлення лімітів використання пам’яті групової групи. Те, як автоматично робити сеанс входу користувача в групу, залежить від системи до системи. У Red Hat є деякі інструменти, і так це є систематизовано .

memory.memsw.limit_in_bytesі memory.limit_in_bytesвстановлюють обмеження, включаючи та не включаючи своп відповідно. Мінусом memory.limit_in_bytesє те, що він рахує файли, кешовані ядром від імені процесів у групі, проти квоти групи. Менше кешування означає більше доступу до диска, тому ви потенційно відмовитеся від певної продуктивності, якщо в іншому випадку система мала деяку пам’ять.

З іншого боку, memory.soft_limit_in_bytesдозволяє групі перевищувати квоти, але якщо вбивця OOM ядра буде викликаний, то ті групи, які перевищують їхні квоти, вбиваються спочатку логічно. Мінус цього, однак, полягає в тому, що є ситуації, коли потрібна деяка пам’ять негайно і немає часу, коли вбивця OOM роздирається, щоб вбити процеси, і в цьому випадку щось може вийти з ладу, перш ніж користувачі перевищують квоти вбитий.

ulimitоднак, це абсолютно неправильний інструмент для цього. обмежити обмеження на використання віртуальної пам'яті, що майже точно не те, що ви хочете. У багатьох реальних програмах використовується набагато більше віртуальної пам'яті, ніж фізична пам'ять. Більшість зібраних сміттям програм (Java, Go) працюють таким чином, щоб уникнути фрагментації. Тривіальна програма "привіт світ" на C, якщо вона компілюється з адресатизатором, може використовувати 20 ТБ віртуальної пам'яті. Розподільники, на які не покладаються sbrk, такі як jemalloc (який є розподільником за замовчуванням для Rust) або tcmalloc, також матиме використання віртуальної пам’яті значно перевищує їх фізичне використання. Для ефективності багато інструментів дозволять mmap файли, що збільшує віртуальне використання, але не обов'язково фізичне використання. Усі мої процеси в Chrome використовують 2 ТБ віртуальної пам'яті кожен. Я на ноутбуці з 8 Гб фізичної пам'яті. Будь-який спосіб, який би намагався тут встановити квоти віртуальної пам'яті, або порушив би Chrome, змусив Chrome відключити деякі функції безпеки, які покладаються на виділення (але не використання) великих обсягів віртуальної пам’яті, або буде абсолютно неефективним у запобіганні користувачеві зловживати системою. .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.