有没有办法限制特定进程在 Unix 中可以使用的内存量?

Laz*_*zer 40 process memory limit

我需要测试一个内存管理过程。

  • 我没有源代码,所以我需要从操作系统端进行所有测试。
  • 我希望能够说类似的话 limitmemory 400k -p <pid>

有没有办法在unix中做到这一点?任何常见的 Unix 实用程序都很棒。

pol*_*mon 27

ulimit -v,它是一个内置的外壳,但它应该做你想做的。

我有时在初始化脚本中使用它:

ulimit -v 128k
command
ulimit -v unlimited
Run Code Online (Sandbox Code Playgroud)

但是,您似乎想要在程序运行时操作最大可分配内存的方法,对吗?可能类似于renice操纵优先级。

然而,据我所知,没有这样的工具。

  • @Lazer:以`(ulimit -v 400; exec myprogram)` 或`bash -c 'ulimit -v 400; 之类的方式启动程序;我的程序'`。 (12认同)
  • 但是 ulimit 会将资源限制更改为由该 shell 指定的所有进程,而不仅仅是在 pid 上。它限制了系统范围资源的使用。 (5认同)
  • `128k` 不适用于 Bash 4.3.11。但也不需要它,因为它默认是 1024 的倍数,所以 `128` 应该是一样的。 (3认同)

Gil*_*il' 12

要在启动程序时设置限制,请使用ulimit -v 400,如polemon 所示。这为 shell 及其所有后代设置了限制,因此在脚本中您可能想要使用类似的东西(ulimit -v 400; myprogram)来限制范围。

如果您需要更改正在运行的进程的限制,则没有实用程序。您必须获得执行setrlimit系统调用的进程。这通常可以通过调试器来完成,尽管它并不总是可靠地工作。以下是使用 gdb 执行此操作的方法(未经测试;9 是RLIMIT_ASLinux 上的值):

gdb -n -pid $pid -batch -x /dev/stdin <<EOF
call setrlimit(9, {409600, -1})
detach
quit
EOF
Run Code Online (Sandbox Code Playgroud)


Cri*_*itu 12

我对此不太确定,但您也可以使用cgroups来限制内存使用。cgroups 的优点是你可以控制已经在运行的进程。顺便说一下,systemd会使用 cgroups 来控制系统服务。

不幸的是,我进行了一些试验,它们在我的 Fedora 13 系统上似乎不太好用。

  • cgroups 是面向未来的正确方式。在较旧的发行版中不起作用,但从现在开始,这是前进的方向。查看`libcgroup` http://sourceforge.net/projects/libcg/ 的实用程序来控制它们。 (3认同)
  • 或者甚至更好的 `systemd-run` 隐式使用 cgroups,就像在 `systemd-run --scope -p MemoryLimit=1G firefox` 中一样。 (2认同)

Luc*_*lli 12

在内核 >=2.6.36 和 util-linux >=2.21 的 Linux 系统上,您可以使用prlimit命令设置进程资源限制:

prlimit --as=400000 --pid <pid>
Run Code Online (Sandbox Code Playgroud)

这会将进程可以使用的最大虚拟内存量限制为 400000。您可以在 中找到可以为给定进程限制的完整资源列表man 2 prlimit

正如评论和联机帮助页中所述,限制 RSS 的数量在内核 > 2.4.0 和 <2.4.30 中不起作用。

  • 这仅适用于 x &lt; 30 的 Linux 2.4.x,参见。[man (2) setrlimit](https://linux.die.net/man/2/setrlimit) 中的 RLIMIT_RSS。换种说法:它不起作用。 (3认同)
  • 另请注意,OP询问如何限制正在运行的进程的内存,并提供了他想要执行的操作“limitmemory -p &lt;pid&gt;”的示例。其他投票的答案都不允许这样做,它们都解释了如何限制尚未启动的进程的内存或需要重新启动该进程。这不是OP所要求的。 (3认同)