所以我有 4 GB RAM + 4GB 交换空间。我想创建一个具有有限 ram 和交换空间的用户:3 GB RAM 和 1 GB 交换空间。这样的事可能吗?是否可以启动具有有限 RAM 的应用程序并对其进行交换,而无需创建单独的用户(并且不安装任何特殊应用程序 - 仅具有默认的 Debian/CentOS 服务器配置,并且不使用 sudo)?
更新:
所以我打开terminall并输入极限值命令:ulimit -v 1000000
类似于976,6Mb
限制。接下来我打电话ulimit -a
发现限制已“开启”。然后我启动了一些 bash 脚本来编译并启动我的应用程序nohup
,a长一 nohup ./cloud-updater-linux.sh >& /dev/null &
...但过了一段时间我看到:
(如果没有应用任何限制,那就没问题了 - 它下载了一些大的库,并开始编译它。)
但我认为我对 shell 以及使用它启动的所有进程应用了限制ulimit -v 1000000
?我做错了什么?如何限制终端及其启动的所有子进程的内存使用?
答案1
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/
这将导致所有运行的进程都在中创建的 cgroupluser
内运行。memlimit
cgconfig.conf
答案2
cgroups
正如其他答案所指出的那样,这是执行此操作的正确方法。不幸的是,这个问题没有完美的解决方案,我们将在下面讨论。有多种不同的方法可以设置 cgroup 内存使用限制。如何使用户的登录会话自动成为 cgroup 的一部分,因系统而异。 红帽有一些工具,也有系统。
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
,例如杰马洛克(这是 Rust 的默认分配器)或tcmalloc,也会使虚拟内存使用量大大超过其物理使用量。为了提高效率,许多工具都会映射文件,这会增加虚拟使用量,但不一定会增加物理使用量。我的所有 Chrome 进程均使用 2TB 虚拟内存。我的笔记本电脑物理内存为 8GB。尝试在这里设置虚拟内存配额的任何方式要么会破坏 Chrome,迫使 Chrome 禁用一些依赖于分配(但不使用)大量虚拟内存的安全功能,要么完全无法有效防止用户滥用系统。
答案3
答案4
在带有 systemd 的系统中(例如我正在使用的 Ubuntu 22.04),限制 CPU/内存的最简单方法是使用 cgroups systemd 配置文件,例如限制为 4GB RAM 和 2 个线程:
nano /etc/systemd/system/user-.slice.d/50-memory.conf
并在该文件中写入:
[Slice]
MemoryMax=4G
CPUQuota=200%
(然后运行systemctl daemon-reload
即可申请)
这适用于所有用户,但您可以覆盖单个用户/etc/systemd/system/user-[uid].slice.d/50-memory.conf
(我认为conf文件的名称并不重要,但我不确定)