如何限制进程可用的内存量?


11

我正在开发一个程序;有时最终会分配非常大的内存(在具有8G物理内存的计算机上>> 10G),从而导致系统无响应。我想限制进程可以分配的内存量。我通常这样做的方式是:

ulimit -m 4000000 ; ./myprogram

...如果试图使用超过4GB的内存,它将杀死我的程序。

在OS X El Capitan上,这似乎没有任何作用。偶数ulimit -m 1(将所有程序限制为仅1kB的内存!)无效。

如何设置特定进程可用的内存上限?


当您说我通常的做法时,您是什么意思?更具体地说,您通常何时执行此操作?当您这样做时,是指在Mac OS X El Capitan中还是在其他环境中?您能否举例说明何时成功使用它?基本上,我只是想弄清楚此过程是否通常对您有用,但不适用于该特定程序?还是根本不为您工作,但您认为应该这样做?
Monomeeth

1
所谓“我通常会这样做”,是指我会在其他unix风格上这样做。我注意到我刚刚发现它ulimit -m不再可以在Linux(> 2.4.30)上运行,尽管ulimit -v仍然可以按预期运行。(例如ulimit -mulimit -v对OS X似乎也没有影响。)
cpcallen'Mar

听起来您正在编写的程序中发生内存泄漏,需要进行更好的垃圾回收。您是否已经阅读了有关内存管理的内容?
Todd Dabney

1
不,不是内存泄漏,只是一个可能非常大的状态空间的图形搜索。如果各种内部结构过大,我可以添加代码来中止搜索,但是我期望能够用一个外壳的一排纸做相同的事情(防止机器被大的输入卡住)。
cpcallen

Answers:


1

有两种方法来限制您的内存使用:事后和抢先。就是说,您可以在程序变得太大之后尝试将其终止,或者可以将其编程为不要使其变得太大。

如果您坚持事后处理方法,则可以使用以下Bash脚本。该脚本首先查找进程ID为pid的进程正在使用的内存量(由“驻留集大小”定义),使用grep过滤掉所有非数值数据,并将该量保存为变量n。然后,脚本检查n是否大于指定的x。如果是,则杀死具有processid pid的进程。

请注意:

  1. 您必须替换<pid>为程序的进程ID。
  2. 您必须用<x>不希望程序超出的rss =“ resident set size”(即实际内存大小)替换。

n=$(ps -<pid> -o rss | grep '[0-9]') if [ $n -gt <x> ]; then kill -9 <pid>; fi

如果您希望此方法每隔y秒运行一次,则将其封闭在一个循环中,并告诉它在每次迭代后等待y秒。您还可以使用编写类似的命令top。您的起点将是top -l 1|grep "<pid>"|awk '{print $10}'

@kenorb的答案帮助我编写了脚本


虽然我相信这可以回答问题,但从长远来看,我认为采用手动内存分配的抢占式方法是更好的编程设计。

首先,您确定内存使用确实存在问题吗?Go 文档指出:

Go内存分配器保留了大范围的虚拟内存作为分配的场所。该虚拟内存在特定的Go进程本地;保留不会剥夺其他进程的内存。

如果您仍然认为自己有问题,那么建议您像使用C编程语言一样手动管理内存。由于go是用C编写的,因此我怀疑会有进入C内存管理/分配的方法,的确存在。看到这个github仓库,

允许您通过系统的标准C分配器进行手动内存管理。它是malloc,calloc之上的薄包装,并且没有。有关系统中这些功能的详细信息,请参见man malloc。该库使用cgo。

用例为:

你为什么要这个?

当程序导致内存压力或系统内存不足时,手动控制内存分配和释放会很有帮助。Go可以帮助您控制分配,但是无法显式取消分配不需要的数据。

这似乎是一个更好的长期解决方案。

如果要了解有关C(包括内存管理)的更多信息,则 C编程语言是标准参考。


我确信内存使用确实是个问题。当程序意外增长到大于2倍的物理内存大小时,由于页面抖动,计算机几乎完全无响应。从我按下^ C到macOS恢复响应鼠标单击之间的时间大约需要一个小时。同时,唯一没有证明它没有冻结的证据是硬盘驱动器的安静噪音在快速滴答作响。
cpcallen

在实践中,这可能是一个合理的解决方案,但是与(非Darwin)UNIX OS上的ulimit不同,它取决于能够及时分配足够的内存以成功执行kill命令。我真的希望内核强制执行进程大小限制。
cpcallen

@cpcallen进行了一些搜索,似乎“ ulimit的-m参数在内核版本高于2.4.30的Linux系统上无效。” 似乎OSX也已经接受了此更改。尝试使用-v选项来限制地址空间
Evan Rosica

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.