【问题标题】:Limiting process memory/CPU usage on linux限制Linux上的进程内存/ CPU使用率
【发布时间】:2010-12-05 17:23:02
【问题描述】:

我知道我们可以使用nice 命令调整调度优先级。

但是,手册页并没有说明它是否会限制 CPU 和内存或仅限制 CPU(无论如何,它不能用于指定绝对限制)。

有没有办法在 Linux 中运行进程并将其内存使用限制为“X”MB,将 CPU 使用限制为“Y”Mhz?

【问题讨论】:

  • 为了限制 cpu 我发现 cpulimit 非常好 f.e: cyberciti.biz/faq/cpu-usage-limiter-for-linux
  • 您真的想将 CPU 限制在给定的时钟上,还是想限制最大 CPU 使用率并仍然允许内核自动调整 CPU 时钟?请注意,CPU 不能以较低的时钟并行运行优先级较低的任务而不是较高优先级的任务。

标签: linux memory process memory-management cpu-usage


【解决方案1】:

您可能想要调查cgroups 以及旧的(过时的)ulimit

【讨论】:

  • 谢谢。 cgroups 看起来像我需要的东西。
【解决方案2】:

理论上,您应该能够为此目的使用ulimit。但是,我个人从来没有让它工作过。

【讨论】:

  • getrlimit 手册页声明它仅在 Linux
【解决方案3】:

Linux 特定答案:

对于运行ulimit -m $LIMIT_IN_KB 的历史系统,这将是正确的答案。现在你必须使用cgroupscgexecsystemd-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 来配置限制。

【讨论】:

猜你喜欢
  • 2011-10-03
  • 2010-11-16
  • 2011-02-26
  • 2015-12-11
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
相关资源
最近更新 更多