如何创建限制 RAM 使用的用户?

如何创建限制 RAM 使用的用户?

所以我有 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内运行。memlimitcgconfig.conf

答案2

cgroups正如其他答案所指出的那样,这是执行此操作的正确方法。不幸的是,这个问题没有完美的解决方案,我们将在下面讨论。有多种不同的方法可以设置 cgroup 内存使用限制。如何使用户的登录会话自动成为 cgroup 的一部分,因系统而异。 红帽有一些工具,也有系统

memory.memsw.limit_in_bytesmemory.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

您无法在用户级别限制内存使用量,ulimit 可以做到这一点,但只能针对单个进程。

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

如果您确实想限制资源,则需要使用资源管理工具,例如拉帕德由 Solaris 下的项目和区域使用。

您可能会研究一下 Linux 上似乎提供类似功能的东西:cgroups

答案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文件的名称并不重要,但我不确定)

相关内容