關(guān)于軟硬件誰(shuí)為主導(dǎo)這個(gè)話題,套用一句諺語(yǔ)就是三十年河?xùn)|三十年河西,風(fēng)水輪流轉(zhuǎn)。軟件和硬件一定是相互促進(jìn)、相互拆臺(tái)又相互搭臺(tái)的。一些之前被詬病的上層架構(gòu),或許若干年之后會(huì)被發(fā)現(xiàn)成了最合適的選擇,而再過(guò)若干年,又會(huì)變得不合適。軟件定義亦或是硬件定義,同樣也是這樣,硬件定義的結(jié)果是性能夠強(qiáng)但是不靈活,此時(shí)軟件定義便會(huì)開(kāi)始醞釀翻盤(pán),但是任何事情都有慣性,軟件“過(guò)度”定義之后,會(huì)發(fā)現(xiàn)很多事情搞不定,還得靠硬件來(lái)加速一下,此時(shí)開(kāi)始進(jìn)入硬件定義周期,然后循環(huán)往復(fù)。我們可以用幾個(gè)例子來(lái)窺探一下這種規(guī)律。
CPU和OS
一對(duì)不離不棄的夫妻,陰抱陽(yáng),陽(yáng)抱陰。一開(kāi)始沒(méi)有所謂中斷,更沒(méi)有所謂OS,只有順序執(zhí)行指令計(jì)算機(jī)和被寫(xiě)死的程序,很不靈活。后來(lái)才有了OS,CPU先執(zhí)行OS這個(gè)大循環(huán)程序,然后載入所需要執(zhí)行的用戶(hù)程序執(zhí)行,執(zhí)行完退出,可以繼續(xù)載入其他程序執(zhí)行。哪怕最簡(jiǎn)單的OS要想玩轉(zhuǎn),CPU起碼也得至少提供IO和時(shí)鐘中斷機(jī)制。OS呱呱墜地,就得不斷長(zhǎng)大,不斷地進(jìn)化,單任務(wù)不靈活,就得多任務(wù)分時(shí)執(zhí)行,所有任務(wù)共享內(nèi)存空間,導(dǎo)致了安全性問(wèn)題,這就不得不引入虛擬內(nèi)存技術(shù),所以軟件越來(lái)越復(fù)雜,性能逐漸就不行了。此時(shí)CPU出來(lái)說(shuō)話了,我來(lái)搞定虛擬內(nèi)存,提供頁(yè)表極致,提供專(zhuān)用的控制寄存器,并提供專(zhuān)用的查表加速硬件部件。多任務(wù)分時(shí)OS的生產(chǎn)力被初步釋放,但是性能還是較差,還得依靠CPU搞定。CPU繼續(xù)發(fā)力,引入超線程技術(shù),讓多個(gè)線程的代碼可以并發(fā)執(zhí)行,這得益于流水線的設(shè)計(jì);為了能夠更好的實(shí)現(xiàn)線程并發(fā)執(zhí)行,后來(lái)繼續(xù)出現(xiàn)多核心多CPU的SMP技術(shù), OS不得不做出改動(dòng)。但是多CPU/核心并不是任何時(shí)候都很高效地并發(fā)多線程的,隨著軟件復(fù)雜度提升,線程同步、緩存一致性等問(wèn)題導(dǎo)致需要大量狀態(tài)和數(shù)據(jù)同步,傳統(tǒng)的共享式的前端總線效率太低,所以不得不改為交換式Fabric比如IntelQPI,訪問(wèn)內(nèi)存經(jīng)過(guò)太多跳器件效率上不去,所以也改為直連CPU分布式共享架構(gòu),這也是當(dāng)今的形態(tài)。再往后會(huì)怎么發(fā)展,應(yīng)該可以順著慣性往前推導(dǎo)一下,交換式Fabric的出現(xiàn),意味著CPU和CPU之間可以離得越來(lái)越遠(yuǎn),只要有足夠高速的鏈路連接,這一形態(tài)其實(shí)就是大型NUMA計(jì)算機(jī)的形態(tài)了。這一形態(tài)的輪回意味著軟件架構(gòu)的變化,傳統(tǒng)領(lǐng)域需要高性能的場(chǎng)景不得不使用大型機(jī)、小型機(jī),但它們是極其昂貴的——就是因?yàn)椴婚_(kāi)放,而且又不可能像互聯(lián)網(wǎng)領(lǐng)域一樣投入開(kāi)發(fā)資源在分布式系統(tǒng)上定制化自己的應(yīng)用。而開(kāi)放式大型NUMA系統(tǒng)出現(xiàn)之后,可能之前的被“過(guò)度”定義了的分布式系統(tǒng)生態(tài)又會(huì)沉寂下來(lái),這個(gè)循環(huán)進(jìn)入新的周期紀(jì)元,在這個(gè)紀(jì)元里,曾經(jīng)光鮮的分布式系統(tǒng)可能會(huì)被新生代工程師/架構(gòu)師認(rèn)為是一種很不可思議的“野路子”:“你看,以前這種架構(gòu),好坑爹啊!”。這就像我們現(xiàn)在回頭看之前的有些設(shè)計(jì)一樣,也會(huì)感覺(jué)到不可思議,那時(shí)候的人都這么“腦殘”么?恩,如果換了你回到那個(gè)時(shí)代,或許更腦殘:)。不管誰(shuí)腦殘,一個(gè)事實(shí)是始終不變的,那就是硬件性能的絕對(duì)值是一直直線上升的,不管分布式還是集中式。
CPU和VMM
VMM能發(fā)展到今天這個(gè)地步是無(wú)人始料的,一開(kāi)始就是玩玩,沒(méi)想到玩了個(gè)大的出來(lái)。有不少人持有上述觀點(diǎn),其實(shí)這個(gè)觀點(diǎn)只是表象。虛擬機(jī)技術(shù)起源于大型機(jī),中小型機(jī)上早已也使用了多年,所以VMM可并不是玩玩。大機(jī)小機(jī)都是封閉市場(chǎng),技術(shù)也確實(shí)牛。開(kāi)放市場(chǎng)領(lǐng)域很多技術(shù)其實(shí)都是源自大型機(jī)小型機(jī)。虛擬機(jī)顯然是單機(jī)性能過(guò)剩,而多機(jī)整體資源又無(wú)法得到全局細(xì)粒度池化分配時(shí)代的產(chǎn)物。VMM虛擬CPU,虛擬IO設(shè)備,虛擬內(nèi)存,一開(kāi)始全用軟件實(shí)現(xiàn),每一條指令解釋執(zhí)行,后來(lái)優(yōu)化了設(shè)計(jì),但最終還是要監(jiān)控和截獲+虛擬那些敏感和特權(quán)指令,每個(gè)進(jìn)程還要虛擬出額外頁(yè)表從而虛擬內(nèi)存,IO需要經(jīng)歷重重內(nèi)存拷貝才能發(fā)出去一個(gè)包,要想商用的話,軟件各方面開(kāi)銷(xiāo)實(shí)在是搞不定了,此時(shí)還得硬件出馬,在CPU層面提供硬件輔助,IO設(shè)備也開(kāi)始有了SRIOV/MRIOV的方案,我總感覺(jué)這次硬件反而有點(diǎn)“過(guò)度”定義了,被軟件騙了一回。為什么呢?就因?yàn)橛布Y源不能做到池化和細(xì)粒度切分,才會(huì)產(chǎn)生VMM這個(gè)尷尬的東西,而此時(shí)硬件仿佛走火入魔了,弄出一系列復(fù)雜的技術(shù)來(lái)支撐VMM。其實(shí)硬件還有另一條路可以走,同樣可以實(shí)現(xiàn)VMM類(lèi)似的效果,那就是讓硬件變得可以切分,而不是用軟件去切分。這條路在小機(jī)系統(tǒng)上曾經(jīng)有人嘗試過(guò),采用總線級(jí)別的隔離開(kāi)關(guān)來(lái)切分不同的CPU和內(nèi)存以及IO槽位。要實(shí)現(xiàn)細(xì)粒度切分的前提是必須把硬件最小切分粒度降下來(lái),單CPU使勁增加性能其實(shí)已經(jīng)不是一條比較明智的路線了。近幾年眾核CPU不斷冒出頭來(lái),單CPU128個(gè)核心已經(jīng)不是什么驚訝之事了,但是由于生態(tài)尚未成熟,它們目前仍被局限在并行度高耦合度低的處理場(chǎng)景比如網(wǎng)絡(luò)包處理等。另一個(gè)跡象就是ARM生態(tài)的崛起,種種跡象表明這很有可能是一條光明大道。但是如何將傳統(tǒng)生態(tài)導(dǎo)向這個(gè)道路上就不那么簡(jiǎn)單了。我們看到Intel正在搞SiPh硅光方案,其致力于硬件資源的靈活拼搭,如果粒度足夠細(xì),VMM其實(shí)就可以退出舞臺(tái)了,這將又是一場(chǎng)硬件拆臺(tái)軟件的血腥戰(zhàn)斗。
虛擬機(jī)和云計(jì)算
虛擬機(jī)的發(fā)展催生硬件加速方案,也正是因?yàn)橛布铀?,又使得虛擬機(jī)可以大范圍應(yīng)用,也正是如此,才將云計(jì)算的概念帶了出來(lái),也就是硬件又反過(guò)來(lái)加速了軟件的變革。而隨著量的上升,會(huì)影響質(zhì)變,人們會(huì)發(fā)現(xiàn)其實(shí)VM這種東西是非常低效的虛擬化,VMM個(gè)人理解其實(shí)是一股具有邪性的陽(yáng)氣,他看似光鮮實(shí)則非常損耗陰實(shí)的,體現(xiàn)為過(guò)多不必要的操作系統(tǒng)實(shí)例。操作系統(tǒng)本來(lái)就是利用線程/進(jìn)程來(lái)虛擬化多任務(wù)多用戶(hù)的運(yùn)行,每一次系統(tǒng)調(diào)用的開(kāi)銷(xiāo)是非常高的,讓一個(gè)CPU同時(shí)運(yùn)行多個(gè)操作系統(tǒng)實(shí)例,無(wú)疑是極大的浪費(fèi),上文提到過(guò)這種模式是單機(jī)性能過(guò)剩而整體資源又無(wú)法得到池化時(shí)代的產(chǎn)物。而云計(jì)算架構(gòu)的出現(xiàn),會(huì)打破這個(gè)矛盾。云計(jì)算可能初生的時(shí)候就是一個(gè)全局虛擬機(jī)資源調(diào)度管理軟件框架,但是一個(gè)事物畢竟是不斷在成長(zhǎng)進(jìn)化的,云計(jì)算會(huì)最終找到它的使命,那就是大范圍全局資源的池化、分配調(diào)度管理監(jiān)控,也就是數(shù)據(jù)中心級(jí)的OS,做的事情與單機(jī)OS如出一轍。既然如此,那么AAAS(ApplicationAs a Service)應(yīng)該是云計(jì)算最終要實(shí)現(xiàn)的狀態(tài),這就相當(dāng)于打開(kāi)屏幕,就出現(xiàn)一堆應(yīng)用圖標(biāo),點(diǎn)進(jìn)去完成你要的功能,退出,結(jié)束。既然用戶(hù)不需要IAAS,不需要直接面對(duì)操作系統(tǒng),那么搞那么多VM實(shí)例其實(shí)就是沒(méi)有必要的,空耗資源。云計(jì)算需要實(shí)現(xiàn)一個(gè)全局的應(yīng)用進(jìn)程級(jí)別的調(diào)度中樞,而不是調(diào)度VM。再來(lái)思考一下大機(jī)為什么需要VM?因?yàn)榇髾C(jī)那個(gè)時(shí)代并沒(méi)有現(xiàn)在這種云計(jì)算的概念,xAAS這個(gè)思維,你可以說(shuō)那時(shí)候人腦殘,那時(shí)候軟件技術(shù)是很封閉而且不發(fā)達(dá)的,所以進(jìn)行資源細(xì)粒度切分,用VM也算是快刀斬亂麻的方案。我們也看到進(jìn)程級(jí)虛擬機(jī)(比如LinuxContainer)業(yè)逐漸在受到關(guān)注。這些都是云計(jì)算這個(gè)軟件框架、這個(gè)宏觀的OS的定義,那么這種定義會(huì)對(duì)硬件有什么影響?我想那一定會(huì)催生兩個(gè)硬件形態(tài)的變革,一個(gè)就是上面所說(shuō)的單點(diǎn)的性能要足夠低,力度要足夠細(xì),單點(diǎn)性能“足夠低”,這可能讓人大跌眼鏡,不過(guò)將來(lái)可真說(shuō)不定啊,眾核CPU就是個(gè)很好的胚子;另一個(gè)是局部多層高速Fabric核間通信,由于CPU/核心可以任意切分和組合,他們之間一定需要一個(gè)高速總線相互連接,目前存在多種Fabric方案和產(chǎn)品,這塊雖然比較低調(diào)冷門(mén)但是也還算成熟,加上硅光等技術(shù)會(huì)將Fabric隱身至機(jī)架外,這就為大范圍池化提供了支撐。而這次硬件的變革很可能又會(huì)影響軟件的架構(gòu),使得大規(guī)模并行計(jì)算不再需要MPI等遠(yuǎn)程消息傳遞機(jī)制,消息傳遞直接使用Fabric硬件加速的隊(duì)列FIFO,會(huì)大大簡(jiǎn)化編程,有利于HPC的模式最終可以全面得到普及。
云計(jì)算,宏觀操作系統(tǒng),數(shù)據(jù)中心級(jí)的NUMA機(jī),一切皆有可能。