有什么办法可以自动防止内存不足?

我经常在我的VPS ubuntu服务器上用完内存。 我希望有一种方法可以简单地重新启动apache2,当它开始用尽内存,因为这似乎解决了这个问题。 还是我懒得解决这个问题? 我在服务器上的内存有限

好的,更多的信息:

我正在运行apache2 prefork,这里是我的记忆设置(我一直在调整他们…):

StartServers 3 MinSpareServers 1 MaxSpareServers 5 MaxClients 150 MaxRequestsPerChild 1000 

VPS有1 GB的ram,运行ubuntu 11.04 32位。

至于脚本,我有一个wordpressnetworking,有5个博客,一个AskBot(一个python / django stackexchange克隆)的安装,以及一个不真正使用的MediaWiki的安装。 还有一个自制的MP3脚本访问getid3库显示播客列表中的信息,似乎是抛出一些PHP错误,不知道如果这是罪魁祸首…

Monit可以做到这一点。

你可以使用一个configuration行如:

  check process apache with pidfile "/var/lock/apache/httpd.pid" start program = "/etc/init.d/httpd start" with timeout 60 seconds stop program = "/etc/init.d/httpd stop" if 2 restarts within 3 cycles then timeout if totalmem > 100 Mb for 5 cycles then restart if children > 255 for 5 cycles then stop if cpu usage > 95% for 3 cycles then restart if failed port 80 protocol http then restart group server depends on httpd.conf, httpd.bin 

(从monit.com上的这个configuration示例修改 )

这可能会发挥前面提到的ulimit选项。

重新启动服务是一个绷带。 你应该试着找出为什么它泄漏的记忆。

Apache不应该耗尽内存,除非在apache下运行的应用程序中有一些内存泄漏,或者某个请求对内存有很大的需求。 我会调查为什么我首先用尽内存,而不是实施一个像你要求的暴力解决scheme。

如上所述,实现一个基本的cron作业脚本应该非常简单,它只是在apache进程上调用“ps”,找出它们消耗了多less内存,并在需要时重新启动。 每分钟运行一次就足够了。

但是,再次 – 这不是一个好的方法。

ulimit -m X下运行apache将导致它在(及其子)超过X K RSS时被杀死。 我不知道Ubuntu是否仍然使用Upstart,但是如果是这样,那么你可以添加respawn选项到apache upstartconfiguration文件中,使它在被杀死后自动重启。

这实际上是一个相当复杂的问题,因为它取决于消耗内存的东西。 如果你严格服务于静态内容(谁再这样做?),那么你必须看看你的Apacheconfiguration,以确保它不允许有更多的并发连接/线程比你的可用内存无法处理。

更有可能你有一些PHP脚本或一个调整不好的后端应用程序不正确地消耗你所有的内存。 在大型PHP应用程序中,这种情况发生了很多,这些应用程序在启动时将RAM的最大值增加到32或64M,并且一次获得4个访问者。

你可以在服务器上发布一些关于apacheconfiguration的附加信息吗?

另一个可能会导致内存不足的原因是您的ubuntu服务器上没有任何交换文件。

您的计算机可能因内存不足而导致某些特定请求发生内存不足,从而导致大量内存被占用。 如果你有交换文件(应该是服务器内存的两倍大),它可以解决你的问题。

但是你仍然需要调查什么导致所有的内存被消耗。 如果内存一直被占用,而不是释放,交换文件将无济于事 – 它可能会使情况变得更糟,因为所有的内存都将被占用,而交换机将会运行得非常非常慢。