我正在尝试提高负载下的 Drupal (6) 安装的性能。一台 Web 服务器、一台数据库服务器 (MySQL5) 都是单插槽四核 Intel Xeon 2.5GHz 处理器,配备 16GB RAM。在 Web 服务器上,我运行 APC 来提高 PHP 的性能。在数据库服务器上运行一个带有 6 个 bin 的 memcached 服务器。使用 Apache Solr 来增强搜索,Solr 也存在于数据库服务器上。
瓶颈似乎是 Web 服务器上的 Apache,因为它在负载下内存不足。似乎没有一个进程占用过多的可用系统资源。
任何意见都将不胜感激。如果您对设置有任何疑问,请随时提问。
谢谢你!
答案1
由于我们讨论的是 PHP,我假设你正在使用 Apache prefork MPM。鉴于Rasmus Lerdorf 对多线程的态度,您应该继续使用 Apache prefork 或类似的非线程设置与另一个 HTTP 服务器(例如 nginx)。
我想到 4 个快速胜利。我无法从 OP 的原始问题判断这是否已经完成——如果没有,这 4 个改进应该会带来实质性的改进。
a) 移走静态文件服务(CSS、图像等)来自您的 PHP Apache 实例。使用 Prefork MPM,当您向用户发送单个图像时,整个 Apache 子进程和完整的 PHP 运行时都会占用该单个图像。当用户下载该图像时,20-40 MB 的 Apache 进程可能会占用 0.1 到 3 秒的时间——与此同时,Apache 实例可能已经为数十或数百个动态页面提供服务。建议:为静态资源设置专用服务器,或使用廉价的 CDN(如 Amazon CloudFront)。
b) 关闭 HTTP keepalive为提供动态 (Drupal) 内容的 Apache 实例提供服务。HTTP keepalive 很棒,而且有其用途,但同样,在 keepalives 开启和 Apache prefork MPM 的情况下,单个最终用户浏览器将长时间保持“阻塞”(即占用)Apache 子进程。
c) 验证您是否发送了正确的 HTTP 标头,尤其是图像、CSS 等静态内容是可缓存的。否则,用户的浏览器将在每次浏览页面时重新下载这些静态内容,这完全是一种浪费。使用雅虎慢速,马克·诺丁汉的 RED或类似工具。
d) 设置另一个 Web 服务器,只需使用普通的DNS 循环在两个 Web 服务器之间分配负载。我假设 Drupal 可以将会话状态存储在 MySQL 数据库中(大多数 PHP 应用程序都可以)?如果是这样,那么会话存储就得到了处理,您可以使用 DNS 轮询。
DNS 轮询并不理想。它无法处理服务器故障,也无法保证完美的负载分配。但它很容易设置,并且通常对于具有 2 个或 3 个 Web 服务器的简单设置来说已经足够好了。
答案2
您可以设置 nginx 或 lighttpd 来在 apache 服务器前面提供静态文件(css/js/images/videos)。
另一种技术是静态页面缓存。我认为升压模块可以做类似的事情。或者,如果您有时间和资源,可以创建自己的 drupal 模块来生成静态 html 文件,而不是 php 动态页面。
答案3
你有没有尝试过压力流它是经过一些性能和可扩展性调整的 Drupal。
答案4
放弃 Apache 而选择 nginx 之类更轻量级的程序?