專訪阿里陶輝:大規模分佈式系統、高性能服務器設計經驗分享

http://www.csdn.net/article/2014-06-27/2820432



allowtransparency="true" frameborder="0" scrolling="no" src="http://hits.sinajs.cn/A1/weiboshare.html?url=http%3A%2F%2Fwww.csdn.net%2Farticle%2F2014-06-27%2F2820432&type=3&count=&appkey=&title=%E5%85%88%E5%90%8E%E5%B0%B1%E8%81%8C%E4%BA%8E%E5%9C%A8%E5%9B%BD%E5%86%85%E7%9F%A5%E5%90%8D%E7%9A%84%E4%BA%92%E8%81%94%E7%BD%91%E5%85%AC%E5%8F%B8%EF%BC%8C%E7%9B%AE%E5%89%8D%E5%9C%A8%E9%98%BF%E9%87%8C%E4%BA%91%E5%BC%B9%E6%80%A7%E8%AE%A1%E7%AE%97%E9%83%A8%E9%97%A8%E5%81%9A%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1%E4%B8%8E%E6%A0%B8%E5%BF%83%E6%A8%A1%E5%9D%97%E4%BB%A3%E7%A0%81%E7%9A%84%E7%BC%96%E5%86%99%EF%BC%8C%E4%B8%BB%E8%A6%81%E8%B4%9F%E8%B4%A3%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F%E5%92%8C%E5%AD%98%E5%82%A8%E7%B3%BB%E7%BB%9F%E7%9A%84%E4%BC%98%E5%8C%96%E3%80%82%E9%99%B6%E8%BE%89%E5%B0%B1%E5%A4%A7%E8%A7%84%E6%A8%A1%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E3%80%81%E9%AB%98%E6%80%A7%E8%83%BD%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1%E5%88%86%E4%BA%AB%E4%BA%86%E8%87%AA%E5%B7%B1%E7%9A%84%E7%9C%8B%E6%B3%95%E3%80%82&pic=&ralateUid=&language=zh_cn&rnd=1404117607226" width="22" height="16">摘要:先後就職於在國內知名的互聯網公司,目前在阿里雲彈性計算部門做架構設計與核心模塊代碼的編寫,主要負責雲服務器管理系統和存儲系統的優化。陶輝就大規模分佈式系統、高性能服務器設計分享了自己的看法。

關注陶輝很長時間,初次對陶輝的瞭解還是在我們CSDN的博客上,從2007年開始寫博客,一直到現在,如果不是對技術的追求和熱愛,以及熱愛分享的精神,我想不是很多人能堅持下來,擁有多年大型互聯網公司的從業經驗,對linux下的高性能服務器開發、大規模分佈式系統的設計有着豐富經驗,對企業的Nginx\開發Nginx模塊也有着獨到的理解。


免費訂閱“CSDN雲計算”微信公衆號,實時掌握第一手雲中消息!

CSDN作爲國內最專業的雲計算服務平臺,提供雲計算、大數據、虛擬化、數據中心、OpenStack、CloudStack、Hadoop、Spark、機器學習、智能算法等相關雲計算觀點,雲計算技術,雲計算平臺,雲計算實踐,雲計算產業資訊等服務。


Nginx是一個高性能的 HTTP 和反向代理服務器, Nginx 是由俄羅斯人 Igor Sysoev 爲 Rambler.ru 開發的,其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。在談到Nginx未來會取代Apache時,陶輝表示雲與端的時代,端越來越多,雲的性能就會越來越重要,服務器資源的效率在企業成本上將佔據越發重要的地位,從這個角度來說,Apache的市場份額被Nginx取代的趨勢是不會變的。這次,筆者有幸聯繫到陶輝,他就大型軟件的開發,雲計算等分享了自己的經驗心得。

陶輝

畢業於西安交通大學計算機科學與技術專業,先後工作於華爲、騰訊、思科、阿里巴巴等公司。

對linux下的高性能服務器開發、大規模分佈式系統的設計有着豐富經驗。著有《深入理解Nginx:模塊開發與架構解析》一書。

CSDN:給大家介紹一下您及目前從事的工作?

陶輝:我目前在阿里雲 彈性計算部門做架構設計與核心模塊代碼的編寫,主要負責雲服務器管理系統和存儲系統的優化。大家在阿里雲上購買的ECS服務器就是彈性計算部門的產品。

CSDN:是什麼緣由促使您寫了一本關於Nginx的書籍?

陶輝:大約2010年在思科工作時需要開發一個雲文檔系統,當時選用了Nginx作爲web容器開發一個有較高性能訴求的文件上傳下載服務。

可是發現很難從網上找到系統的資料可以指導Nginx模塊的開發,對於Nginx的設計思路也是一頭霧水,只好看它的源代碼來倒推作者的初衷與模塊設計思路。那個過程對於已有多年服務器開發經驗的我來說也是痛苦的,於是就開始陸續寫了一些Nginx模塊開發的文章分享到CSDN上,希望能夠幫助其他開發者快速解決問題。這時機械工業出版社的編輯lisa看到這些文章找到了我,希望我能寫一本系統的、從開發者角度介紹Nginx的書。這本書誕生的緣由就在這裏。

CSDN:目前國內知名的互聯網公司很多都在使用Nginx,您覺得企業在使用Nginx\開發Nginx模塊的過程中需要注意什麼?

陶輝:僅當需要併發處理萬級別或以上的TCP連接時,才應當考慮Nginx。

當官方Nginx無法滿足項目需求,在開發你的個性化模塊之前,先看一看大量的Nginx第三方模塊裏,有沒有能夠解決問題的Nginx模塊,不要重複開發輪子,尤其Nginx輪子的開發難度還不低。Nginx.conf裏可以玩的花樣很多(這由每一個Nginx模塊決定,如ngx_lua這樣的模塊還可以在裏面插入lua語法),或許一段幾十行的配置就能完成複雜的功能。

如果確實沒有滿足需求的模塊,那麼,再看看能不能通過類似subrequest這樣的機制將問題分解爲多個子問題,其中多數子問題可以由現成的模塊完成,或者通過proxy機制來與其他現成的組件通過tcp協議交互完成。組合這些子問題來構成解是個好習慣。

若真有必要編寫Nginx模塊,先要確保它只是解決一個非常純粹、簡單的子問題,不要耦合太多的需求。Nginx進程裏是拒絕任何阻塞操作的,這是因爲模塊都運行在IO核心處理線程中的。任何一個邊緣化的模塊都可能因爲自己小小的阻塞調用毀掉Nginx的高性能。所以,慎重的考慮模塊中的每一個調用,確認它們不會導致進程進入sleep狀態,確認它們不會在那裏空轉佔用系統資源。好好使用Nginx定時器事件、共享內存,往往能解掉上述問題。

寫模塊時,使用好Nginx的變量機制,讓自己的模塊插上http框架的翅膀,根據框架解析出的變量來做靈活的處理。甚至,提供一些新的變量作爲底層模塊而給上層模塊使用。

使用好nginx.conf,通過靈活的配置來提供豐富的功能。

debug級別的error.log日誌非常詳盡,僅有它就可以定位出很多你的模塊bug,別忘了使用它必須在編譯時加入--with-debug。

最後,如果模塊可能對其他人有幫助,那麼,分享它吧。

CSDN:對於正在學習Nginx的同學有什麼建議?對開源軟件的學習有沒有什麼分享的?

陶輝:其實《深入理解Nginx》這本書的目錄,就是我推薦的學習路徑。

首先,從最外面看Nginx是什麼樣的,瞭解進程模型、配置文件語法、基本功能等。

其次,從嘗試編寫最簡單的http模塊入手,漸漸地使用到Nginx Http框架的一些高級特性,瞭解Nginx的內存池、各數據結構的用法等;

再次,系統的瞭解Nginx框架,包括它如何啓動、如何停止、如何升級、如何重載配置,多進程間如何負載均衡,http連接的建立、URL與包頭的收取、解析、選用哪些http模塊處理請求、如何向客戶端迴響應等。

這樣學習Nginx,大家就可以清晰得了解異步事件框架,理解松耦合設計與web請求的處理方式。

學習其他開源軟件也可以仿照這一過程。

CSDN:我知道你在思科、騰訊等企業工作過,關於大規模分佈式系統、高性能服務器設計上有沒有什麼經驗、心得和大家分享一下?

陶輝:使用高級語言、中間件來開發較大型軟件時,一定先有一個評估標準:這樣玩性能不是問題。這裏的潛臺詞是把性能當做了基礎貨幣。例如,使用python代替C進行程序開發所犧牲的性能C1,與其帶來的其他好處C2相比,必須C1<C2。所以,性能其實是一個永恆的話題。下面零散的談談我對性能的理解。

單組件的性能提升上,算法最重要。特別是越前沿的技術、場景,通用算法的功效距離期望值就越遠,開發者這時要能夠正確的分析不同的算法在各種情況下的運行時間,基於你的數據特性設計個性化的算法以提升性能,PS,這裏終於可以用到大學裏學過的如概念論這樣的數學技巧了。同時,細緻的梳理業務,能夠並行處理的絕對不要串行化,謹慎加鎖,提高吞吐量。

對於組件依賴的其他系統,也需要深刻理解如何使用它,才能最大化硬件效率。例如操作系統,如果組件使用多線程去搶佔有限的CPU資源,就必須評估進程間切換的代價,這往往是性能大殺器;瞭解不同的設備間的訪問速度(如SSD硬盤、內存等),將快速設備放在慢速設備前作爲緩存;使用TCP作爲通訊協議時,既要了解理論也要了解實現,包括演變過程,在實踐中才能高效的使用、改進它;減少內存等資源的頻繁使用,考慮內存池及如何避免大塊內存拷貝;提高緩存的命中率,如coding時應當考慮變量是否經常落到CPU CACHE中,及代碼分支預測的命中率等等。

其實性能“高”也是相對的,需要從開發效率和運行效率上權衡。協程是一個很好的方向,通過創建協程棧來僞造線程開發環境提升開發效率,通過改變底層阻塞API的實現來提升吞吐量、運行效率。例如linux上的ucontext、nginx的lua模塊,這裏最大的問題還是阻塞API的協程化改造。

團隊的技術積累、業務特點都對開發效率有不同的要求,架構上的scalability也是重要約束,能夠通過水平擴展線性地提升性能時,就可以通過犧牲單組件性能來提升開發效率了。

分佈式系統的ACP是一個權衡問題,適當的犧牲一致性是常見解決方案。scalability是一個重要屬性,而這個屬性會帶來請求串行化的場景,常用zookeeper這類系統來提供可靠的鎖服務。有了scalability常會導致系統引入緩存服務:組件的主存不可緩存了。緩存也有很多種成熟的解決方案,如memcached、redis等。

開發大型系統時組件間的高內聚松耦合很重要,否則代碼很快就難以維護,有一種解耦方式比較受青睞:使用如rabbitmq等服務來提供異步消息訂閱通知機制。

多個會落地的數據服務可能會引入“事務”,而分佈式事務解決起來是比較頭疼的,paxos兩段式提交常常是首選,事務的回滾、清理、殘留未完成事務的回滾等都是需要考慮的事項,可以借鑑關係數據庫的undo、redo等事務解決方式。

CSDN:能否談談Nginx目前還有哪些不足?還有哪些地方有待完善?

陶輝:我們對Nginx的期望一直在提高:早期只把它用做靜態web與反向代理,漸漸地希望它能夠處理動態請求。這樣,在Nginx進程內部增加功能就越來越重要。

怎樣增加動態請求的處理呢?最方便的是使用一些抽象了常用動態功能的模塊,這些模塊以nginx.conf中的配置來定義web請求的動態處理流程。然而,很多時候這些模塊模塊只能處理大衆化的需求,這樣程序員們只好挽起袖子直接編寫C代碼了。

但是,nginx模塊的開發門檻還挺高,需要開發者對於服務器的非阻塞調用、事件模型有較深的理解,而如果請求處理時需要有全局化視角時,麻煩的多進程通信又來了,開發者不能使用簡單的堆分配對象,而要使用nginx_slab管理內存。

因此,除了期待更多的開發者貢獻出多樣的抽象模塊,目前nginx最應該完善的應當是二次開發的易用性--能夠更方便、快速的開發出高性能的nginx模塊。例如,nginx的框架可以考慮支持多線程模型,可以考慮支持ucontext協程方式,使開發時不用考慮API的異步回調,不用考慮鎖的滿足條件。

CSDN:Nginx市場份額一直穩步提升,您覺得Nginx未來會取代Apache嗎?

陶輝:在雲與端的時代,端越來越多,雲的性能就會越來越重要;而互聯網思維本就不高富帥,同時會服務所有草根用戶,而用戶體驗也需要提升,所以,服務器資源的效率在企業成本上將佔據越發重要的地位。從這個角度來說,Apache的市場份額被Nginx取代的趨勢是不會變的。

CSDN:能否談談對目前國內雲計算市場有什麼看法?有哪些趨勢值得去關注?

陶輝:雲市場發展開始加速,雲服務提供商將開始在國計民生中扮演愈發重要的角色,社會基礎服務將會進入公有云中,從而對雲服務的可靠性安全性有了非常高的要求。比如,早期公有云一個技術人員眼中的小bug,這時就很可能會對社會生活造成嚴重影響。如阿里雲這樣的主流公有云服務提供商必須承擔起社會使命,猶如水、電、空氣一樣不能中斷、不能出錯地提供服務。服務質量越來越重要。

另一方面,由於雲服務提供商通過規模效應可以提供更廉價的服務,所以企業、個人都在將自己的服務上雲,這又在推動着主流雲商必須思考如何以更低的成本提供服務。所以,雲商必須深入到基礎設施中,把原先的通用性設備改造成適合雲的專有設備,以此提高效率;必須提升原先不適合爲雲服務的管理系統,以滿足不間斷服務的要求。例如,雲商將需要自己運維網絡,需要與硬件廠商合作,設計適合特定場景的網卡、CPU、內存等,軟硬結合着在底層增加效率,降低企業成本。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章