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 відключити деякі функції безпеки, які покладаються на виділення (але не використання) великих обсягів віртуальної пам’яті, або буде абсолютно неефективним у запобіганні користувачеві зловживати системою. .