我有一个 Drupal 网站,在发布时可能会获得非常高的点击率。我们为首次发布租用了一台非常强大的服务器,之后我们会缩减规模。该服务器配备了 Xeon E5-2670 8 核处理器 @ 2.6ghz 和 30gb RAM。
MySQL 已被分配了大量的内存,并且我已经通过“top”确认 MySQL 确实正在使用这些内存:
innodb_buffer_pool_size = 15G
PHP 被赋予了大量的内存(几乎可以肯定是太多了,因为我注意到注释上说的是“每个脚本”):
memory_limit = 6000M
Apache 配置是开箱即用的默认配置:
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
我一直在运行 JMeter 测试(基本上是“在网站上投入尽可能多的线程并尽可能快地请求页面”)并且我可以看到随着并发用户数量的增加,性能下降:
- 5 个用户:平均响应时间约 1 秒
- 10 个用户:平均响应时间约 1.3 秒
- 20 位用户:平均响应时间约 2.5 秒
但是,机器上的负载仍然很低。在测试期间,“top”报告有 26gb 的可用内存,“uptime”的平均负载不超过 0.63。我怀疑我们仍然有很多资源可以投入到性能中,但 Apache 并没有充分利用这些资源。话虽如此,我是一名开发人员,而不是系统管理员,我也不是服务器性能方面的专家。
我可以做哪些最好的改进来提高性能?
答案1
Drupal 解答可能更适合这个问题,但这里有几点需要注意:
- 尽可能在 Drupal 和服务器上使用缓存。
- 如果你的大部分流量都是匿名的,请考虑使用反向代理,例如漆。有一个模块它可以帮助 Drupal 更好地利用 Varnish。如果您决定实施 Varnish,请使用它。
- 考虑使用类似内存缓存也一样。
- 如果你的 Drupal 网站是用 Drupal 6 构建的,那么可以考虑将你的原始 Drupal 代码转换为Pressflow Drupal网站(很简单)。Pressflow 包含许多性能优化(但如果您运行的是 Drupal 7,那么这一点就毫无意义了)。
现在对于 Apache....不要使用现成的 Apache 配置。您需要根据站点调整 Apache。假设您正在使用mod_prefork
(我认为这很有可能,但只有您才能确定)以下是完成此操作的基本方法,但您确实应该聘请知道自己在做什么的人。
- 确定您希望 Apache 能够使用的最大内存量。
- 大量测试您的网站,并确定每个 Apache 进程使用了多少内存(使用
top
)。 - 取出顶部使用最多内存的 Apache 进程,向其添加一点点以获得更好的效果,然后用您的第一个数字(您希望 Apache 使用的最大内存量)除以这个新数字。
- 您得到的数字应该是您的
MaxClients
&ServerLimit
变量。
这当然不是最终答案。调整服务器需要时间,并且需要经验才能做到恰到好处。祝你好运。
答案2
如果您的大多数用户都是匿名用户,那么有一些模块(Boost、Varnish 等)可以帮助您提升性能。但是,如果用户在您的网站上创建个人资料并登录,它们对您帮助不大。
这是我为 Drupal 设置服务器的方式:
- 禁用更新管理器模块。它会减慢您的网站速度。
- 我已经用 Nginx 和 phpfpm 替换了 Apache。您可能需要自己设置和配置。尽管我没有做过任何“正式”的基准测试,但我的印象是 Nginx + phpfpm 处理请求的速度更快。这是一个配置适用于 Nginx 和 Drupal。
- 优化 MySQL 和 InnoDB 表。请参阅MySQL 性能博客。
可能还有很多小的改进可以使事情更进一步,但我认为这至少可以作为一个起点。
答案3
使用缓存工具(如 memcache)缓存所有静态页面、常用页面、菜单和超链接。Drupal 的问题在于每次加载页面时都会进行大量数据库访问,并且会完全重新加载每个页面。