什么都导致Drupal页面执行时间?


17

我正在调查一个存在主要性能问题的站点,使用内存缓存可以将查询数量和总执行时间(从3秒降低到230毫秒)都减少了,但是页面执行时间使我望而却步(我是查看由devel输出的值),我的理解是页面执行时间= php执行所花费的时间,因此我安装了APC,并且可以看到php opcode被缓存,并且统计信息显示APC控制面板中的命中(APC附带的apc.php),但是我的页面执行时间不会减少。所以我认为我的问题有两个:

  • 什么都有助于(更好地减慢)页面执行时间?是只是花时间执行php吗?
  • 我应该采取什么方法来缩短页面执行时间。我尝试过APC,但没有太大帮助

该站点上使用的PS模块数量非常庞大(168),但现在我无法提出建议,它更像是在洞口情况下的大火。

编辑:在本地实例上运行xhprof的输出(由mikeytown推荐),这似乎很疯狂,我认为以后的结果是由于重击?相同网址的diff运行差异很大,而且资源使用过多。也不确定为什么显示的不是今天的值:| (我刚刚在此笔记本电脑上安装了xhprof)

在本地实例上运行xhprof的输出

Answers:


4

获取您网站的缓存。xdebugxhprof可以生成一个。这将告诉您哪些函数运行时间最长。在执行此操作之前,这是一个糟糕的猜测游戏。


嘿,感谢我只是跑XHProf的我本地开发版本(笔记本电脑不在服务器上),并建议我看到这一点- picasaweb.google.com/lh/photo/... 这是真的吗?我的意思是说一个页面甚至有可能消耗750Mb的内存?
Dipen

可能是因为ing撞?如果您查看底部的相同URL,则稍后对相同URL进行概要分析的数据将占用更少的资源,但差异运行显示完全差异和极端的资源利用率。
Dipen

1
这确实取决于您,但是对于99.9%的设置,如果您使用了超过100MB的内存,那是错误的。
mikeytown2 2011年

除了模块数量以外,还有其他问题吗?我不确定模块是否可以立即从生产中删除。顺便说一句,在本地,我正在使用nginx + php-fpm,在生产环境中,该站点正在使用带有快速cgi的lighspeed。
Dipen

1
您需要深入研究cachegrind并列出所有时间都在消耗什么功能。img715.imageshack.us/i/cgrindout.png
mikeytown2 2011年

1

编辑:我看错了原始帖子。168个模块很多,并且300到700ms的SQL查询非常庞大。您将使用的模块越多,一旦模块执行了一些查询,它们就会越多。

尽可能使用积极的缓存,对所有内容进行缓存,如果还不够,请尝试反向代理缓存。对文件使用CDN可以大大改善整个情况。反向代理缓存还可以通过在访问不需要缓存的页面时删除一些身份验证cookie来帮助您(然后核心将认为用户对此是匿名的,从而最大限度地增加了缓存)。


一旦有太多模块同时交互,Drupal的核心动力就会使整个黎明变得缓慢。

例如,如果您使用很多在hook_node_load()时加载数据的模块而不是使用字段,则它将进行大量查询,而字段的使用将确保缓存效率。

渲染也要花费很多时间,drupal_render()(有时会调用渲染API)是不错的API(确实有用),但是有点慢。切换到PDO(D7)和完整的DBTNG(顺便说一句很棒)也增加了不可忽略的延迟。

就是说,内核本身就非常快(但是即使没有安装任何工具,它也执行太多的SQL查询),编码不良的模块通常是瓶颈。

根据运行的代码,APC可以将执行时间划分为2或3。如果配置正确(启用所有APC优化,则APC官方手册会写得很好,并会为您提供指导)。

如果您的文件系统(网络文件系统或硬盘驱动器)速度较慢,则可能会对执行时间产生明显影响。Drupal由许多小文件组成,这迫使PHP在每次加载FS时在FS上执行I / O(APC对此也有很大帮助)。

错误配置的DBMS也可能是一个很丑的瓶颈,如果您使用MySQL,请考虑进行微调。如果您在共享主机上,如果它不是特定于Drupal的(或尚未准备好的),则DBMS和PHP堆栈可能配置错误或未调整,这可能会导致站点运行缓慢。

不要忘记激活所有缓存。如果您的网站不是面向用户的经过身份验证的网站,请激活激进的页面缓存(这确实很棒)。

如果您不限制其可见性,则拥有的块越多,整页的速度就越慢,Views的模块块将成为曙光瓶颈(取决于您使用的Views插件,OG的块可能是一个真正的难题) (基于每页)或使用自定义PHP代码(任何其他块,也始终手动设置块可见性,可以避免尝试渲染空块,从而极大地帮助了框架)。

避免使用使用hook_init()的模块,即使在页面上运行hook_init(),即使您得到403或404,这也会减慢所有速度(甚至会减慢imagecache | style的生成时间,并且文件上的404错误会只是为了告诉您文件不存在而使曙光缓慢)。


嗨,在这里,当我说页面执行时间时,我指的是页面底部devel模块显示的值,而不是在一般的drupal请求/响应周期(包括SQL查询等)意义上使用它。我的问题是在经过身份验证的用户的上下文中。那么,当devel报告页面执行时间时,它还包括sql查询吗?
Dipen

我不确定文件系统是否会像我在15k RPM linux文件系统上那样成为瓶颈。SQL查询大约需要300-700ms,具体取决于页面,但是页面执行时间约为3秒(由devel报告)。不知道还有什么可能是问题。
Dipen

抱歉,我看错了您的原始帖子。Devel的值是从启动到关机为止计算的(devel模块具有自己的PHP关闭处理程序,可用于执行许多操作)。我不确定启动和停止的确切时间,但是该页面的执行时间几乎包括了整个Drupal页面的构建时间和业务细节。是的,它包括所有内容(包括SQL查询时间和延迟),以及它自己的延迟(开发查询日志记录也会影响性能)。
Pierre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.