myW*_*SON 49 users memory limit not-root-user
所以我有 4 GB RAM + 4GB 交换。我想创建一个具有有限内存和交换空间的用户:3 GB RAM 和 1 GB 交换空间。这样的事情可能吗?是否可以在不创建单独用户的情况下启动具有有限 RAM 的应用程序并对其进行交换(并且不安装任何特殊应用程序 - 只有默认的 Debian/CentOS 服务器配置,并且不使用 sudo)?
更新:
所以我打开终端并输入ulimit命令:ulimit -v 1000000这就像976,6Mb限制。接下来我打来电话ulimit -a,看到限制是“开启”。然后我开始了一些 bash 脚本,它编译并启动我的应用程序nohup,很长 nohup ./cloud-updater-linux.sh >& /dev/null &......但一段时间后我看到:

(如果没有应用限制就可以了——它下载了一些大的库,并开始编译它。)
但我认为我对 shell 和所有使用它启动的进程应用了限制ulimit -v 1000000?我做错了什么?如何使终端及其启动的所有子进程限制在 ram 使用上?
uto*_*und 72
ulimit是为此而生的。您可以ulimit在每个用户或每个组的基础上设置默认值
/etc/security/limits.conf
Run Code Online (Sandbox Code Playgroud)
ulimit -v KBYTES设置最大虚拟内存大小。我认为您不能提供最大数量的交换。这只是用户可以使用的虚拟内存量的限制。
所以你limits.conf会有这条线(到最大4G内存)
luser hard as 4000000
Run Code Online (Sandbox Code Playgroud)
更新 - CGroups
由ulimit和施加的限制limits.conf是每个进程。在这一点上我肯定不清楚。
如果您想限制用户使用的内存总量(这就是您的要求)。你想使用cgroups。
在/etc/cgconfig.conf:
group memlimit {
memory {
memory.limit_in_bytes = 4294967296;
}
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个cgroup最大内存限制为 4GiB 的。
在/etc/cgrules.conf:
luser memory memlimit/
Run Code Online (Sandbox Code Playgroud)
这将导致通过运行的所有进程luser的内部运行memlimit中创建的cgroup cgconfig.conf。
小智 7
cgroups正如其他答案所指出的那样,是正确的方法。不幸的是,这个问题没有完美的解决方案,我们将在下面介绍。有很多不同的方法来设置 cgroup 内存使用限制。如何使用户的登录会话自动成为 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 杀手被调用,那么逻辑上首先杀死超过配额的 cgroup。然而,这样做的缺点是,在某些情况下,立即需要一些内存,而 OOM 杀手没有时间四处寻找要杀死的进程,在这种情况下,可能会在超出配额的用户进程之前出现故障被杀。
ulimit然而,这绝对是错误的工具。ulimit 限制了虚拟内存的使用,这几乎肯定不是您想要的。许多实际应用程序使用的虚拟内存远多于物理内存。大多数垃圾收集运行时(Java、Go)都以这种方式工作以避免碎片化。一个简单的 C 语言“hello world”程序,如果用地址清理器编译,可以使用 20TB 的虚拟内存。不依赖于 的分配器sbrk,例如jemalloc(这是 Rust 的默认分配器)或tcmalloc, 虚拟内存使用量也将大大超过其物理使用量。为了效率,许多工具会映射文件,这会增加虚拟使用量,但不一定会增加物理使用量。我的所有 Chrome 进程都使用 2TB 的虚拟内存。我在一台具有 8GB 物理内存的笔记本电脑上。在这里尝试设置虚拟内存配额的任何方式要么会破坏 Chrome,强制 Chrome 禁用某些依赖于分配(但不使用)大量虚拟内存的安全功能,要么在防止用户滥用系统方面完全无效.