改进服务器configuration

我正在尝试在负载下提高Drupal(6)安装的性能。 一个Web服务器,一个数据库服务器(MySQL5)都是单插槽四核英特尔至强2.5GHz,16GB内存。 在Web服务器上,我正在运行APC来提高PHP的性能。 在数据库服务器上运行带有6个分箱的memcached服务器。 使用Apache Solr进行search,Solr也位于数据库服务器上。

Web服务器上的瓶颈似乎是Apache,因为它在负载下耗尽内存。 没有任何一个进程似乎占用了太多可用的系统资源。

任何投入将不胜感激。 如果有问题,我可以回答有关设置,请问。

谢谢!

由于我们正在谈论PHP,我假设您使用Apache prefork MPM。 鉴于Rasmus Lerdorf对multithreading的态度 ,您应该继续使用Apache prefork或类似的非线程设置与另一个HTTP服务器(如nginx)。

想到4个快速胜利。 我不能从OP的原始问题中说这项工作是否已经完成 – 如果不是,这四项改进应该会带来实质性的改善。

a)将静态文件服务(CSS,图像等)从PHP Apache实例中移走 。 使用Prefork MPM时,当您向用户发送单个图像时,整个PHP运行时间的整个Apache孩子将被占用来发送单个图像。 当用户下载该映像时,这可能是一个20-40 MB的Apache进程,占用时间为0.1到3秒,同时Apache实例可能会服务数十或数百个dynamic页面。 build议:为静态资源设置一个专用服务器,或者使用像Amazon CloudFront这样便宜的CDN。

b)closures服务于dynamic(Drupal)内容的Apache实例的HTTP保持连接。 HTTP Keepalive非常棒,并且有其用处,但同样,在Apache Prefork MPM上保持活着,一个单一的最终用户浏览器将会长时间地“占用”Apache儿童。

c)validation你是否正在发送正确的HTTP头 ,特别是静态内容,如图像,CSS等是可caching的。 否则,用户的浏览器将在每个页面视图上重新下载这个静态内容,这完全是浪费。 使用Yahoo! YSlow , Mark Nottingham的RED或类似的工具。

d)设置另一个Web服务器 ,只需使用普通的DNS循环在两个Web服务器之间分配负载。 我认为Drupal可以保持会话状态存储在MySQL数据库(大多数PHP应用程序可以)? 如果是这样,那么会话存储是照顾,你可以使用DNS循环。

DNS循环是不理想的。 它不处理服务器的故障,它不能保证完美的负载分配。 但是它很容易设置,而且通常可以很好地运行2或3个Web服务器。

你可以设置nginx或者lighttpd来为apache服务器提供静态文件(css / js / images / videos)。

另一种技术是静态页面caching。 我认为升压模块可以做这样的事情。 或者如果你有时间和资源创build自己的drupal模块来生成静态html文件,而不是phpdynamic页面。

你有没有尝试pressflow它是Drupal的一些性能和可扩展性的调整。

抛开Apache来支持像nginx这样的更轻的东西?