有没有什么方法可以自动防止内存耗尽?

有没有什么方法可以自动防止内存耗尽?

我的 VPS ubuntu 服务器经常内存不足。我希望有一种方法可以在内存不足时简单地重新启动 apache2,因为这似乎可以解决问题。还是我太懒了不想修复这个问题?我的服务器内存确实有限……

好的,更多信息:

我正在运行 apache2 prefork,这是我的内存设置(我一直在调整它们......):

StartServers         3
MinSpareServers      1
MaxSpareServers      5
MaxClients           150
MaxRequestsPerChild  1000

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

至于脚本,我有一个包含 5 个博客的 wordpress 网络,安装了 AskBot(python/django stackexchange 克隆),安装了 MediaWiki,但实际上并没有使用。还有一个自制的 mp3 脚本,它访问 getid3 库以显示播客列表上的信息,它似乎抛出了一些 php 错误,不确定这是否是罪魁祸首……

答案1

监控可以做到这一点。

您可以使用如下配置行:

 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 上的配置示例

这也可以发挥前面提到的 ulimit 选项的作用。

重启服务只是权宜之计。你应该尝试找出内存泄漏的原因。

答案2

Apache 不应该耗尽内存,除非您在 Apache 下运行的应用程序存在内存泄漏,或者某个请求对内存的需求很大。我会首先调查为什么耗尽内存,而不是像您要求的那样实施强力解决方案。

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

但这不是一个好方法。

答案3

在 下运行 apacheulimit -m X会导致它在它(及其子进程)超过XK RSS 时被终止。我不知道 Ubuntu 是否仍在使用 Upstart,但如果使用,那么您可以将选项添加respawn到 apache upstart 配置文件中,使其在终止后自动重新启动。

答案4

内存耗尽的另一个原因是您的 ubuntu 服务器上没有任何交换文件。

您的计算机可能会因为某些不时发生的特定请求而耗尽内存,从而导致大量内存被消耗。如果您有交换文件(应该是服务器内存的两倍左右),它可能会解决您的问题。

但您仍然需要调查导致所有内存被消耗的原因。如果内存一直被消耗且未释放,交换文件将无济于事 - 它实际上可能会使情况变得更糟,因为所有内存都将被消耗,并且由于交换,机器将运行得非常非常慢。

相关内容