如何创建内存使用受限的用户?


43

所以我有4 GB RAM + 4GB交换空间。我想创建一个具有有限的ram和swap的用户:3 GB RAM和1 GB swap。这样的事情可能吗?是否可以在不创建单独用户的情况下启动具有有限RAM的应用程序并交换可用的应用程序(并且不安装任何特殊应用程序-仅具有默认的Debian / CentOS服务器配置,而不使用sudo)?

更新:

因此,我打开了terminall并在其中输入ulimit命令:ulimit -v 1000000就像976,6Mb限制一样。接下来,我打电话来ulimit -a,看到限制是“打开”的。然后,我启动了一个bash脚本,该脚本进行了编译,并在nohup一个很长的 脚本中启动了我的应用程序nohup ./cloud-updater-linux.sh >& /dev/null &……但是一段时间后,我看到了:

在此处输入图片说明

(如果没有限制,没关系-它下载了一些大的lib,并开始对其进行编译。)

但是我以为我对shell和使用shell启动的所有进程都施加了限制ulimit -v 1000000?我怎么了?如何使终端及其启动的所有子进程受到ram使用的限制?


1
您不能仅对每个进程都对整个用户施加内存限制。而且您无法区分RAM和交换使用情况。如果需要更好的控制,请在虚拟机中运行用户的进程。
吉尔斯(Gilles)'“ SO-不要邪恶”

@Gilles非常确定虚拟机仅使用cgroup和名称空间或它们的衍生产品
RapidWebs 2014年

@RapidWebs不,他们没有。他们只是模拟预定义的RAM数量,然后客户机OS决定如何将其分配给进程。
Ruslan

容器(不是虚拟机)使用cgroup来限制内存使用。限制虚拟内存不是一个好主意。一个进程可以使用大量的虚拟内存,但只能使用少量的RAM。例如,我的系统分配了34359738367 kB虚拟内存,但内存却少得多。
ctrl-alt-delor

Answers:


63

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;
    }
}

这将创建一个cgroup最大内存限制为4GiB的。

/etc/cgrules.conf

luser   memory   memlimit/

这将导致运行的所有进程都luser在中memlimit创建的cgroup中运行cgconfig.conf


可以设置这样的东西useradd吗?
myWallJSON 2012年

4
@myWallJSON不是直接的,但是您可以立即将其添加到limits.conf,或者可以在limits.conf中设置具有特定限制的组并将用户添加到该组。
utopiabound,2012年

1
棒极了!我不知道你能做到这一点!很棒的答案+1
Yanick Girouard 2012年

1
@utopiabound:用我尝试使用ulimit的一些数据更新了我的Q。
myWallJSON 2012年

1
@ f.ardelian升级内核。这是有关如何做到这一点的文章
Daniel C. Sobral

4

您不能在用户级别限制内存使用量,ulimit可以做到这一点,但是只需要一个进程即可。

即使使用中的每个用户限制/etc/security/limits.conf,用户也可以通过运行多个进程来使用所有内存。

如果您真的想限制资源,则需要使用资源管理工具,例如Solaris下项目和区域使用的rcapd

您可能需要调查Linux上似乎提供了类似的功能:cgroups


好吧,我想为用户登录外壳设置一个上限,或者类似的解释可以解释为“为用户设置限制”,因为所有进程都将从该外壳继承?
2013年

1
@amn不会。用户可能只是打开一个新的登录Shell来解决这种限制。
jlliagre

是的,这使我的假设无效。
2013年

3

cgroups正如其他答案所指出的那样,这是正确的方法。不幸的是,目前还没有完美的解决方案,我们将在下面介绍。设置cgroup内存使用限制的方法有很多。如何使用户的登录会话自动成为cgroup的方式因系统而异。 红帽有一些工具,systemd也有

memory.memsw.limit_in_bytes并分别memory.limit_in_bytes设置限制,包括和不包括掉期。缺点memory.limit_in_bytes是,它将代表cgroup中的进程由内核缓存的文件计入该组的配额。较少的缓存意味着更多的磁盘访问,因此,如果系统另外有一些可用内存,则可能会降低性能。

另一方面,memory.soft_limit_in_bytes允许cgroup超过配额,但是如果调用内核OOM杀手,那么逻辑上会首先杀死超过配额的cgroup。但是,这样做的缺点是,在某些情况下,立即需要一些内存,而OOM杀手没有时间四处寻找要杀死的进程,在这种情况下,某些事情可能会在超额配额用户的进程被破坏之前失败。被杀。

ulimit但是,绝对是错误的工具。ulimit限制了虚拟内存的使用,这几乎肯定不是您想要的。许多实际应用程序使用的虚拟内存远远超过物理内存。大多数垃圾收集的运行时(Java,Go)都是通过这种方式来避免碎片。如果使用地址清理器进行编译,那么用C语言编写的“ hello world”程序就可以使用20TB虚拟内存。不依赖的分配器sbrk,例如jemalloc(Rust的默认分配器)或tcmalloc,其虚拟内存使用量也将大大超过其物理使用量。为了提高效率,许多工具都会映射文件,这会增加虚拟使用率,但不一定增加物理使用率。我所有的Chrome进程均使用2TB的虚拟内存。我正在使用8GB物理内存的笔记本电脑。任何试图在此处设置虚拟内存配额的方法都会破坏Chrome,迫使Chrome禁用某些依赖于分配(但不使用)大量虚拟内存的安全功能,或者在防止用户滥用系统方面完全无效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.