Так что у меня 4 ГБ оперативной памяти + 4 ГБ подкачки. Я хочу создать пользователя с ограниченными оперативной памятью и подкачкой: 3 ГБ оперативной памяти и 1 ГБ подкачки. Возможна ли такая вещь? Можно ли запускать приложения с ограниченной оперативной памятью и менять их местами, не создавая отдельного пользователя (и не устанавливая никаких специальных приложений - имея только конфигурацию сервера Debian / CentOS по умолчанию и не используя sudo)?
Обновить:
Поэтому я открыл терминал и набрал в нем команду ulimit : ulimit -v 1000000
это будет похоже на 976,6Mb
ограничение. Затем я позвонил ulimit -a
и увидел, что ограничение «включено». Затем я запустил некоторый bash-скрипт, который компилирует и запускает мое приложение nohup
, длинный nohup ./cloud-updater-linux.sh >& /dev/null &
... но через некоторое время я увидел:
(что было бы хорошо, если бы не было никаких ограничений - он загрузил какую-то большую библиотеку и начал ее компилировать.)
Но я думал, что применил ограничения к оболочке и ко всем процессам, запущенным с / из нее ulimit -v 1000000
? Что я не так понял? Как сделать так, чтобы терминал и все запускаемые им процессы были ограничены использованием оперативной памяти?
источник
Ответы:
ulimit
сделано для этого. Вы можете установить значения по умолчанию дляulimit
каждого пользователя или группы вulimit -v KBYTES
устанавливает максимальный размер виртуальной памяти. Я не думаю, что вы можете дать максимальный объем обмена. Это просто ограничение на количество виртуальной памяти, которую может использовать пользователь.Таким образом, у вас
limits.conf
будет строка (максимум4G
памяти)ОБНОВЛЕНИЕ - CGroups
Пределы, налагаемые
ulimit
иlimits.conf
действующие на процесс. Я определенно не был ясно по этому вопросу.Если вы хотите ограничить общий объем памяти, который используют пользователи (это то, что вы просили). Вы хотите использовать cgroups .
В
/etc/cgconfig.conf
:Это создает
cgroup
максимальный предел памяти в 4 ГБ.В
/etc/cgrules.conf
:Это приведет к запуску всех процессов
luser
внутриmemlimit
cgroups, созданных вcgconfig.conf
.источник
useradd
?Вы не можете ограничить использование памяти на уровне пользователя, ulimit может сделать это, но для одного процесса.
Даже с использованием ограничений на пользователя
/etc/security/limits.conf
, пользователь может использовать всю память, запустив несколько процессов.Если вы действительно хотите ограничить ресурсы, вам необходимо использовать инструмент управления ресурсами, например, rcapd, используемый в проектах и зонах в Solaris.
Похоже, что в Linux есть что-то похожее, что вы можете исследовать: cgroups .
источник
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 отключить некоторые функции безопасности, которые полагаются на выделение (но не использование) большого количества виртуальной памяти, либо был бы совершенно неэффективен для предотвращения злоупотребления системой пользователем. ,источник