2014年5月7日 星期三

重構 PHP 引擎並大幅改善效能 - PHP Mailing List


譯文 Hackpad: https://hackpad.com/-PHP--HRY9UYvrArM

原文網址: http://news.php.net/php.internals/73888

認識我的人們都知道我在 Zend 主要的責任及熱情都放在 PHP 效能這個主題上。 事實上,從 PHP 5.0 版本開始,我們已經在綜合性效能評比 (Benchmark) 上改善了六倍的速度,並且讓一般使用 PHP 撰寫的應用程式達到了兩倍速度改善。

我們不停的改善 PHP 引擎以及 OPCache (PHP 5.5 版的核心套件,用於快取)。 然而,當時對於 PHP 5.5 版本的釋出,我們並無顯著的發展,除了別的事情之外,我們也試驗了一些記憶體管理, JIT 技術等其他可能的辦法。

我花了相當多的時間試驗 JIT 的想法,並證實這是可行的 (以 LLVM 為基礎的 JIT 編譯器,然後嵌入 OPCache)。 由 bench.php 得到的結果相當驚人 -- (由原本的 2.175 秒改善為 0.219 秒 -- PHP 5.5 近十倍速度的改善),但在現實的應用程式中,我們只得到了一些加速。 但這讓我們更深入的探索 PHP 引擎執行時期 (Runtime) 的特性以及那些真正的瓶頸,來取得巨大的進展。

很明顯的 VM 幾乎已經高度優化了,但是卻內部所使用的資料結構卻需要使用大量的記憶體調用 (Allocation)、釋放 (Deallocation)、參照計算 (Reference Counting)。

一般來說,現實生活中的 PHP 應用程式花了約 20% 的 CPU 實在在記憶體管理 (memory management)、10% 做雜湊表 (Hash Table) 操作、30% 呼叫內部函式 (Internal functions) 且只有 30% 花在虛擬機器 (VM) 上。

當然,我們嘗試了將 VM code 用 JIT-only 的方式運行,在大多數的狀況下,他還是花了同樣多的記憶體配置。因此,我們決定著重在最主要的效能瓶頸上。 主要的想法是修改內部的資料類型 (data types) 並最小化堆積 (Heap) 的用量。

這是一個相當困難的決定,因為我們必須重構相當大量的程式碼,而且我們完全不知道重構之後是否會造成其他問題或衝擊。

現在我可榮幸的向您們展示這四個月以來的工作成果。這次的 PHP 引擎重構大量的改善了效能、記憶體用量,並且為未來的效能改善及 JIT 建立了穩固的基礎。我會避免技術細節(更多細節將會在 http://wiki.php.net/phpng <http://wiki.php.net/phpng>* 發佈),簡單的說 - 我們改變了整棟建築物的地基並且盡量保持建築本身不改變。現在新的引擎已經達成了 *10-30% 左右的加速,且不只是在效能評比 (Benchmark) 中,在現實應用程式也達成了相同的加速!

以下是我們目前所達成的效能改善:
  • Wordpress 3.6 – 20.0% gain (253 vs 211 req/sec)
  • Drupal 6.1 – 11.7% gain (1770 vs 1585 req/sec
  • Qdig – 15.3% gain (555 vs 482 req/sec)
  • ZF test app – 30.5% gain (217 vs 166 req/sec)
在某些應用程式中,我們相較於其他 PHP 實作得到了更好的結果。 若有其他人能夠測試他們的應用程式,並且與目前使用的 PHP 版本的效能比較,整理更多的效能差異結果,那就更好了。

這次的重構還未完成,因為我們一開始只是測試這樣的修改是否能得到改善。 目前並不是所有的延伸套件 (Extension) 都得到支持,有一些單元測試是失敗的,此外,我們對於其他改善也還有更多想法。

但我們覺得,現有的結果已經足以證實改善的方向,且可以開放出來讓大家檢視、回饋或協助,如我們現在有了正確的方向,我們也想儘快讓社群參與。

因為,要支持所有的延伸套件 (Extension) 以及持續的做出更多改善,還有許多工作需要完成,這些也需要社群的協助。
請嘗試這個重構過的 PHP 引擎並且提供我們意見或結果,像是: 效能, 記憶體用量或任何的想法。 你可以在 php.net 上的 *phpng* 這個開發分支上找到這個新版的 PHP。

建置步驟則在: http://wiki.php.net/phpng

如同我們上面提到的,有一些 Extension 還未被支援,因此並不是所有的東西都可以運作。

我想要感謝 Xhinchin 以及 Nikita ,他們完成了這次的成果許多重要的部份。

謝謝。 Dmitry。


-- 林佑安譯於 2014 五月