为什么Drupal运行缓慢?

8
我在Drupal上建立了一个网站,有7500个用户,大约有20到50个未登录用户和2到10个已登录用户在线(我认为这不算重负载)。该网站位于专用服务器上。我在Drupal管理界面中启用了性能设置,并安装了Memcache和Eaccelerator。我使用Devel模块查看查询日志,发现每个页面总共会触发600到900次查询。当我安装了path.inc的补丁以减少drupal_look_path()的查询时,查询数量减少到了约400次。我还对mysql(my.cnf)文件进行了一些积极的更改,但仍然有许多相同的查询在user_load()函数中反复运行。我启用了60到70个模块,它们都很有用,我不能移除这些模块。尽管如此,网站仍然运行缓慢,需要大约10到15秒的时间。现在我不知道为什么网站运行如此缓慢。请问:
  • 是因为Drupal有大量的PHP代码吗?
  • 是因为每个页面都会触发如此多的查询吗?
  • InnoDB引擎是否可以提高性能?
请给出任何建议,谢谢。

1
有一个叫做YSlow的Firefox扩展程序,或许你可以使用它来查看为什么你的网站运行缓慢。 - AllisonC
6
这个问题在http://drupal.stackexchange.com/上会得到更好的答案。 - Konerak
1
这是一个D6还是D7网站?你在问题上都打了这两个标签。 - mpdonadio
5个回答

9

每个请求400个查询是自杀行为(即使是50+)。

您应该实现一些HTML缓存器。我的网站通常甚至不需要进行数据库连接。它只需在文件中启用已缓存的HTML。


400个查询听起来很疯狂,我想不出任何一个网站为什么要进行400个查询。我赞同这个建议,这是一个很好的建议。 - Michael J.V.
1
400个查询?自杀吗,更像是在自己身上投下原子弹。 - John Cartwright
4
我们正在谈论Drupal,可能使用了大量的贡献模块。使用许多模块的大型CMS的一个缺点是,代码库的各个部分可能无法良好地协同工作并多次重新加载相同的信息。此外,静态HTML缓存对于经过身份验证的用户无效,但肯定可以为匿名用户提供提高性能的方式。 - Berdir
@berdir:那不完全正确。最近我甚至为注册用户始终使用缓存的HTML,然后通过Ajax将与用户相关的HTML注入页面。 - dynamic
3
在Drupal中解决这个问题并不是一个简单的任务。因为ajax请求无法帮助,它们可能也很慢(在Drupal中进行常规页面引导,因此这些查询中许多可能被执行)。 - Berdir
显示剩余5条评论

6

以下是需要注意的一些问题:

  • 安装像Yslow/PageSpeed这样的工具,查看10-15秒钟中客户端和服务器时间所占的比例。

  • 安装XhProf(在开发站点上,而不是在实际运行的站点上),再加上Devel模块,查看哪些函数使用了最多的时间。首先解决这些问题。编辑:现在提供链接:http://groups.drupal.org/node/82889

  • 使用Pressflow可能有所帮助,但由于您已经使用了path.inc补丁,所以可能帮助不大。

  • 您提到安装了memcache。您是否还安装了memcache模块,并配置了缓存插件以使用memcache?

  • 编辑:是的,切换到InnoDB可能会有所帮助。 InnoDB的主要性能优势之一是行级锁定(而不是MyISAM表级锁定),这意味着针对相同表格的多个INSERT / UPDATE查询仅在必要时才会互相阻塞。然而,InnoDB默认情况下表现得并不好,您确实需要针对特定网站调整mysql配置。因此,这是一个需要仔细考虑、在开发站点上进行测试和优化后才应采取的步骤。已经有关于InnoDB调整的各种问题在本网站和其他地方提出过...

除此之外,其他问题都是特定于网站并取决于您正在使用的模块。但尤其是像复杂的节点访问设置和多语言(i18n!)这样的事情往往会导致查询变慢和/或查询变得非常多。


对于xhprof加1,我建议Karan可以在这里发布图表,这可能是我们诊断问题的好方法。 - Jeremy French

1

并非所有模块都使用性能设置区域中可以开启的缓存机制。值得尝试确定哪些模块正在执行最慢的查询,并尝试让开发人员改进它们。

或者,检查是否可以通过减少模块数量来实现目标。某些模块在功能上有所重叠,因此您可能可以重新组织网站的功能方式。

此外,您需要查看MySQL设置是否允许足够的内存来执行这些查询。大多数MySQL发行版都带有不同版本的my.ini,标记为“small”、“medium”、“huge”等。将“huge”复制到my.ini(首先备份旧文件),然后重新启动DB以查看是否将所有缓存大小最大化会有所不同。您可能会遇到瓶颈,但很难确定哪个设置导致了问题。

对于PHP也是如此。在php.ini中将memory_limit设置为500MB或其他值,然后查看是否有所帮助。当然,根据您的托管安排,您可能无法执行此操作,但如果可以,它将消除一个可能的原因(或不是)。


0
面对自己的Drupal速度问题。但是我遇到的问题与其他人提到的问题非常不同。
我禁用了所有内容,包括Drupal页面的特定内容类型的Drupal头部。
尽管如此,加载此页面所需的时间仍超过20秒!
我借助YSlow和NET Firebug面板寻求帮助。
在查看它们时,注意到以下情况:
JS和CSS文件的单独包含需要3至2秒的时间,并且有相当多的包含发生,因此需要大约20秒的时间。
但是我无法弄清楚为什么JS和CSS的包含需要这么长时间。(这包括正常的Drupal核心JS和CSS文件)

0

您的Drupal网站的性能还取决于您的托管平台是否针对Drupal进行了良好的调整。Drupal需要对LAMP堆栈组件进行特殊优化。您可以尝试使用专门面向Drupal的托管公司http://www.drupalspecific.com以使您的网站运行更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接