亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP沉思錄-第六篇-Drupal的性能問題-左輕侯-《程序員》2008年11月號

2020-03-22 18:42:20
字體:
來源:轉載
供稿:網友
創建時間:2008-11-09 01:12:51 最后修改時間:2008-11-09 01:12:51

本文發表在《程序員》雜志2008年第11期

PHP沉思錄之六:Drupal的性能問題
左輕侯

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的壓力都相當?。–PU在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性能有明顯作用和沒有明顯作用的措施:

沒有明顯作用的:

1. 加內存。在并發數只有10+的時候,即使每個請求占20M內存,也只有200M+內存而已。
2. DB server和Web server分開,或者增強DB server的配置。一臺中等性能的mysql服務器,應付200~300的并發是很輕松的事情,在并發數只有10+的時候,db server實際上是很空閑的。
3. 基礎軟件的優化,例如從Windows轉移到Linux,從apache轉移到Lighttpd,從html' target='_blank'>MySQL遷移到其他數據庫,除了從Windows轉移到 Linux會有比較明顯的提升以外(因為PHP在Linux上的效率比在Windows上要好),其它的措施可能會快一些,但不會有大幅度的提高,因為瓶頸不在那里。

有明顯作用的:

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問題,一直處于熱烈的討論之中?;镜慕Y論是,由于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主流框架的性能都存在著這樣的問題呢?其實這也不難理解?;仡橮HP沉思錄系列第一篇中對于PHP工作模型的討論,由于PHP沒有駐留內存的進程,所以每一個request發生時,都必須初始化所有的對象,這導致大量的時間被耗費在進程代碼的執行過程中。當PHP程序僅僅是簡單的腳本時,這無關緊要,但是在結構復雜的架構中,由于每次處理request都要重復調用成千上萬行代碼,這一問題就變得非常突出了。而且,除非PHP以后的版本對這一機制進行改進,否則這個問題無法得到徹底的解決。
那么,這是否意味著,PHP只能適用于小型的網站,而無法在高并發量的大型網站施展拳腳呢?當然不是這樣。事實上,在Yahoo和其他許多知名的巨型網站上,都大量地使用了PHP。原因在于,PHP僅僅被用作一個內容生成器,生成的內容會被轉化為靜態文本,絕大多數用戶瀏覽的都是被cache的靜態文本。這就和PHP程序的性能毫無關系了。但是,當用戶并不是僅僅進行瀏覽,而是需要頻繁地和網站進行互動時,PHP的性能不但無法比擬C和Java,甚至無法與同為腳本語言的Python和Ruby相比。也就是說,PHP更適合于新聞門戶這樣的內容發布站點,而不是web 2.0應用的首選。
在本系列文章告一段落的時候,我們看到的是PHP的局限性。熱愛PHP的人們可能會對此覺得沮喪。但是,這并無損于PHP作為一門優秀語言的聲譽。尺有所短,寸有所長,對于我們熟悉和喜愛的工具,我們更應該了解它們的局限,這也有利于我們更有效地使用它們。

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品videossex88| 中文字幕久热精品视频在线| 亚洲精选在线观看| 亚洲精品欧美日韩专区| 日韩精品日韩在线观看| 国产日韩欧美在线视频观看| 日韩欧美国产免费播放| 欧美一级淫片播放口| 69av视频在线播放| 欧美激情xxxx| 国产精品视频yy9099| 亚洲欧美国产一区二区三区| 国产手机视频精品| 亚洲视频在线观看| 亚洲成人网久久久| 国自在线精品视频| 最近2019中文字幕第三页视频| 国产精品日韩欧美| 久久91精品国产91久久久| 亚洲精品美女久久久久| 中文字幕久热精品视频在线| 久久91精品国产91久久久| 午夜伦理精品一区| 欧美黄色三级网站| 欧美小视频在线观看| 91在线精品播放| 一本色道久久88综合日韩精品| 国产日韩欧美中文| 亚洲国产日韩欧美综合久久| 色青青草原桃花久久综合| 成人黄色在线播放| 日韩在线播放视频| 成人动漫网站在线观看| 亚洲欧美日韩国产中文| 影音先锋日韩有码| 亚洲毛片在线观看| 久久久999精品免费| 国产精品久久二区| 2021国产精品视频| 久久av资源网站| 国产亚洲日本欧美韩国| 精品国产区一区二区三区在线观看| 一本久久综合亚洲鲁鲁| 亚洲a中文字幕| 国产精品专区h在线观看| 欧美不卡视频一区发布| 91av福利视频| 国产视频精品自拍| 国产伦精品一区二区三区精品视频| 欧美在线观看www| 91免费人成网站在线观看18| 97国产精品视频| 亚洲社区在线观看| 美日韩精品免费视频| 九九热精品视频| 一区二区欧美在线| 欧美性在线观看| 国产精品福利久久久| 97国产精品免费视频| 黑人狂躁日本妞一区二区三区| 欧美日韩美女在线观看| 亚洲天堂av网| 欧美色欧美亚洲高清在线视频| 国产亚洲欧美视频| 亚洲电影免费在线观看| 成人黄色片网站| 亚洲国产天堂网精品网站| 91tv亚洲精品香蕉国产一区7ujn| 日韩成人av网| 欧美性xxxxxxxxx| 91av在线免费观看视频| 日韩成人高清在线| 欧美激情亚洲激情| 欧洲亚洲在线视频| 欧美性xxxxx极品娇小| 欧美一区在线直播| 欧美一区二粉嫩精品国产一线天| 日韩精品免费综合视频在线播放| 91中文字幕在线| 国产视频在线观看一区二区| 亚洲japanese制服美女| 国产成人综合一区二区三区| 在线精品国产成人综合| 成人网址在线观看| 狠狠久久五月精品中文字幕| 成人免费直播live| 在线亚洲国产精品网| 亚洲天堂成人在线视频| 亚洲一区二区在线| 成人激情在线观看| 在线播放国产精品| 日韩小视频网址| 亚洲综合成人婷婷小说| 久久频这里精品99香蕉| 久久久www成人免费精品张筱雨| 日韩免费黄色av| 国产精品入口日韩视频大尺度| 欧美激情视频网址| 欧美福利在线观看| 精品久久久久久久久中文字幕| 夜夜嗨av一区二区三区四区| 欧美日韩免费观看中文| 亚洲自拍欧美色图| 91精品国产91久久久久久| 色悠悠国产精品| 色在人av网站天堂精品| 亚洲国产精品久久久| 久久精品这里热有精品| 色综合伊人色综合网| 欧美插天视频在线播放| 欧美日韩性视频在线| 国产成人av网| 性色av一区二区三区免费| 亚洲欧美福利视频| 成人欧美一区二区三区在线湿哒哒| 日韩美女av在线免费观看| 日韩av一区在线观看| 亚洲精品国精品久久99热| 亚洲成人免费在线视频| 久久亚洲精品一区二区| 精品在线小视频| 在线观看欧美www| 欧美国产一区二区三区| 亚洲精品美女在线观看| 91禁外国网站| 亚洲人成电影网站色xx| 久久精品视频va| 欧美激情国内偷拍| 中文字幕日韩av| 狠狠躁夜夜躁久久躁别揉| 中文字幕在线看视频国产欧美在线看完整| 成人一区二区电影| 欧美一区二三区| 伊人伊成久久人综合网小说| 午夜精品一区二区三区av| 4438全国成人免费| 欧美性猛交xxxxx水多| 国产91在线播放精品91| 一个人看的www欧美| 成人疯狂猛交xxx| 日韩精品高清在线观看| 日韩电影免费观看在线| 久久成年人免费电影| 亚洲成人av在线| 亚洲第一免费网站| 91系列在线观看| 精品亚洲一区二区三区| 色妞一区二区三区| 日韩中文娱乐网| 亚洲人av在线影院| 日本亚洲欧美成人| 久久在线观看视频| 国产成人亚洲综合91精品| 色爱精品视频一区| 精品国产31久久久久久| 国产精品一区二区久久精品| 久久精品色欧美aⅴ一区二区| 欧美色视频日本高清在线观看| 性欧美xxxx| 国产精品久久久精品| 亚洲一区二区在线播放| 亚洲人成网在线播放| 亚洲第一精品久久忘忧草社区| 国产精品久久久久久久久久久久久|