Linux 特定答案:
对于运行ulimit -m $LIMIT_IN_KB 的历史系统,这将是正确的答案。现在你必须使用cgroups 和cgexec 或systemd-run。
但是,对于仍在过渡到systemd 的系统,似乎没有任何解决方案不需要为您希望使用的每个限制设置预制配置。这是因为此类系统(例如 Debian/Ubuntu)仍然使用“混合层次 cgroup”,并且 systemd 仅支持使用较新的“统一层次 cgroup”设置内存限制。如果您的 Linux 发行版已经在运行 systemd 并使用统一的层次结构 cgroups,那么运行具有特定限制的给定用户模式进程应该像这样运行
systemd-run --user --pipe -p MemoryMax=42M -p CPUWeight=10 [command-to-run ...]
或
systemd-run --user --scope -p MemoryMax=42M -p CPUWeight=10 [command-to-run ...]
有关可能的参数,请参阅man systemd.resource-control。
如果我理解正确,设置CPUWeight 会指示内核在CPU 完全执行任务时要给多少CPU,默认为100,如果多个进程竞争CPU 时间,较低的值意味着更少的CPU 时间。如果 CPU 利用率低于 100%,它不会限制 CPU 使用率,这通常是一件好事。如果你真的想强制进程使用少于一个内核,即使机器空闲,你可以设置例如CPUQuota=10% 强制进程使用最多 10% 的单核。如果您设置CPUQuota=200%,则意味着该进程平均最多可以使用 2 个内核(但如果没有 CPU 绑定,它可以在更多 CPU 上使用部分时间)。
附加信息:
更新(2021 年):看来
systemd-run --user --pty -p MemoryMax=42M -p CPUWeight=10 ...
如果您正在运行 systemd 的版本,包括对错误 https://github.com/systemd/systemd/issues/9512 的修复 - 实际上,您需要此处列出的修复:https://github.com/systemd/systemd/pull/10894
如果您的系统缺少这些修复,命令
systemd-run --user --pty -p MemoryMax=42M -p CPUWeight=10 ...
似乎可以工作,但实际上并未强制执行内存限制。
实际上,Ubuntu 20.04 LTS 似乎不包含必需的修复程序。以下应该失败:
$ systemd-run --user --pty -p MemoryMax=42M -p MemorySwapMax=50M -p CPUWeight=10 stress -t 10 --vm-keep --vm-bytes 10m -m 20
因为命令stress 预计需要略多于 200 MB 的 RAM,但内存限制设置得较低。根据错误https://github.com/systemd/systemd/issues/10581 Poettering 说,如果发行版使用cgroupsv2,这应该可以工作,无论它在实践中意味着什么。
我不知道正确实现用户模式cgroup 限制的发行版。因此,您需要root 来配置限制。