如何限制一个Linux二进制文件到有限的RAM?

我想能够限制一个安装的二进制文件只能使用一定量的RAM。 如果超过它,我不希望它被杀死,只是这将是它可以使用的最大数量。 我希望进程一旦达到一定数量的内存就死了,最好在服务器开始交换之前。

我面临的问题是我正在运行一个Apache 2.2服务器与PHP和一些开发人员正在为我们写的自定义代码。 问题是,在那里的代码,他们启动一个PHP EXEC调用,启动ImageMagick的“转换”来创build一个resize的图像文件。

我并不了解项目或代码的许多细节,但需要find一种解决scheme,以防止他们杀死服务器,直到他们find一种方法来优化代码。

我以为我可以用/etc/security/limits.conf来做这件事,并且对apache用户设置一个限制,但似乎没有任何作用。 这是我用过的:

www-data很难像500

如果我理解正确的话,这应该已经限制了任何apache用户进程到最大500kb,然而,当我运行一个testing脚本,会咀嚼大量的RAM,实际上达到了1.5GB之前,我杀了它。 以下是设置更改和系统重启后'ps auxf'的输出:

 USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND
根5268 0.0 0.0 401072 10264?  Ss 15:28 0:00 / usr / sbin / apache2 -k start
 www-data 5274 0.0 0.0 402468 9484?  S 15:28 0:00 \ _ / usr / sbin / apache2 -k start
 www-data 5285 102 9.4 1633500 1503452?  Rl 15:29 0:58 |  \ _ / usr / bin / convert ../tours/28786/....。
 www-data 5275 0.0 0.0 401072 5812?  S 15:28 0:00 \ _ / usr / sbin / apache2 -k start

接下来,我想我可以用Apache的RlimitMEM设置来做到这一点,但得到相同的结果,不受限制。 这是我在我的apache.conf文件中:

RLimitMEM 500000 512000

直到几个小时之后,我才发现,如果这个过程真的达到了这个数量,那么它会因为OOM错误而死亡。

会喜欢关于如何设置这个限制的任何想法,所以其他的东西可以在服务器上运行,所有这些都可以很好地一起玩。

创build一个新用户,仅用于ImageMagick。 给它你想要的内存限制。 以某种方式设置sudoers文件,Apache可能会以此用户的身份调用ImageMagick。 更改您的PHP代码中的exec()调用,以通过sudo运行转换或用包装脚本replace原始的转换二进制文件。 如果ImageMagick正在吃所有的内存,让它死,并让PHP脚本扔适当的错误信息。

或者把ImageMagick全部replace掉​​,这是一个巨大的记忆(尝试把小图片拼凑在一起,一次你会记得为什么你仍然有一个交换分区)。

有一个相当新的(2.6.24)内核接口叫做cgroups,可以让你做到这一点。 你可以在cgroup下放一个用户,组或者PID(有孩子),给它一定数量的内存,CPU,IO(磁盘,networking)等等。与KVM虚拟机一起使用时,它非常整洁,function非常强大。 有关更多信息,请参阅wikipedia和官方文档 。

简单的答案是:你不能。 如果程序不能分配更多的内存,将会崩溃。 您可以通过设置工作人员和所有内容来将服务器内存保留在特定边界内,但这会限制性能。

如果你需要更多的氧气,不能有更多,你也会死。 没有其他的结果。

如果Rlimitmeme选项不起作用,那么似乎很less有机会达到限制。 至less可以向我展示一个pastebin中的OOM杀手堆栈轨迹,以便我可以看到哪些区域正在耗尽或分配失败。 不是你所遇到的问题的解决scheme,而是我更愿意做的一些更常见的debugging。

但是,我真的没有想办法限制一个二进制文件使用一定量的RAM。 我想这是不可能的。