Как создать пользователя с ограниченным Использованием оперативной памяти?

3 ответа

ulimit сделан для этого. Можно установить значения по умолчанию для ulimit на на пользователя или на основание группы в

/etc/security/limits.conf

ulimit -v KBYTES размер максимальной виртуальной памяти наборов. Я не думаю, что можно дать макс. объем подкачки. Это - просто предел на объем виртуальной памяти, которую может использовать пользователь.

Так Вы limits.conf имел бы строку (к максимуму 4G из памяти)

luser  hard  as   4000000

ОБНОВЛЕНИЕ - CGroups

Ограничения, наложенные ulimit и limits.conf для каждого процесса. Я определенно не был ясен на той точке.

Если Вы хотите ограничить общий объем памяти пользовательское использование (который является тем, что Вы спросили). Вы хотите использовать cgroups.

В /etc/cgconfig.conf:

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

Это создает a cgroup это имеет макс. предел памяти 4 ГиБ.

В /etc/cgrules.conf:

luser   memory   memlimit/

Это вызовет все процессы, выполненные luser быть выполненным в memlimit cgroups, созданный в cgconfig.conf.

67
27.01.2020, 19:34
  • 1
    является такой вещью, устанавливаемой на useradd? –  myWallJSON 16.03.2012, 15:41
  • 2
    @myWallJSON Не непосредственно, но можно сразу добавить его к limits.conf, или можно установить группу с определенными пределами в limits.conf и добавить пользователя к той группе. –  utopiabound 16.03.2012, 16:56
  • 3
    Это является потрясающим! Я не знал, что Вы могли сделать это! Большой +1 –  Yanick Girouard 16.03.2012, 18:50
  • 4
    Это является потрясающим! Я не знал, что Вы могли сделать это! Большой +1 –  Yanick Girouard 16.03.2012, 18:50
  • 5
    @utopiabound: Обновленный мой Q с некоторыми данными я получил попытку использовать ulimit. –  myWallJSON 17.03.2012, 00:24
  • 6
    @f.ardelian ядро. Вот статья о том, как сделать просто это! –  Daniel C. Sobral 11.02.2013, 03:05

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

Даже с использованием на пользователя ограничивает в /etc/security/limits.conf, пользователь может использовать всю память путем выполнения нескольких процессов.

Если Вы действительно хотите ограничить ресурсы, необходимо использовать инструмент управления ресурсами, как rcapd, используемый проектами и зонами в соответствии с Солярисом.

Существует что-то, что, кажется, обеспечивает подобные функции на Linux, который Вы могли бы исследовать: cgroups.

4
27.01.2020, 19:34
  • 1
    Ну, я предполагаю установку ограничения на пользовательской оболочке входа в систему, или что-то как этот могло быть интерпретировано как "установление предела для пользователя", так как все процессы наследуются той оболочке? –  amn 18.04.2016, 17:31
  • 2
    @amn Это не будет. Пользователь мог бы просто открыть новую оболочку входа в систему для обходного решения такой предел. –  jlliagre 18.04.2016, 17:46
  • 3
    Право, которое делает недействительным мое предположение хорошо. –  amn 18.04.2016, 19:24

cgroups - правильный способ сделать это, как указывали другие ответы. К сожалению, идеального решения проблемы не существует, как мы рассмотрим ниже. Существует множество различных способов установить лимиты использования памяти cgroup. То, как сделать сеанс входа пользователя в систему автоматически частью cgroup, зависит от системы к системе. Red Hat имеет некоторые инструменты, а также systemd .

memory.memsw.limit_in_bytesи memory.limit_in_bytesустанавливают ограничения, включая и не включая своп, соответственно. Недостатком memory.limit_in_bytesявляется то, что он подсчитывает файлы, кэшированные ядром от имени процессов в контрольной группе, в соответствии с квотой группы. Меньше кэширования означает больше доступа к диску, поэтому вы потенциально теряете часть производительности, если в противном случае в системе была бы некоторая доступная память.

С другой стороны, memory.soft_limit_in_bytesпозволяет контрольной группе превышать -квоту, но если вызывается убийца OOM ядра, то те контрольные группы, которые превышают свои квоты, уничтожаются первыми, логически. Недостатком этого, однако, является то, что бывают ситуации, когда некоторое количество памяти требуется немедленно, и у убийцы OOM нет времени искать процессы, которые нужно убить, и в этом случае что-то может выйти из строя до того, как пользователь превысит -квоту. процессы убиваются.

ulimit, однако, совершенно не подходит для этого. ulimit накладывает ограничения на использование виртуальной памяти, что почти наверняка не то, что вам нужно. Многие реальные -приложения используют гораздо больше виртуальной памяти, чем физической. Большинство сред выполнения -со сбором мусора (Java, Go )работают таким образом, чтобы избежать фрагментации. Тривиальная программа «hello world» на C, скомпилированная с очистителем адресов, может использовать 20 ТБ виртуальной памяти. Распределители, которые не полагаются на sbrk, такие как jemalloc (, который является распределителем по умолчанию для Rust )или tcmalloc , также будут использовать виртуальную память, значительно превышающую их физическую. Применение. Для повышения эффективности многие инструменты будут отображать файлы mmap,что увеличивает виртуальное использование, но не обязательно физическое использование. Все мои процессы Chrome используют по 2 ТБ виртуальной памяти каждый. Я на ноутбуке с 8 ГБ физической памяти. Любая попытка установить здесь квоты виртуальной памяти либо сломает Chrome, либо заставит Chrome отключить некоторые функции безопасности, основанные на выделении (, но не использующем )больших объемов виртуальной памяти, либо будет совершенно неэффективна для предотвращения доступа пользователя. от злоупотребления системой.

7
27.01.2020, 19:34

Теги

Похожие вопросы