Apache,内存不足

我经常收到以下消息: 替代文字

我想这是因为我没有足够的内存。 它是否正确 ?

有什么我可以做的吗?

谢谢

更新 :我已经安装了MPM prefork

<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 

这是你的问题:

 MaxRequestsPerChild 0 

零值意味着单个subprocess永远不会退出,缓慢地消耗越来越多的RAM(取决于代码需要多长时间)。 将这个值设置为合理的值(尝试5000开始),然后在Apache完成处理负载后,你会在你的'ps'中看到一个点,在这个点上,记忆。

使用这个值作为你的最大子尺寸,你必须将MaxClients设置为你想要使用的内存。 所以,如果你有256MB的,你会想要留下一些为操作系统,所以让我们说,248MB的Apache(这不是确切的,取决于你的系统是什么)。 这意味着每个阿帕奇孩子最多只能有1.5MB,这是一种愚蠢的行为 – 大多数Apache进程平均运行在15MB的范围内(一些更高)。

比方说,你有一个平均20MB的Apachesubprocess有5000个请求,如果你把请求丢到4000,你可以把它减less到15MB(举例) 这是你必须玩的东西。 无论你想出什么样的组合,先做math运算,然后设置你的MaxClients(248/15 = 16,例如)。

你必须做一些小小的调整,以便在每个想要获得内存设置的地方缩小范围。 用你当前的设置为0,你让Apache运行横行。

你可以做的最大的事情是修剪所有的守护进程,只使用他们需要的内存来完成工作。 减less你的数据库内存caching,减lesshttpd子项的数量,禁用未使用的httpd模块等。显然这会影响性能,所以你必须监视系统一段时间,并根据需要进行调整。

抵制通过添加交换空间来修补问题的诱惑。 这实际上是一个不解决的问题,因为系统性能将会被驱动到地面。

我想这是因为我没有足够的内存。 它是否正确 ?

系统杀死Apache进程,因为它需要更多的内存

有什么我可以做的吗?

添加内存,交换或调整mpm设置(/etc/apache2/apache2.conf,具体searchMPM)

我假设你正在使用预制件MPM(你可以通过运行apache2 -V并在输出中查找forked: yes )来检查。

首先,尝试编辑/etc/apache2/apache2.conf并降低MaxClients值。 这个值决定了Apache可以提供多less个并发客户端。 显然你需要重新启动/重新加载Apache才能使更改生效。

或者,如果您不必使用prefork MPM(最有可能的原因是您正在运行PHP),则可以切换到worker MPM。 这使用线程而不是进程进行并发处理,因此具有更高的内存效率。

要做到这一点,运行:

 aptitude install apache2-mpm-worker 

你可能有一个在Apache内部运行的错误的应用程序,例如一个错误的PHP扩展或自定义的Apache模块或只是一个失控的脚本。 你的maxrequestsperchild被设置为零,所以apache的fork()子代将永远保持活着以便为请求提供服务(永远是相对于你的apache主进程的全局定义的)。 同时这样做你的越野车应用程序请求内存,而不是释放它,所以孩子们将保持吸吮记忆。 操作系统标志着这些进程是下一次stream血冲突的好select。 如果你想隐藏bug并假装什么都没有发生,把maxrequestsperchild设置为500(这个值真的取决于你的服务每秒处理多less个请求,例如,如果你服务500reqps那么5000是一个很好的起点,所以你会不会造成叉击雷鸣)。 不要使用mpm工作,当操作系统决定强行释放一些内存时,这将完全杀死整个线程池,加上大部分php扩展都不是线程安全的(假设你使用的是php)。 最好的办法是开始debugging。 如果没有与GDB那么我相信你可以find一些用于debugging和分析正在运行的应用程序的apache模块。