我的 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
会导致它在它(及其子进程)超过X
K RSS 时被终止。我不知道 Ubuntu 是否仍在使用 Upstart,但如果使用,那么您可以将选项添加respawn
到 apache upstart 配置文件中,使其在终止后自动重新启动。
答案4
内存耗尽的另一个原因是您的 ubuntu 服务器上没有任何交换文件。
您的计算机可能会因为某些不时发生的特定请求而耗尽内存,从而导致大量内存被消耗。如果您有交换文件(应该是服务器内存的两倍左右),它可能会解决您的问题。
但您仍然需要调查导致所有内存被消耗的原因。如果内存一直被消耗且未释放,交换文件将无济于事 - 它实际上可能会使情况变得更糟,因为所有内存都将被消耗,并且由于交换,机器将运行得非常非常慢。