如何减少Unix Web服务器上的内存使用量


36

我目前正在使用Joyent Accelerator来托管我的Web应用程序,并且运行良好,但是我需要降低成本,因此我正在降低当前计划的等级,并施加了一些新的内存限制(256M rss,512M交换)。昨天我对它们并不太远,但是今天重新启动了几次Apache之后,我现在是411M rss,721M swap(prstat -Z -s cpu)。

在“服务器故障”中搜索仅提供了许多方法和特定工具来监视服务器,但没有提供有关如何减少/优化其内存使用量的建议。我也看到了这个问题,但是对于这种特殊的情况(或者我可以说是通用的),我认为这不好。

该服务器在共享CPU上运行Solaris,而我正在使用Apache + MySQL + PHP堆栈。

我很想知道一个人可以采取的措施来解决这个问题并解决问题。但是,我也没有时间减少内存占用并在当前计划结束之前降低计划的质量,因此,任何可以创造奇迹并节省时间的事情也都受到欢迎:)


1
我只是想发表评论,尽管我自己是通过谷歌搜索了解这些设置的,但事实证明我正在更改一个文件中的设置,但是稍后加载的另一个配置文件实际上是在无声地覆盖我的设置!一旦发现这一点,设置prefork MPM设置和其他一些功能就会使将进程数和内存使用情况保持在可控制的范围内,从而将交换次数降至最低。希望此信息对其他人有帮助,尤其是那些在其服务器上运行Gentoo的人。
Pistos

Answers:


23

谢谢大家的回答!按照您的建议,我已经能够将内存使用量减少到195M SWAP和108M RSS,而无需修改代码(我肯定会很快对其进行优化,但这应该是使我快速摆脱困境的一种解决方案)。

这是我所做的事情的清单:

摆脱了VirtualHost条目中使用的通配符。我使用服务器的真实IP而不是*:80和*:443。

更改了Apache的prefork MPM。这些是我最终使用的值:

启动服务器1
MinSpareServers 1 
MaxSpareServers 5 
ServerLimit 16
MaxClients 16
MaxRequestsPerChild 0
聆听积压100

这些绝不是神奇的数字。我花了一些时间尝试不同的值和组合,然后针对服务器的实际使用情况对它们进行测试,每个人都应在自己的环境中做同样的事情。作为记录,我的服务器每月收到近200万个pvs,以固定的速率同时为动态页面和资产提供服务-没有digg效果。同样,其目的是减少内存占用空间,而不是提高性能或HA。

参考:

调低了Apache的KeepAlive。通过设置KeepAliveTimeout一个较低的值(在我的例子中为2),我可以期待更少的服务器进程仅在等待与可能不需要更多内容的空闲客户端的连接。

参考:http : //httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout

删除了MySQL未使用的模块。我添加skip-innodb到MySQL的my.cnf。大量减少内存消耗。


还有一些我个人无法做到的出色建议:

  • 删除不需要的PHP模块。我服务器上的PHP已编译了大多数mod,我可能会在其他VPS上尝试自己的最小PHP。
  • 使用php-fastcgi切换到nginx。这是我会尽快尝试的另一个好建议,但是现在我不能冒险停机。

我正在运行nginx和php-fastcgi(LEMP),并且遇到了类似的内存问题...在256MB服务器上,我发现php-fastcgi与PHP_FCGI_CHILDREN = 5和PHP_FCGI_MAX_REQUESTS = 333配合得很好...这些值是一个好的开始点!
farinspace 2010年

Got rid of the wildcard used in VirtualHost entries这实际上有任何有意义的帮助吗?我的印象是不会有所作为。
曼恩

@Mahn-它对内存没有帮助,但是会提高CPU使用率,这在内存不足的环境中是一件好事
jsnfwlr 2014年

“使用php-fastcgi切换到nginx” ---如果您想保留Apache2,那么不太麻烦但有效的选择是:Apache2 + mod_proxy_fcgi + mod_mpm_event。mpm_event与nginx相似。使用它来连接到php-fpm。参见dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston


4

您将需要限制正在运行的apache服务器进程的数量,并且要尽可能接近极限,因此您将无法处理非常高的流量。通常情况下,让Web服务器在正常使用情况下达到最大负荷通常是一个坏主意(tm),因为在大多数情况下,Web流量都很不错,而且流量很低,直到您被鞭打,挖掘或火球之类的为止。

主要问题是在任何一点上运行的apache进程的数量-这里假设是前叉,因为我只部署了PHP应用程序,而PHP不是线程安全的。我没有确定工人MPM尺寸的经验。共享内存中有一些项目,每个进程的内存中有一些项目。

您可以通过省去不需要的共享模块来减少总内存占用。基本上,Apache由大多数主机配置为可以在阳光下进行几乎所有操作。如果您不使用mod_userdir,则将其从apache配置中注释掉。请小心删除多少,因为您可能需要某些东西或它们的依赖关系不直观!所有模块都应记录在apache.org网站上。每个进程的足迹很难缩小。如今,大多数apache配置仅带有编译的四个基本模块。除了这四个模块之外,大多数内存使用情况来自泄漏或未有效收集垃圾的应用程序RAM,这就是为什么您可能想要设置请求数的原因处理每个流程低。

确实希望将内存使用情况保留在RAM本身,而不要进行交换。交换意味着I / O。I / O速度很慢,随着进程阻塞,同时等待某些东西从交换中移出时,它会推动CPU使用率上升。


1
感谢卡尔的建议!有没有一种方法可以防止服务器使用交换?因为减少内存使用量后,我不再占用RAM,但是仍显示已使用SWAP内存。
利马

@fandelost使用交换实际上并不重要,这是因为在换入和换出页面时情况很糟糕。您的操作系统可能会在有时间的情况下从不是经常运行的进程中交换指令或数据,因为它认为(并且通常是对的)这些指令和数据在此更好。
帕特里克·詹姆斯·麦克杜格

2

对于apache,请删除不使用的模块,因为它们只会占用更多内存。对于MySQL,如果不使用innodb / bbdb,请删除它们,然后删除不需要的PHP模块。

接下来,您应该根据一个进程的大小和要分配给apache的内存量来配置apache MaxClients。MySQL上的最大连接数也一样(我建议使用出色的MySQL Tuning Primer Script。

如果您可以控制PHP应用程序,请确保它不使用过多的内存(例如,在变量中,尤其是在静态变量中)。

如果想更进一步,可以用nginx + fcgi setup替换apache + mod_php,这可能会进一步减少内存。

最后一件事-您真的不想在Web服务器上交换。只需一点,即可删除不需要的内容,但是在Web服务器上定期交换将导致网站无响应。


感谢您的建议yhager,我正在尝试Tuning-primer.sh,但出现以下错误:“第94行的语法错误:'cnf_socket = $'意外”。有任何想法吗?
利马,2009年

可能与外壳有关。由于此脚本可能与Linux有关,因此请尝试将第一行更改为指向bash,而不是/ bin / sh。我希望您可以在Solaris上安装bash,但是我
无能为力

2

既然您已经实现了目标,那么这里有一些额外的功能:

由于您删除了所有不必要的php模块,因此您可以使用相同的apache。默认情况下(取决于您的安装),apache会加载很多额外的模块,并且对于日常正常使用而言,大多数模块并不是真正需要的。例如,有很多身份验证模块始终加载。除非您试图限制带宽使用,否则通常不需要deflate。自动索引和状态记录也值得怀疑。

另外一个是您可以在php.ini中限制可用于php的内存量:memory_limit = xxxM


0

您当然可以限制apache可以分叉的进程数,但是这只能作为对内存使用量的限制。从较低级别的角度来看,可以使用plimit限制进程可用的资源。我相信将其应用于父进程和子进程继承。

但是,从Web服务器配置的角度来看,它可以归结为代码的实际运行方式!但是请记住,使用.htaccess文件之类的小事情比使用中央apache配置文件(因为每次请求进入都会读取它们,这会导致更大的开销)使用更多的资源,这在大型网站中很有意义。


0

可能有助于随着时间推移而增加内存的一件事是将httpd keepalive设置得较低,但是如果您的应用程序需要更长的生命周期,我会仔细测试。


0

该服务器在共享CPU上运行Solaris,而我正在使用Apache + MySQL + PHP堆栈。

我没有使用Solaris的经验,但是您能做的最好的事情就是不要使用Apache / mod_php。

  • 使用php-fastcgi切换到nginx。
  • 重新编译php以使用最少的插件。
  • 摆脱不必要的进程,例如ntpd(使用ntpdate),ftp(使用scp)等...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.