專訪阿里巴巴研究員趙海平:從非死book到阿里巴巴

jopen 10年前發布 | 10K 次閱讀 阿里巴巴

趙海平,2007 年加入只有不到 50 個軟件工程師的 非死book,致力于軟件性能和架構分析,在此期間創建了 HipHop 項目,重新編寫和實現 PHP 語言,使其速度提高 5 到 6 倍,為公司節約數十億美元。HipHop 項目之后,致力于“用異步處理來優化分布式系統”的設計理念中,并為此做了多項分布式數據庫的優化研究,在 PHP 語言中加入了 yield 和 generator 的新功能,來幫助日趨復雜的 非死book 網頁設計。

2015 年 3 月,他回到中國,加入阿里巴巴技術保障部,任職研究員,將重點攻克阿里巴巴在軟件性能以及 Java 使用過程中遇到的技術問題。

InfoQ:首先歡迎您回到中國。可以介紹一下您加入阿里巴巴的初衷嗎,阿里巴巴最吸引您的地方在哪里?

趙海平:去年機緣巧合,我和阿里巴巴的同事有了交流的機會。當時我們聊了很多技術細節,發現阿里巴巴的規模非常之大,很多技術上的難題是美國公司都沒有的。比如說雙十一這個問題,沒有哪家美國公司單天有這么大的交易量,這是很特殊的一個問題。這個技術問題對我特別有吸引力。

當規模大到一定程度,簡單的問題也會變得復雜。有的時候軟件就是這個樣子,在一臺或者幾臺機器上執行是一個情況,當機器多到一定程度時,對軟件的要求就特別高了。在多臺機器上,怎么才能保持很快的速度,并且節省機器,又不出問題,這是一個很難的技術問題。

單天的資源需求是平時的好多倍,怎么計劃機器,讓峰值最高的那天不出現問題,平時又要做到很好的利用,這是很不容易的。我特別希望自己能夠有這 么一個經歷,去阿里巴巴解決這個問題,這是在其他公司找不到的技術問題,而且跟我很對口,我一直在做的都是怎么提高大規模系統的性能、穩定性,所以這正是 我的興趣所在。

InfoQ:您在阿里巴巴的新角色就是解決這些基礎設施的性能問題?

趙海平:基本上是幾個方面,性能、穩定性、容量、架構,還有運維,恰恰就是我現在這個團隊——技術保障部——的工作。性能提升上去,容量就增加了,隨著我們監控系統的改進,系統的穩定性也會提高,運維也會更方便。如果發現架構上的問題,我們也會做些調整。

InfoQ:談到性能問題,定位是很關鍵的一點。像這種規模的分布式系統,如何實現全系統的監控,準確定位問題就非常重要,您會在這方面發力嗎?

趙海平:Profiling 特別重要。如果能有一個特別強大的 Profiling 系統,就知道整個系統在哪個地方,哪臺機器上,花了多少 CPU、內存、磁盤 IO 或者網絡帶寬等資源,才能知道優化什么地方效益最大。

所以我的第一步工作就是幫助完善阿里巴巴的監控和 Profiling 系統,希望能夠很清楚地把軟件的整個性能展現給大家,做到實時監控,同時讓研發人員看到自己的代碼在線上的運行情況,了解這些代碼花掉了多少資源,這樣有問題的話他們可以自己解決。

InfoQ:大家對您的最初印象多是來自 HipHop for PHP 這個項目。像淘寶之前就從 PHP 切換到了 Java,而 非死book 選擇了自己改進 PHP。可以談一下這個項目嗎,當時的出發點是什么樣的?

趙海平:HipHop 也是一步步慢慢建立起來的。最初是我遇到了一個 PHP 的函數,在 C++ 里也想用。當時想,重寫一下就可以。不過那個 PHP 函數不斷在變,我就想寫一個簡單的工具,把這個函數轉換成C++,這樣就可以跟上 PHP 代碼的變化。那時正好機器開始吃緊,大家意識到 PHP 的速度問題,CPU 消耗很大。大家就開始討論如何提高 PHP 的性能。當時想法很多,有人想改變 PHP 本身,有人想干脆用 Python 或 Java 重寫網站。

當時也重寫過,有三四個人在做這件事情,但這些人改的速度遠遠趕不上另外二三十人寫新 PHP 業務代碼的速度。所以我們就想到寫一個工具,來轉換這些新寫的代碼,既不干擾既有的開發節奏,又能大幅優化性能,跟上變化。

當時我也讀了下 Zend Engine 的代碼,研究 PHP 為什么會慢。發現 PHP 速度之所以慢,是因為有很多的函數調用是動態的,而像C和 C++ 里,很多函數是靜態調用,不需要在執行的過程中去查詢函數指針在什么地方,所以速度才快。

所以我們做了很大的調整,一定要改變這種方式,爭取讓所有的函數調用都能盡快實現,在編譯的時候靜態處理,執行的過程中就不需要再查詢,指針已經在那兒了,這是最主要的加速思路。

那時候就萌芽了一個想法,如果能夠把 PHP 直接轉換成C++,也許這個性能問題就解決了。然后就花了很多時間去做原型。我們做了很多工作,把底層的 PHP 實現都改變了,有一個自己的 Runtime Library,再就是一個 PHP 的擴展庫,這個實際上是很大的一塊代碼。在這個上面,我們又寫了一個把 PHP 轉換成 C++ 的一個編譯器。先將 PHP 編譯成C++,然后靠底下的這個庫實現功能。這是最早期的工作。

不過這在當時只是一個副業,因為不知道這個東西到底有沒有意義,是不是能提高性能。大概能拿出 30%~40% 的時間做這個。做完之后發現效果很好,就加入了其他同事一起做。后來速度不斷提高,第一年提高了 2 倍,第二年又提高了 2 倍,后來提高到5~6 倍的樣子。

現在回頭看,如果當時雇很多人把網站改成 Java 的,也是可以做到的,但 非死book 的發展可能要停半年到一年時間,甚至更久,就有可能對 非死book 的發展帶來不可預期的影響。這件事情主要還是業務推動的。

InfoQ:后來 HipHop 發展成 HHVM,從原來的靜態編譯變成了動態的 JIT 機制,您也參與了這方面的工作嗎?

趙海平:引入 HipHop 之后,我們也有自己本身的一些問題,比如產品環境和開發環境就是不一樣的,這樣多多少少會存在一些問題,也就容易出現 bug。再就是 非死book 的代碼量非常龐大,編譯時間非常長,另外生成的二進制文件也非常大(超過 1G),發布也很困難。

這時就出現了 HHVM。HHVM 不再是把 PHP 轉換成C++,而是采用了一種新方法,把 PHP 轉換成一個中間碼,這個中間碼在執行過程中再轉換成機器碼,不過調用的還是我們原來為 HipHop 寫的底層庫,它取代的主要是把 PHP 編譯為 C++ 的過程。

我并沒有參與 HHVM 的編寫,當時我已經離開這個小組了,另外一件事情吸引了我,這就是異步處理在分布式系統中的優化作用。

之所以離開這個小組,原因大概有幾個方面:一個是,個人認為 HHVM 不再能把性能提高更多了,后來也確實如此,兩三年之后 HHVM 出來,速度并沒有更大的提高,最高只比原來靜態編譯機制快 10%~15%,而且是因為靜態編譯這一塊不再開發了。再就是新的課題特別有意思,具體我會在 QCon 北京上分享。

這就是為什么去 GitHub 上看,HHVM 里面會有我的代碼,主要是底層的代碼還是基于 HipHop 的。HHVM 的頭兩個字母就是來自 HipHop,引擎還是原來的,不過上面做了很多工作,把 PHP 轉換成中間代碼,這個有點像 Java 的 JVM。這樣的好處就是研發過程和產品過程其實是一樣的,而且不會有原來說的那種超大二進制文件的問題。中間代碼很小,PHP 可以直接發布到線上系統上。

InfoQ:國外一些著名的互聯網公司,在性能調整和優化的過程中,慢慢都發展出了自己的 編程語言,像 非死book 設計了 Hack 語言,Google 有 Go 和 Dart 等語言,Apple 有 Swift 等。這方面您有什么感想嗎,非死book 的 Hack 語言您是不是參與設計了?

趙海平:Google 的 Go 語言挺有意思的,寫得非常好。Hack 語言我沒有太多的參與。

PHP 是弱類型的,這是性能提高的一個瓶頸,而強類型的話就可以做很多優化。最初我們是想增強 PHP 的類型系統。強化數據類型,這是引入 Hack 的一個主要因素。

InfoQ:PHP7 最近也有很多改變,性能提高也比較大。

趙海平:這也是我臨來之前剛剛聽到的。PHP 核心開發組的力量是很強的。我也跟他們的人員交流過,他們對整個 PHP 的優化有自己的思路和想法,也做了很多工作。這是件好事。其實重要的并不是說哪個團隊或小組把 PHP 優化到什么樣的地步,有幾個小組都在做這個事情,彼此競爭,會促進整個 PHP 生態系統的發展。這種競爭也恰恰說明了 PHP 的重要,所以會有很多人關注它的性能優化。

InfoQ:您對公司發明創造自己的編程語言怎么看?

趙海平:編程語言這個問題,我說兩點。第一,不能把語言當成一個特別神圣、至高無上的東西。語言也是整個軟 件系統的一部分,只是它分割的很好,獨立出來了,可以執行更多的功能,我們可以用它實現我們的功能,可是在整體架構上看,語言也只不過是軟件系統的一部 分,而這一部分我們完全可以做一些調整,使其更適合我們的系統。而設計語言時一般考慮的是比較通用的目標,我們拿來用,只是因為它的絕大部分特性都是我們 想用的。比如我們用C和 C++ 寫程序的時候,每次都要思考內存的模式是什么,是不是用 share pointer,是不是用自己寫的 Object,內存的 allocation/deallocation 怎么做,一個語言幫我們把這些事情都做好了,這就是它的好處。它提供了一個很大的庫,提供了一個軟件執行的環境和范圍,而這正是我們選擇語言的初衷。

第二,作為一個公司來講,不能說為了研發一個語言而去研發一個語言。這是沒有意義的。一定要根據自己想要做的事情,在現有的軟件架構當中,我們 發現當前所用的語言提供的環境和范圍不太適合,或者說這個語言的很多假設和假想,和我們所期待的東西并不一樣,只有在這個時候,我們怎么也找不到一個合適 語言的時候,我們才會創造一個新的語言,讓這個語言更適合公司的事情。如果可以通用化,提煉出來,那就是語言,否則設計成軟件庫就可以了。

這是水到渠成的,不要強求。像 Google 開發 Go 語言,我認為它有自己的考量,可能在開發很多分布式系統的時候,現在的語言寫法上不太直觀,或者速度不夠快,所以才創造了這么一個東西。Go 應該能解決公司內部的很多問題,否則是很難存活的。

InfoQ:您可以結合自己這些年的經驗,給中國開發者的成長一些建議嗎?

趙海平:在美國的時候,我跟 非死book 的中國員工聊的很多。我給他們最多的建議就幾條。

第一,一定要提高交流能力。咱們中國人,尤其是中國搞計算機的人,很多人有個不該有的特點,就是喜歡把自己鎖在黑屋子里埋頭干活,跟機器交流特 別擅長,跟人的交流一竅不通。這樣不行,我相信在中國也是這樣的,你不但要把自己的工作,技術活要做得特別好,而且要擅長表達自己的想法,擅長在工作當中 講述做的是什么,怎么樣能夠說服別人,怎么樣能夠跟別人在不傷和氣的情況下,把問題解決好,這是很強的一個能力,而這個能力不是在學校里能學會的,是我們 走向社會之后慢慢學到的東西,這個我恰恰認為中國的員工,尤其是在美國那樣的環境,因為不是母語,可能處理得就不是特別好,有時說出來的話比較生硬,給對 方的感覺不是特別好。

第二,中國人比較謙虛、內斂,講究內涵,自己心里有的東西不表達出來。但是在工作中,可以適度強勢一點,勇敢表達自己的想法。當然這個建議是基于美國多元文化的背景,在國內大家的文化背景一致,也許可以探討最合適的溝通方式。

第三,掌握好英語,開拓眼界。我覺得在計算機這個技術里邊能夠非常了解英語,把英語的這個隔閡給去掉還是非常重要的。

我回來的時間還不長,等和大家接觸多了,可能會有新的想法,目前就這幾點吧。

來自: InfoQ

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!