`
hanssonlan
  • 浏览: 13644 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

PHP沉思录之六:Drupal的性能问题

    博客分类:
  • php
阅读更多
        Drupal是一个基于PHP的开源CMS系统,也是我认为技术上实现得最好的一个PHP应用。Drupal的架构非常优秀,通过微内核+plugin的方式,实现了极佳的扩展性,从而使Drupal远远超出一般的CMS这一范畴。从这个意义上来说,把Drupal称为Web OS似乎更加合适一些。关于Drupal,有太多的话可以说,也许我会在以后的时间里写一篇文章对它进行专门的讨论。但是在本文中,我想讨论的,是 Drupal社区中的每一个人都会面对,但不是每一个人都对其有清晰认识的问题,即Drupal的性能问题。

        因为客户需求,我曾经对Drupal做过比较全面的测试。当时的环境是双服务器(DB server+Web Server),硬件配置都是单CPU+4G。数据库里面有几千条Node记录。用JMeter对各种情况下(开/关各种cache模块,logged user/anonymous user)不同页面的读取和写入操作都进行过测试。

        测试的结果可能和很多人印象中不一样。两个主要的结果如下:

    1. Logged user和anonymous user的性能差距非常大。同一个页面,logged user的RPS(Requests per second)一般不超过20,而启用了cache的anonymous user的RPS在100多,当使用了file-based cache以后,甚至能超过300。

    2. 数据库压力相对较小。由于Drupal把大量可配置的内容都放在数据库中,因此往往容易产生这样一种印象,即Drupal对数据库要求应该是很高的。但事实上,无论是cache还是非cache模式,DB server的压力都相当小(CPU在10%以下),而Web Server的CPU在80%以上。跟踪所有的db query的执行时间后,也证明了这一点(全部db query的执行时间只占页面生成时间的一小部分)。

        经过反复的测试和思考,我得出了一些结论。很明显,Drupal在大量logged user并发情况下的瓶颈,在于执行Drupal代码的CPU时间,而不是在于数据库或者其他地方。之所以出现这样的情况,和PHP本身的执行机制和 Drupal的实现方式有关。Drupal在生成一个非cached的页面时,不管这个页面多么简单,都要执行一个完整的bootstrap过程,即使只启用了最少的模块,这个过程也要调用几十个PHP文件,执行成千上万行PHP代码。而PHP的机制又决定了没有任何PHP代码或者对象能够驻留内存,每次响应请求都必须执行完整的初始化工作。而anonymous user之所以快,是因为Drupal在执行cached page的时候,不会执行完整的bootstrap过程,它先检查是否cached page,是的话就读取缓存,然后结束工作。这样当然就快了。
以这个结论为前提,可以解释一些事情:

    1. 为什么Drupal的性能在各种环境下相差并不多。无论是双服务器,单服务器,甚至内存非常小的虚拟机,logged user的RPS值往往总是在10~20之间。数据库里面有几百条,或者几十万条记录,影响也不大。因为瓶颈并不在于DB或者内存,而是在于执行代码的过程。

    2. 为什么使用APC/XCache这样的代码优化程序,能够得到极大的性能提升。在我自己的虚拟机环境上,RPS从3~4提升到了12。因为它提升的是PHP代码的执行时间。

        从这个结论出发,列出一些对优化Drupal的logged user性能有明显作用和没有明显作用的措施:

I. 没有明显作用的:
    1. 加内存。在并发数只有10+的时候,即使每个请求占20M内存,也只有200M+内存而已。
    2. DB server和Web server分开,或者增强DB server的配置。一台中等性能的mysql服务器,应付200~300的并发是很轻松的事情,在并发数只有10+的时候,db server实际上是很空闲的。
    3. 基础软件的优化,例如从Windows转移到Linux,从apache转移到Lighttpd,从MySQL迁移到其他数据库,除了从Windows转移到 Linux会有比较明显的提升以外(因为PHP在Linux上的效率比在Windows上要好),其它的措施可能会快一些,但不会有大幅度的提高,因为瓶颈不在那里。

II. 有明显作用的:

    1. 使用APC/XCache这样的代码优化程序,速度会有几倍的提升。估计大家都已经这样做过了。
    2. 增加web server的CPU数量。双核的肯定比单核的快,4个CPU肯定比2个CPU快得多。
    3. 使用多web server+单db server的配置,把代码执行的压力分散到不同的web server上。上文说到,单台db server可以轻松应付200+的并发,这意味着理论上可以支持10台以上的web server。
    4. 使用Quercus这样的引擎,把PHP代码编译成Java,再在Java VM中运行,理论上会有很大的提高。原因是,第一,Java的运行效率比PHP高,第二,Java代码是可以cache的,不需要每次都重新加载。这里有个测试结果:http://www.workhabit.org/resin-backed-php-drives-4x-performance-improvements-drupal 。Drupal在Quercus下有4倍的性能提高,但是这个数字跟Drupal在打开APC/eAccelerator下的提升差不多,所以可能没有太大的实用价值。

另外一种思路是代码本身的优化。
        使用cache API基本上是没有意义的,因为对于logger user,Drupal不会调用cache API。Drupal.org上有人提出,即使是logged user,有很多页面也是不用定制化的,这意味着可以cache它们。但是Drupal没有提供这样一种机制。只要是logged user,Drupal就会执行完整的bootstrap过程,即使只打印出一个hello world,因此实际上你没有办法在logged user状态下cache单个页面。

        到目前最新版本的Drupal(Drupal 6.4)为止,对于logger user,Drupal只提供了一种cache功能,就是可以将部分block设置为可cache的。在block占用大量服务器时间的情况下,block cache能够有效地提高效率。但是,由于block cache对于bootstrap过程并无影响,因此当瓶颈在于bootstrap本身时,Block cache是无能为力的。
        在Drupal.org的社区,关于logger user的cache问题,一直处于热烈的讨论之中。基本的结论是,由于Drupal的架构就是这样,目前没有很好的解决方案,只能期待Drupal在以后的版本中进行改进了。

        我研究了一下Drupal的bootstrap过程,发现也许这样是可行的:实现hook_boot函数,这是bootstrap中执行最靠前的一个函数,它被调用时,bootstrap的大部分过程还没有执行。在hook_boot中,检查当前页面是否需要cache,如果是,直接读 cache生成页面,然后调用exit()强行结束。这在理论上是可行的,但太过hack了一点。
Drupal的情况是这样,那么其他的PHP框架,尤其是半官方的Zend Framework,性能如何呢?通过搜索,我在网上找到了一份PHP framework comparison benchmarks,网址见:http://www.avnetlabs.com/php/php-framework-comparison-benchmarks。根据这份报告的数据,Zend Framework的性能只有原生PHP的10%,如果没有用APC,连3%都不到。当然,这份报告的数据不一定详尽,Zend Framework在不同环境下的表现应该也会有出入。但是,Zend Framework的性能大幅度落后于Baseline PHP,应该是确凿无疑的。

        为什么PHP主流框架的性能都存在着这样的问题呢?其实这也不难理解。回顾PHP沉思录系列第一篇中对于PHP工作模型的讨论,由于PHP没有驻留内存的进程,所以每一个request发生时,都必须初始化所有的对象,这导致大量的时间被耗费在进程代码的执行过程中。当PHP程序仅仅是简单的脚本时,这无关紧要,但是在结构复杂的架构中,由于每次处理request都要重复调用成千上万行代码,这一问题就变得非常突出了。而且,除非PHP以后的版本对这一机制进行改进,否则这个问题无法得到彻底的解决。

        那么,这是否意味着,PHP只能适用于小型的网站,而无法在高并发量的大型网站施展拳脚呢?当然不是这样。事实上,在Yahoo和其他许多知名的巨型网站上,都大量地使用了PHP。原因在于,PHP仅仅被用作一个内容生成器,生成的内容会被转化为静态文本,绝大多数用户浏览的都是被cache的静态文本。这就和PHP程序的性能毫无关系了。但是,当用户并不是仅仅进行浏览,而是需要频繁地和网站进行互动时,PHP的性能不但无法比拟C和Java,甚至无法与同为脚本语言的Python和Ruby相比。也就是说,PHP更适合于新闻门户这样的内容发布站点,而不是web 2.0应用的首选。

        在本系列文章告一段落的时候,我们看到的是PHP的局限性。热爱PHP的人们可能会对此觉得沮丧。但是,这并无损于PHP作为一门优秀语言的声誉。尺有所短,寸有所长,对于我们熟悉和喜爱的工具,我们更应该了解它们的局限,这也有利于我们更有效地使用它们。
分享到:
评论

相关推荐

    drupal7与drupal6版本修改内容

    3. **PHP 最小版本要求提升**:Drupal 7 要求 PHP 5.2 作为最低版本要求,相比 Drupal 6 的 PHP 5.0,这是一个显著的进步,这意味着 Drupal 7 能够利用 PHP 5.2 中的新特性来提升性能和安全性。 #### 配置层面的...

    drupal-7.23安装包

    10. **性能优化**:Drupal 7.23 可以通过缓存、页面压缩、数据库查询优化等方式提高性能。还可以使用像 Varnish 或 Memcached 这样的外部缓存解决方案,以及 Drupal 模块如 Boost 或 Page Cache 来进一步加速网站。 ...

    PHP实例开发源码—Drupal 开源的php内容管理.zip

    4. **模块化**:Drupal 的强大之处在于其模块化系统。模块可以添加新的功能,如论坛、博客、电子商务等。"使用须知.txt"可能包含如何安装、启用和配置这些模块的指导。 5. **数据库交互**:Drupal 使用 SQL 查询与...

    drupal建站CMS系统源码

    Drupal,作为一个开源的内容管理系统(CMS),是全球许多网站构建者的选择。Drupal以其强大的功能、高度的灵活性和可扩展性著称。在这个“drupal建站CMS系统源码”压缩包中,包含的是Drupal 8.2.6版本的源代码,这是...

    PHP实例开发源码—Drupal PHP内容管理系统 v7.zip

    Drupal 7是Drupal的第六个主要版本,发布于2011年,它在功能和性能上都有显著提升。以下是一些关键的知识点: 1. **模块化设计**:Drupal的核心特性之一就是其模块化架构。每个功能通常被封装为一个模块,可以方便...

    PHP实例开发源码—Drupal PHP内容管理系统 v8.9.13.zip

    Drupal是世界上最受欢迎的内容管理系统(CMS)之一,尤其在企业级应用和复杂网站构建中颇为常见。这个名为"PHP实例开发源码—Drupal PHP内容管理系统 v8.9.13.zip"的压缩包文件包含了Drupal 8.9.13版本的源代码,这...

    PHP实例开发源码-php 内容管理系统 Drupal.zip

    7. **社区支持**:Drupal拥有庞大的开发者社区,提供了大量的文档、教程和论坛讨论,帮助开发者解决问题和分享经验。 在解压“PHP实例开发源码-php 内容管理系统 Drupal.zip”后,你可以看到Drupal的目录结构,包括...

    drupal 7 中文版

    这个版本,7.38,是Drupal 7系列的一个稳定更新,旨在增强用户体验,提高系统性能,并修复已知的安全问题。 Drupal 7 是 Drupal 的一个里程碑版本,于2011年发布,引入了许多新功能和改进。以下是一些关于Drupal 7...

    drupal-9.0.1_drupal9_drupal9教程_drupal9开发实例_

    Drupal 9.0.1是Drupal内容管理系统的一个重要版本,带来了许多新特性和改进,旨在提升网站构建者的体验和网站的性能。Drupal是一款开源的PHP框架,被广泛用于创建复杂、可扩展的Web应用程序和网站。这个9.0.1版本的...

    基于PHP的Drupal PHP内容管理系统.zip

    8. **社区支持**:Drupal拥有庞大的开发者社区,提供丰富的文档、教程和问答资源,为学习和解决问题提供了强大支持。 在"基于PHP的Drupal PHP内容管理系统.zip"这个压缩包中,可能包含了用于快速启动Drupal项目的...

    基于PHP的内容管理系统Drupal源码.zip

    2. **学习钩子系统**:Drupal的钩子机制是其核心扩展方式之一,通过观察和分析不同钩子的实现,可以理解模块间如何协作。 3. **探索模块开发**:通过阅读和修改现有的模块源码,可以学习如何创建新的模块,添加...

    drupal-7.x版本

    Drupal是世界上最受欢迎的内容管理系统之一,尤其在企业级网站和复杂Web应用中被广泛采用。"Drupal-7.x"是Drupal的第七个主要版本,它带来了许多改进和新特性,旨在提升用户体验、开发者效率以及网站的可扩展性。在...

    基于PHP的Drupal PHP内容管理系统 v7.zip

    9. **社区支持**:Drupal有一个庞大的全球社区,提供各种资源、教程、插件和解决问题的支持,这使得Drupal成为一个持续发展的项目。 10. **响应式设计**:随着移动设备的普及,Drupal 7开始支持响应式设计,使网站...

    Drupal data Drupal data

    Drupal的核心功能之一是存储和管理内容,这些内容通常保存在MySQL数据库中。MySQL是一种广泛使用的开源关系型数据库管理系统,它为Drupal提供了稳定、高效的数据存储解决方案。 1. **Drupal 数据结构**:在Drupal中...

    Drupal教程

    2. 下载Drupal:从官方网站下载最新稳定版的Drupal核心文件。 3. 解压并上传:将下载的Drupal压缩包解压后,将文件上传至Web服务器的根目录。 4. 数据库设置:在浏览器中访问Drupal的安装页面,按照提示输入数据库...

    drupal7.x-dev

    8. **性能和可扩展性**:Drupal 针对大型和高流量网站进行了优化,可以通过缓存策略、CDN 集成和其他性能增强技术提高网站速度。 9. **安全性**:Drupal 社区非常重视安全性,会定期发布安全更新以修补已知漏洞。...

    drupal的例子可以看看

    7. **性能优化**:Drupal性能优化是重要一环,包括缓存策略、数据库查询优化等。示例可能包含最佳实践和配置调整。 通过研究这些示例,开发者不仅可以学习到Drupal的基本用法,还能了解到如何根据项目需求进行定制...

    DRUPAL功能说明

    Drupal 是一个开源的内容管理系统(CMS),它以其模块化架构而著名,这使得用户可以根据需求轻松扩展和自定义网站功能。Drupal 的核心功能包括内容管理、用户管理、站点配置和日志记录,这些功能由一系列内置的模块...

    drupal-7.38.tar

    这个版本修复了一些已知的安全问题,确保了网站的安全运行,同时也包含了对用户体验和性能的优化。Drupal 7 的核心特性包括: 1. **内容管理**:Drupal 允许用户轻松创建、编辑和管理网页内容,支持多种内容类型如...

Global site tag (gtag.js) - Google Analytics