我使用3GB内存VPS Centos 6服务器。如果我重新启动它,我得到大约4或5个httpd服务正在运行,所有这些服务都使用大约2.5%的内存(来自top命令的res列上的86m)。
我运行的只是一个网站,而不是现场,所以我是唯一连接到它的网站。
然而,每天我看到httpd内存百分比上升0.3或0.4取决于。 这意味着,4或5天后,这些httpd进程将使用大约4%的内存(在顶部命令res列上130米)。我没有看到日志中的任何错误,一切工作正常,但如果我离开服务器没有重新启动2个星期我将耗尽内存。
例如,重现它的一种方法是使用ab命令。例如,如果我运行:
ab -c 2000 -t 60 http://xxx.xxx.xxx.xxx/
在运行之后,每个httpd服务将使用比运行testing之前多0.3或0.4的内存。
我再次看不到日志中的任何错误。
这是正常的吗?
我一直在做更多的testing和研究。我的价值观:
KeepAlive Off <IfModule prefork.c> StartServers 1 MinSpareServers 1 MaxSpareServers 5 ServerLimit 15 MaxClients 15 MaxRequestsPerChild 2000 </IfModule>
这似乎是好的,我总是有大约500MB的内存空余(至less当服务器刚刚重新启动)。问题是五个httpd进程总是活着保持增加的大小,所以当stream量冲击服务器和更多的孩subprocess创build它们获得父httpd进程的大小。所以如果父httpd进程是120mb,所有的subprocess将是120mb.So无关紧要MaxRequestsPerChild是多么小,因为一个新的subprocess将被创build将采取尽可能多的记忆像前一个一样。 有什么build议吗?
你实际上并没有说你正在使用什么Web服务器软件。 如果你正在讨论apache(虽然它似乎可能是一个多进程模型),那么你应该看看MaxRequestsPerChild指令 。
例如,如果你运行的是php,ruby或perl应用程序,那么(大多数)对内存泄漏并不特别小心,那么你应该把MaxRequestsPerChild降到40左右。 但是,一个好的价值确实有所不同。 一些应用程序堆栈与其他应用程序堆栈相比,重新启动进程的成本更高,而另一些应用程序堆栈的内存泄漏问题比其他更多 我已经在不同的情况下将MaxRequestsPerChild设置为5到1000之间的任何地方,但通常情况下,最好从低开始并逐渐boost,而这样做可以安全。
在正常情况下,启动后内存使用应该会有所增加,过了一段时间就会closures。
如果你的服务器无人看pipe,而且内存不足,那么它可能会开始使用交换,并且变得非常慢。 因为请求没有得到快速处理,所以更多的工作将会堆积起来,而且会消耗更多的内存,除非进程数量受到限制。 你想要考虑一些关于进程数量的限制,以及在这种情况下你认为服务器会开始使用多less内存。
你也不想有太多的交换。 如果你有很多交换,你的服务器将会或多或less完全没有响应,而它会慢慢地消耗交换内存。 要么你会介入重新启动(你不可能得到一个shell工作),或者你将使用所有的交换和OOM杀手将开始杀死进程。 如果说到这一点,你实际上宁愿OOM杀手也踢得更快。 过量交换只会使停机时间延长。 对于大多数Web服务器而言,通常build议具有两倍于RAM的交换量是完全不合适的。
提高你的minspareservers和maxspareservers。 我会把最多15个左右。 有什么关系在他们之下杀掉他们? 分钟至less应该是5。
你可能会有内存泄漏 – 如果你每次运行abtesting的时候工作人员都在持续增长 ,你可能会有内存泄漏。 (当你第一次启动服务器时,内存使用量会有一点点的变化是正常的,持续的可预测的增长是不正常的)。
如果你的问题是内存泄漏,它可能不是 Web服务器的错误,而是你的代码 (PHP或者你使用的任何脚本语言,或者你依赖的那个库写的很糟糕)。
解决内存泄漏的方法是分析你的代码( 如何做这将是一个堆栈溢出问题 ),find内存泄漏,并修复它(或让泄漏代码负责人修复它)。
如果代码是不透明的(或者你只是没有时间) mc0e的答案提供了一个可行的解决方法 :确保你正在使用一个合适的MPM(在Unix上意味着prefork或worker ),并将MaxRequestsPerChild指令设置为低足够让您的员工在用完RAM之前得到回收。
此指令具有性能影响,详情请参阅文档
最后我发现问题是关于什么的。我没有泄露我的代码或任何错误configuration。 系统运行正常。然而,这个问题与Web应用程序防火墙有关,它经常更新,每次它都会一次又一次地caching规则,并使用大量的httpd内存。
谢谢大家