cgroups
это правильный способ сделать это, как указали другие ответы. К сожалению, нет идеального решения проблемы, о чем мы поговорим ниже. Существует множество способов установить ограничения использования памяти cgroup. То, как пользователь автоматически делает сеанс входа в систему частью группы, зависит от системы. Red Hat имеет несколько инструментов, также как и systemd .
memory.memsw.limit_in_bytes
и memory.limit_in_bytes
установить ограничения, включая и не включая своп, соответственно. Недостатком memory.limit_in_bytes
является то, что он считает файлы, кэшированные ядром от имени процессов в cgroup, с квотой группы. Меньшее кэширование означает больший доступ к диску, поэтому вы потенциально теряете некоторую производительность, если в противном случае в системе было бы доступно немного памяти.
С другой стороны, memory.soft_limit_in_bytes
разрешает cgroup превышать квоту, но если вызывается убийца OOM ядра, то те cgroups, которые превышают свои квоты, сначала логически уничтожаются. Недостатком этого, однако, является то, что существуют ситуации, когда некоторая память необходима немедленно, и у убийцы OOM нет времени, чтобы посмотреть на процессы, которые нужно убить, и в этом случае что-то может произойти сбой до того, как пользовательские процессы превышают квоту убит.
ulimit
Однако, это абсолютно неправильный инструмент для этого. ulimit накладывает ограничения на использование виртуальной памяти, что почти наверняка не то, что вы хотите. Многие приложения реального мира используют гораздо больше виртуальной памяти, чем физической памяти. Большинство сборок мусора (Java, Go) работают таким образом, чтобы избежать фрагментации. Тривиальная программа "hello world" на C, если она скомпилирована с помощью средства для удаления адресов, может использовать 20 ТБ виртуальной памяти. Распределители, которые не полагаются sbrk
, такие как jemalloc (который является распределителем по умолчанию для Rust) или tcmallocтакже будет иметь виртуальное использование памяти, значительно превышающее их физическое использование. Для эффективности многие инструменты будут создавать файлы mmap, что увеличивает виртуальное использование, но не обязательно физическое использование. Все мои процессы Chrome используют 2 ТБ виртуальной памяти каждый. Я на ноутбуке с 8 ГБ физической памяти. Любой способ попытаться установить квоты виртуальной памяти здесь либо сломал бы Chrome, либо вынудил Chrome отключить некоторые функции безопасности, которые полагаются на выделение (но не использование) большого количества виртуальной памяти, либо был бы совершенно неэффективен для предотвращения злоупотребления системой пользователем. ,