關(guān)注陶輝很長(zhǎng)時(shí)間,初次對(duì)陶輝的了解還是在我們CSDN的博客上,從2007年開始寫博客,一直到現(xiàn)在,如果不是對(duì)技術(shù)的追求和熱愛,以及熱愛分享的精神,我想不是很多人能堅(jiān)持下來,擁有多年大型互聯(lián)網(wǎng)公司的從業(yè)經(jīng)驗(yàn),對(duì)linux下的高性能服務(wù)器開發(fā)、大規(guī)模分布式系統(tǒng)的設(shè)計(jì)有著豐富經(jīng)驗(yàn),對(duì)企業(yè)的Nginx開發(fā)Nginx模塊也有著獨(dú)到的理解。
免費(fèi)訂閱“CSDN云計(jì)算”微信公眾號(hào),實(shí)時(shí)掌握第一手云中消息!
CSDN作為國內(nèi)最專業(yè)的云計(jì)算服務(wù)平臺(tái),提供云計(jì)算、大數(shù)據(jù)、虛擬化、數(shù)據(jù)中心、OpenStack、CloudStack、Hadoop、Spark、機(jī)器學(xué)習(xí)、智能算法等相關(guān)云計(jì)算觀點(diǎn),云計(jì)算技術(shù),云計(jì)算平臺(tái),云計(jì)算實(shí)踐,云計(jì)算產(chǎn)業(yè)資訊等服務(wù)。
Nginx是一個(gè)高性能的 HTTP 和反向代理服務(wù)器, Nginx 是由俄羅斯人 Igor Sysoev 為 Rambler.ru 開發(fā)的,其將源代碼以類BSD許可證的形式發(fā)布,因它的穩(wěn)定性、豐富的功能集、示例配置文件和低系統(tǒng)資源的消耗而聞名。在談到Nginx未來會(huì)取代Apache時(shí),陶輝表示云與端的時(shí)代,端越來越多,云的性能就會(huì)越來越重要,服務(wù)器資源的效率在企業(yè)成本上將占據(jù)越發(fā)重要的地位,從這個(gè)角度來說,Apache的市場(chǎng)份額被Nginx取代的趨勢(shì)是不會(huì)變的。這次,筆者有幸聯(lián)系到陶輝,他就大型軟件的開發(fā),云計(jì)算等分享了自己的經(jīng)驗(yàn)心得。
陶輝
畢業(yè)于西安交通大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)專業(yè),先后工作于華為、騰訊、思科、阿里巴巴等公司。
對(duì)linux下的高性能服務(wù)器開發(fā)、大規(guī)模分布式系統(tǒng)的設(shè)計(jì)有著豐富經(jīng)驗(yàn)。著有《深入理解Nginx:模塊開發(fā)與架構(gòu)解析》一書。
CSDN:給大家介紹一下您及目前從事的工作?
陶輝:我目前在阿里云 彈性計(jì)算部門做架構(gòu)設(shè)計(jì)與核心模塊代碼的編寫,主要負(fù)責(zé)云服務(wù)器管理系統(tǒng)和存儲(chǔ)系統(tǒng)的優(yōu)化。大家在阿里云上購買的ECS服務(wù)器就是彈性計(jì)算部門的產(chǎn)品。
CSDN:是什么緣由促使您寫了一本關(guān)于Nginx的書籍?
陶輝:大約2010年在思科工作時(shí)需要開發(fā)一個(gè)云文檔系統(tǒng),當(dāng)時(shí)選用了Nginx作為web容器開發(fā)一個(gè)有較高性能訴求的文件上傳下載服務(wù)。
可是發(fā)現(xiàn)很難從網(wǎng)上找到系統(tǒng)的資料可以指導(dǎo)Nginx模塊的開發(fā),對(duì)于Nginx的設(shè)計(jì)思路也是一頭霧水,只好看它的源代碼來倒推作者的初衷與模塊設(shè)計(jì)思路。那個(gè)過程對(duì)于已有多年服務(wù)器開發(fā)經(jīng)驗(yàn)的我來說也是痛苦的,于是就開始陸續(xù)寫了一些Nginx模塊開發(fā)的文章分享到CSDN上,希望能夠幫助其他開發(fā)者快速解決問題。這時(shí)機(jī)械工業(yè)出版社的編輯lisa看到這些文章找到了我,希望我能寫一本系統(tǒng)的、從開發(fā)者角度介紹Nginx的書。這本書誕生的緣由就在這里。
CSDN:目前國內(nèi)知名的互聯(lián)網(wǎng)公司很多都在使用Nginx,您覺得企業(yè)在使用Nginx開發(fā)Nginx模塊的過程中需要注意什么?
陶輝:僅當(dāng)需要并發(fā)處理萬級(jí)別或以上的TCP連接時(shí),才應(yīng)當(dāng)考慮Nginx。
當(dāng)官方Nginx無法滿足項(xiàng)目需求,在開發(fā)你的個(gè)性化模塊之前,先看一看大量的Nginx第三方模塊里,有沒有能夠解決問題的Nginx模塊,不要重復(fù)開發(fā)輪子,尤其Nginx輪子的開發(fā)難度還不低。Nginx.conf里可以玩的花樣很多(這由每一個(gè)Nginx模塊決定,如ngx_lua這樣的模塊還可以在里面插入lua語法),或許一段幾十行的配置就能完成復(fù)雜的功能。
如果確實(shí)沒有滿足需求的模塊,那么,再看看能不能通過類似subrequest這樣的機(jī)制將問題分解為多個(gè)子問題,其中多數(shù)子問題可以由現(xiàn)成的模塊完成,或者通過proxy機(jī)制來與其他現(xiàn)成的組件通過tcp協(xié)議交互完成。組合這些子問題來構(gòu)成解是個(gè)好習(xí)慣。
若真有必要編寫Nginx模塊,先要確保它只是解決一個(gè)非常純粹、簡(jiǎn)單的子問題,不要耦合太多的需求。Nginx進(jìn)程里是拒絕任何阻塞操作的,這是因?yàn)槟K都運(yùn)行在IO核心處理線程中的。任何一個(gè)邊緣化的模塊都可能因?yàn)樽约盒⌒〉淖枞{(diào)用毀掉Nginx的高性能。所以,慎重的考慮模塊中的每一個(gè)調(diào)用,確認(rèn)它們不會(huì)導(dǎo)致進(jìn)程進(jìn)入sleep狀態(tài),確認(rèn)它們不會(huì)在那里空轉(zhuǎn)占用系統(tǒng)資源。好好使用Nginx定時(shí)器事件、共享內(nèi)存,往往能解掉上述問題。
寫模塊時(shí),使用好Nginx的變量機(jī)制,讓自己的模塊插上http框架的翅膀,根據(jù)框架解析出的變量來做靈活的處理。甚至,提供一些新的變量作為底層模塊而給上層模塊使用。
使用好nginx.conf,通過靈活的配置來提供豐富的功能。
debug級(jí)別的error.log日志非常詳盡,僅有它就可以定位出很多你的模塊bug,別忘了使用它必須在編譯時(shí)加入--with-debug。
最后,如果模塊可能對(duì)其他人有幫助,那么,分享它吧。
CSDN:對(duì)于正在學(xué)習(xí)Nginx的同學(xué)有什么建議?對(duì)開源軟件的學(xué)習(xí)有沒有什么分享的?
陶輝:其實(shí)《深入理解Nginx》這本書的目錄,就是我推薦的學(xué)習(xí)路徑。
首先,從最外面看Nginx是什么樣的,了解進(jìn)程模型、配置文件語法、基本功能等。
其次,從嘗試編寫最簡(jiǎn)單的http模塊入手,漸漸地使用到Nginx Http框架的一些高級(jí)特性,了解Nginx的內(nèi)存池、各數(shù)據(jù)結(jié)構(gòu)的用法等;
再次,系統(tǒng)的了解Nginx框架,包括它如何啟動(dòng)、如何停止、如何升級(jí)、如何重載配置,多進(jìn)程間如何負(fù)載均衡,http連接的建立、URL與包頭的收取、解析、選用哪些http模塊處理請(qǐng)求、如何向客戶端回響應(yīng)等。
這樣學(xué)習(xí)Nginx,大家就可以清晰得了解異步事件框架,理解松耦合設(shè)計(jì)與web請(qǐng)求的處理方式。
學(xué)習(xí)其他開源軟件也可以仿照這一過程。
CSDN:我知道你在思科、騰訊等企業(yè)工作過,關(guān)于大規(guī)模分布式系統(tǒng)、高性能服務(wù)器設(shè)計(jì)上有沒有什么經(jīng)驗(yàn)、心得和大家分享一下?
陶輝:使用高級(jí)語言、中間件來開發(fā)較大型軟件時(shí),一定先有一個(gè)評(píng)估標(biāo)準(zhǔn):這樣玩性能不是問題。這里的潛臺(tái)詞是把性能當(dāng)做了基礎(chǔ)貨幣。例如,使用python代替C進(jìn)行程序開發(fā)所犧牲的性能C1,與其帶來的其他好處C2相比,必須C1<C2。所以,性能其實(shí)是一個(gè)永恒的話題。下面零散的談?wù)勎覍?duì)性能的理解。
單組件的性能提升上,算法最重要。特別是越前沿的技術(shù)、場(chǎng)景,通用算法的功效距離期望值就越遠(yuǎn),開發(fā)者這時(shí)要能夠正確的分析不同的算法在各種情況下的運(yùn)行時(shí)間,基于你的數(shù)據(jù)特性設(shè)計(jì)個(gè)性化的算法以提升性能,PS,這里終于可以用到大學(xué)里學(xué)過的如概念論這樣的數(shù)學(xué)技巧了。同時(shí),細(xì)致的梳理業(yè)務(wù),能夠并行處理的絕對(duì)不要串行化,謹(jǐn)慎加鎖,提高吞吐量。
對(duì)于組件依賴的其他系統(tǒng),也需要深刻理解如何使用它,才能最大化硬件效率。例如操作系統(tǒng),如果組件使用多線程去搶占有限的CPU資源,就必須評(píng)估進(jìn)程間切換的代價(jià),這往往是性能大殺器;了解不同的設(shè)備間的訪問速度(如SSD硬盤、內(nèi)存等),將快速設(shè)備放在慢速設(shè)備前作為緩存;使用TCP作為通訊協(xié)議時(shí),既要了解理論也要了解實(shí)現(xiàn),包括演變過程,在實(shí)踐中才能高效的使用、改進(jìn)它;減少內(nèi)存等資源的頻繁使用,考慮內(nèi)存池及如何避免大塊內(nèi)存拷貝;提高緩存的命中率,如coding時(shí)應(yīng)當(dāng)考慮變量是否經(jīng)常落到CPU CACHE中,及代碼分支預(yù)測(cè)的命中率等等。
其實(shí)性能“高”也是相對(duì)的,需要從開發(fā)效率和運(yùn)行效率上權(quán)衡。協(xié)程是一個(gè)很好的方向,通過創(chuàng)建協(xié)程棧來偽造線程開發(fā)環(huán)境提升開發(fā)效率,通過改變底層阻塞API的實(shí)現(xiàn)來提升吞吐量、運(yùn)行效率。例如linux上的ucontext、nginx的lua模塊,這里最大的問題還是阻塞API的協(xié)程化改造。
團(tuán)隊(duì)的技術(shù)積累、業(yè)務(wù)特點(diǎn)都對(duì)開發(fā)效率有不同的要求,架構(gòu)上的scalability也是重要約束,能夠通過水平擴(kuò)展線性地提升性能時(shí),就可以通過犧牲單組件性能來提升開發(fā)效率了。
分布式系統(tǒng)的ACP是一個(gè)權(quán)衡問題,適當(dāng)?shù)臓奚恢滦允浅R娊鉀Q方案。scalability是一個(gè)重要屬性,而這個(gè)屬性會(huì)帶來請(qǐng)求串行化的場(chǎng)景,常用zookeeper這類系統(tǒng)來提供可靠的鎖服務(wù)。有了scalability常會(huì)導(dǎo)致系統(tǒng)引入緩存服務(wù):組件的主存不可緩存了。緩存也有很多種成熟的解決方案,如memcached、redis等。
開發(fā)大型系統(tǒng)時(shí)組件間的高內(nèi)聚松耦合很重要,否則代碼很快就難以維護(hù),有一種解耦方式比較受青睞:使用如rabbitmq等服務(wù)來提供異步消息訂閱通知機(jī)制。
多個(gè)會(huì)落地的數(shù)據(jù)服務(wù)可能會(huì)引入“事務(wù)”,而分布式事務(wù)解決起來是比較頭疼的,paxos兩段式提交常常是首選,事務(wù)的回滾、清理、殘留未完成事務(wù)的回滾等都是需要考慮的事項(xiàng),可以借鑒關(guān)系數(shù)據(jù)庫的undo、redo等事務(wù)解決方式。
CSDN:能否談?wù)?span>Nginx目前還有哪些不足?還有哪些地方有待完善?
陶輝:我們對(duì)Nginx的期望一直在提高:早期只把它用做靜態(tài)web與反向代理,漸漸地希望它能夠處理動(dòng)態(tài)請(qǐng)求。這樣,在Nginx進(jìn)程內(nèi)部增加功能就越來越重要。
怎樣增加動(dòng)態(tài)請(qǐng)求的處理呢?最方便的是使用一些抽象了常用動(dòng)態(tài)功能的模塊,這些模塊以nginx.conf中的配置來定義web請(qǐng)求的動(dòng)態(tài)處理流程。然而,很多時(shí)候這些模塊模塊只能處理大眾化的需求,這樣程序員們只好挽起袖子直接編寫C代碼了。
但是,nginx模塊的開發(fā)門檻還挺高,需要開發(fā)者對(duì)于服務(wù)器的非阻塞調(diào)用、事件模型有較深的理解,而如果請(qǐng)求處理時(shí)需要有全局化視角時(shí),麻煩的多進(jìn)程通信又來了,開發(fā)者不能使用簡(jiǎn)單的堆分配對(duì)象,而要使用nginx_slab管理內(nèi)存。
因此,除了期待更多的開發(fā)者貢獻(xiàn)出多樣的抽象模塊,目前nginx最應(yīng)該完善的應(yīng)當(dāng)是二次開發(fā)的易用性--能夠更方便、快速的開發(fā)出高性能的nginx模塊。例如,nginx的框架可以考慮支持多線程模型,可以考慮支持ucontext協(xié)程方式,使開發(fā)時(shí)不用考慮API的異步回調(diào),不用考慮鎖的滿足條件。
CSDN:Nginx市場(chǎng)份額一直穩(wěn)步提升,您覺得Nginx未來會(huì)取代Apache嗎?
陶輝:在云與端的時(shí)代,端越來越多,云的性能就會(huì)越來越重要;而互聯(lián)網(wǎng)思維本就不高富帥,同時(shí)會(huì)服務(wù)所有草根用戶,而用戶體驗(yàn)也需要提升,所以,服務(wù)器資源的效率在企業(yè)成本上將占據(jù)越發(fā)重要的地位。從這個(gè)角度來說,Apache的市場(chǎng)份額被Nginx取代的趨勢(shì)是不會(huì)變的。
CSDN:能否談?wù)剬?duì)目前國內(nèi)云計(jì)算市場(chǎng)有什么看法?有哪些趨勢(shì)值得去關(guān)注?
陶輝:云市場(chǎng)發(fā)展開始加速,云服務(wù)提供商將開始在國計(jì)民生中扮演愈發(fā)重要的角色,社會(huì)基礎(chǔ)服務(wù)將會(huì)進(jìn)入公有云中,從而對(duì)云服務(wù)的可靠性安全性有了非常高的要求。比如,早期公有云一個(gè)技術(shù)人員眼中的小bug,這時(shí)就很可能會(huì)對(duì)社會(huì)生活造成嚴(yán)重影響。如阿里云這樣的主流公有云服務(wù)提供商必須承擔(dān)起社會(huì)使命,猶如水、電、空氣一樣不能中斷、不能出錯(cuò)地提供服務(wù)。服務(wù)質(zhì)量越來越重要。
另一方面,由于云服務(wù)提供商通過規(guī)模效應(yīng)可以提供更廉價(jià)的服務(wù),所以企業(yè)、個(gè)人都在將自己的服務(wù)上云,這又在推動(dòng)著主流云商必須思考如何以更低的成本提供服務(wù)。所以,云商必須深入到基礎(chǔ)設(shè)施中,把原先的通用性設(shè)備改造成適合云的專有設(shè)備,以此提高效率;必須提升原先不適合為云服務(wù)的管理系統(tǒng),以滿足不間斷服務(wù)的要求。例如,云商將需要自己運(yùn)維網(wǎng)絡(luò),需要與硬件廠商合作,設(shè)計(jì)適合特定場(chǎng)景的網(wǎng)卡、CPU、內(nèi)存等,軟硬結(jié)合著在底層增加效率,降低企業(yè)成本。