Apache内存不足

我有一个768 MB RAM和1.13 GHZ处理器的VPS。 我运行一个PHP / MySQL约会网站,性能非常好,服务器负载一般很低。

有时我在Facebook上放置广告,在几秒钟内我可以获得100-150点击的高峰时间 – 这会导致服务器内存不足:

无法分配内存:无法创buildsubprocess:/ opt / suphp / sbin / suphp ….

所有用户收到错误500页。

我只是想知道这听起来是否合理 – 对我来说,100-150似乎不是一个应该导致Apache内存不足的数字。

任何意见/build议如何诊断问题高度赞赏。

优化内存占用通常是通过减less(和限制)这些因素来完成的:

  • 同时Apache进程的数量(我build议切换到prefork MPM,这是在内存有限的环境中更可控)
  • 远离mod_php或php_cgi到fastcgi,mod_cfgid工作正常。 减lessFcgidMaxProcesses所允许的衍生php进程的数量并消除长时间的超时(参见http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
  • 服务器“线程”,特别是通过减less不必要的长时间超时((dis)连接超时,keepalive …)

如果负载变得非常沉重,还应该考虑请求处理的速度(更快的加载提高一个请求所需的总大小*内存的时间)

  • 优化您的网站代码(改进PHP代码更快和/或更高的内存效率)
  • 优化PHP执行(xcache可以加速几次)
  • 整个请求caching也奇迹,请参阅mod_cache

也许,如果你的网站没有任何CPU密集型的,并且你需要一些极端的Req / S,你可以尝试一些不同的networking服务器(比如nginx或lighttpd),在这种情况下performance得更好。

处理尖锐的交通是艰难的。 替代scheme包括:轻量级HTTP服务器(lighttpd,nginx等); 更多的物理RAM; 一个负载均衡器和额外的主机,这有更多的可用性的好处; 通常通过FastCGI将应用程序代码卸载到与HTTP服务器分开的系统中; dynamic调配计算资源以通过EC2等云服务满足负载; 或者我忘记或没有想到的其他想法。 那里有一些很好的资源, 高可扩展性博客,例如,涵盖了很多这个领域。 希望这可以帮助!

Apache的每个实例的内存需求大约是10MB,但具体数量取决于您的configuration。 因此,如果你想为Apache服务100个并发连接,那么你需要至less1GB的内存,加上系统需要的任何东西,MySQL以及你正在运行的任何东西。

如果您想停止“出错”条件,则可以将MaxClients Apacheconfiguration参数调整到适当的级别。 要得到每个Apache实例的内存估计值,请查看top输出,并减去所有httpd命令的RES和SHR列。 确保减去MySQL和系统其余部分所需的内存。 请注意,您可能最终在本机上的MaxClients数量相对较低(30-50)。

其他答案给出了一个很好的总结,你可以做些什么来改善你可以处理多less个并发请求。 请注意,在这样一个低端的系统上,将Apache / PHP / MySQL和lighttpd / nginx / memcached / caching结合起来可能会很困难,但不一定是不可能的。 容易或困难将取决于您的应用程序和您的目标性能。 考虑升级到更大的服务器…你会发现一切适合2GB或4GB更容易。

首先要做的是整理你现在的系统。 开箱即用,apache通常configuration了许多你可能不需要的扩展(特别是auth和proxy,如果你使用SSL,但是很less使用,那么考虑删除mod_ssl并运行stunnel)。 请启用mod_deflate。 看看你的系统上运行的其他东西 – closures(和禁用)你不需要的任何服务。

接下来,通过CGI在专用机器上运行suphp通常是一个非常愚蠢的想法 – 使用mod_php或fastCGI。

通过提高系统运行速度,您不仅可以为客户提供更好的服务,还可以减less内存占用。 所以….

如果您还没有PHPcaching,请安装PHP操作码caching。

开始挖掘系统的性能 – 改变你的httpdconfiguration,开始logging%D,并查看URL频率和%D的乘积,以确定哪些URL导致最多的问题。

降低你在MySQL缓慢的查询日志的门槛 – 使用这个分析器或类似的分析数据(请注意,你应该再次根据频率和运行时间的产品优先)。

添加一个自动prepend来启用gz输出缓冲区压缩。

开始logging正在运行的httpd进程的数量,并将其与“free”中可用的较lesscaching/缓冲区进行比较 – 整理数据并对其进行graphics化,以确定您可以合理运行多less个httpd进程 – 然后更改httpd.conf以执行此操作限制。 请注意,磁盘I / O的速度很慢 – 因此您需要一个健康的caching内存。

开始看看你的服务器是否提供了良好的caching信息,或者如果客户端和代理服务器不得不为了没有改变的东西而返回(mod_expires,mod_headers)

但有时你只需要更多的硬件。 我build议考虑使用第二台服务器,而不是只升级一台服务器 – 添加循环法的DNS是微不足道的 – 而且您还可以获得更好的可用性(一旦您已经研究出如何处理数据库复制) 。