我目前正在使用Joyent加速器来托pipe我的web应用程序,而且工作正常,但是我需要降低成本,因此我要降级目前的计划,并强加一些新的内存限制(256M rss,512M swap)。 昨天我并没有太在意,但今天几次重启Apache之后,我现在是411M rss,721M swap(prstat -Z -s cpu)。
在服务器中search故障只给了我很多方法和特定的工具来监视服务器,但没有关于如何减less/优化内存使用的build议。 我也看到了这个问题 ,但是我不认为这对于这个特殊的(或者我可以说通用的)情况是有好处的。
服务器在共享CPU上运行Solaris,并使用Apache + MySQL + PHP堆栈。
我有兴趣知道可以采取的步骤来解决这个问题。 然而,我也没有时间来减less我的记忆足迹,并降低计划在目前的结束之前,所以任何可以使魔术和节省一天,以及:)
感谢大家的答复! 遵循你的build议,我已经能够减less我的内存使用量到195M的SWAP和108M的RSS,而不接触我的代码(我一定会尽快优化它,但这应该是一个解决scheme,让我快速摆脱困境)。
以下是我所做的事情清单:
摆脱了VirtualHost条目中使用的通配符。 而不是*:80和*:443,我使用了我的服务器的真实IP。
改变了Apache的prefork MPM。 这些是我最终使用的值:
StartServers 1 MinSpareServers 1 MaxSpareServers 5 ServerLimit 16 MaxClients 16 MaxRequestsPerChild 0 ListenBacklog 100
这些绝不是神奇的数字。 我花了一些时间尝试不同的价值和组合,然后testing他们对我的服务器的实际使用情况,每个人都应该在他们的环境中做同样的事情。 为了logging,我的服务器接收到接近200万的pvs / month,以常规的速度提供dynamic页面和资产 – 没有digg效果。 其目的是减less内存占用,而不是提高性能或HA。
参考:
调低了Apache的KeepAlive。 通过将KeepAliveTimeout
设置为一个较小的值(在我的情况下为2),我可以期待更less的服务器进程等待与可能不需要更多内容的空闲客户端的连接。
参考: http : //httpd.apache.org/docs/2.0/mod/core.html#keepalivetimeout
删除了MySQL的未使用的模块。 我在MySQL的my.cnf中添加了skip-innodb
。 大量的内存消耗减less。
还有一些我不能亲自做的非常好的build议:
我发现这篇文章是关于Apache和MySQL的低内存configuration的
对于布局低configuration所需的configuration更改非常有用。 我调整了他们为我自己的情况,但他们应该给你find最适合你的环境所需的工具
你将需要限制有多lessApache服务器进程正在运行,并且尽可能接近极限,你将无法处理非常高的stream量。 有一个Web服务器,在正常使用情况下超出一般是一个坏主意(tm),因为networkingstream量是好的,大部分低,直到你slashdotted或挖或fireballed或任何其他。
主要的问题是在任何一点运行的apache进程的数量 – 假设这里prefork,因为我只部署了PHP应用程序和PHP不是线程安全的。 我没有经验来衡量工人MPM的经验。 有一些项目在共享内存中,还有一些项目在每个进程的内存中。
您可以通过省去不需要的共享模块来减less内存总占用空间。 基本上,Apache来自大多数主机configuration,几乎在阳光下做的一切。 如果你不使用mod_userdir,那么将其注释掉你的apacheconfiguration。 只要小心删除多less,因为你可能需要的一些东西或者他们的依赖不是直观的! 所有的模块都应该logging在apache.org网站上。 每个进程的足迹越来越小, 大多数apacheconfiguration这些天只有四个必要的模块编译。除了这四个模块,大部分的内存使用来自泄漏或应用程序RAM不是垃圾收集有效,这就是为什么你可能要设置的请求数量由每个过程处理低。
你真的想保持你自己的内存使用,而不是交换。 交换意味着I / O。 I / O速度很慢,并且会在进程阻塞的同时驱动您的CPU使用率,同时等待某些内容从交换中移出。
对于Apache,删除你不使用的模块,因为他们只是使用额外的内存。 对于MySQL,删除innodb / bbdb,如果你不使用它们,并删除你不需要的PHP模块。
接下来,您应该根据一个进程的大小以及想要给apache的内存量来configurationapache MaxClients。 MySQL的最大连接也是一样的(我推荐使用优秀的MySQL Tuning Primer Script。
如果你能控制你的PHP应用程序,确保它没有使用太多的内存(例如在variables中,尤其是静态的)。
如果你想进一步,你可以用nginx + fcgi setup来replaceapache + mod_php,这可能会导致进一步的内存减less。
最后一件事 – 你真的不想交换一个Web服务器。 只是一点点,要删除不需要的东西,但经常在Web服务器上交换将导致一个无响应的网站。
既然你已经达到你的目标,这里有一些额外的:
既然你删除了所有不必要的php模块,你可以对apache也一样。 默认情况下(取决于你的安装)apache加载了一堆额外的模块,其中大多数模块并不是真正需要日常使用的。 例如,总是加载一堆authentication模块。 通常不需要放气,除非您试图限制您的带宽使用。 自动索引和状态也是有问题的。
另一个是你可以限制在php.ini中可用的内存量:memory_limit = xxxM
你当然可以限制apache可以分叉的进程的数量,但是这只能作为你的内存使用的sudo-hard限制。 从较低的angular度来看,您可以使用plimit来限制进程可用的资源。 把它应用到inheritance我相信的父进程和subprocess。
然而,从Web服务器configuration的angular度来看,它可以归结为你的代码如何运行! 但要记住,像使用.htaccess文件这样的小型文件比使用中央apacheconfiguration文件占用更多的资源(因为每次请求进来时都会读取这些文件,导致更大的开销),这在大型网站中是有意义的。
有一件事可能会有助于内存的增长,因为设置httpd Keepalive会降低,但是我会仔细testing,以防您的应用程序需要更长时间的进程。
服务器在共享CPU上运行Solaris,并使用Apache + MySQL + PHP堆栈。
我没有Solaris的经验,但是你可以做的最好的事情是不使用Apache / mod_php。
你可以考虑转移到SQLite而不是MySQL。 SQLite将有更less的开销,并且configuration更容易运行在更小的空间中。