周末看了一些hpc的資料,有些感想,寫(xiě)出來(lái)以便拋磚引玉。

計(jì)算機(jī)技術(shù)已經(jīng)發(fā)展了半個(gè)世紀(jì)了,短短幾十年內(nèi),發(fā)展了到了現(xiàn)在的程度,并有加速的趨勢(shì),讓人一時(shí)無(wú)法相信。早期的計(jì)算機(jī),個(gè)把CPU,幾MB內(nèi)存,半拉軟盤(pán),內(nèi)存總線(xiàn),IO總線(xiàn),接個(gè)ASCII字符顯示器,完事了,沒(méi)有什么操作系統(tǒng)之說(shuō)。想運(yùn)行什么程序,插入存有程序的軟盤(pán),上電,運(yùn)行程序,完畢,結(jié)束,下電。記得我小學(xué)三、四年級(jí)的時(shí)候,學(xué)校里還有幾十臺(tái)Apple機(jī),那時(shí)候不到10歲,也就在91年左右吧,竟然在老師的教導(dǎo)下,用好像是logo語(yǔ)言(一個(gè)綠色烏龜)在屏幕上畫(huà)圖,現(xiàn)在想想真是不可思議。估計(jì)當(dāng)時(shí)的計(jì)算機(jī)老師現(xiàn)在也該是頂級(jí)高手了(現(xiàn)在我卻只能看printf(hello world),其他代碼一概看不懂,慚愧慚愧)。那時(shí)候的Apple機(jī),不知道是什么架構(gòu),記得好像有軟驅(qū),忘了怎么開(kāi)機(jī)了。順序好像是先顯示器,后主機(jī),啟動(dòng)的時(shí)候顯示什么也忘了。初期,硬件方面,除了CPU、“二喬”之外,沒(méi)有任何其他控制器芯片存在于主板上,也沒(méi)有文件系統(tǒng)。想把程序運(yùn)行數(shù)據(jù)保存在軟盤(pán)或者磁盤(pán)上,只能靠你自己寫(xiě)程序操作磁盤(pán),也沒(méi)有所謂文件的概念。

幸好沒(méi)留級(jí),上了中學(xué)。學(xué)校退休老師響應(yīng)了國(guó)家號(hào)召,下海,開(kāi)了電腦班賺外快。我參加了,機(jī)器用的是486的。這個(gè)時(shí)期,硬件方面有了專(zhuān)門(mén)的顯示適配器(sis系列的),有了IO控制器。以前這兩者的功能統(tǒng)統(tǒng)由CPU來(lái)實(shí)現(xiàn)。軟件方面,蓋茨團(tuán)伙已經(jīng)開(kāi)發(fā)出了DOS操作系統(tǒng),以及美國(guó)的大學(xué)開(kāi)發(fā)的Unix系列。應(yīng)用程序再也不用從頭寫(xiě)到尾了,操作系統(tǒng)的文件系統(tǒng)已經(jīng)給你準(zhǔn)備好了接口,你只要告訴OS創(chuàng)建、讀、寫(xiě)文件就可以了。在屏幕上輸出再也不用一句一句寫(xiě)代碼了,一個(gè)printf()就行了(看來(lái)我TMD還真就只會(huì)這一句了),printf會(huì)調(diào)用顯示適配器驅(qū)動(dòng)程序提供的API,在屏幕上顯示圖象和字符。

好不容易熬到了高中。這個(gè)時(shí)候,大奔出來(lái)了,多媒體計(jì)算機(jī)出來(lái)了,聲卡也有了。當(dāng)然那時(shí)候還基本靠cpu來(lái)運(yùn)算發(fā)聲(軟聲卡),不像現(xiàn)在的。網(wǎng)卡也有了。磁盤(pán)控制器也加入了RAID功能。

說(shuō)了一大堆廢話(huà),快迷糊了……越說(shuō)越后悔當(dāng)初沒(méi)好好學(xué)習(xí)……。

進(jìn)入正題,我想說(shuō)的是:“分而治之”中的“分”字。顯示輸出,音頻輸入輸出,以太網(wǎng)編碼解碼器,磁盤(pán)IO控制器,這些就像CPU的手臂一樣,屬于“分”的概念,甚至現(xiàn)在還在不停的分。比如ToE,把TCP/IP協(xié)議處理從CPU轉(zhuǎn)移到獨(dú)立的芯片上。又比如大型機(jī)的前置處理機(jī),比如DCP,3270等,這些“分而治之”的思想,體現(xiàn)了什么? 是分布式!SAN的出現(xiàn),把磁盤(pán)子系統(tǒng)完全從主機(jī)獨(dú)立還來(lái),分而治之!NAS的出現(xiàn),把文件系統(tǒng)從主機(jī)分出了一部分,由單獨(dú)的NAS來(lái)處理,然后呈現(xiàn)給OS,這也體現(xiàn)了一個(gè)“分”字。OSI分了7層,也體現(xiàn)了一個(gè)分!RAID技術(shù)將數(shù)據(jù)分塊存放在多塊磁盤(pán)上,正是“分而治之“思想的完美體現(xiàn)。

再來(lái)看hpc中的內(nèi)容,這里面的“分”的思想就數(shù)不勝數(shù)了。比如,傳統(tǒng)SMP架構(gòu),存在總線(xiàn)共享的問(wèn)題。好,那就分,用Crossbar也好,Infiniband也好,SCI也好,都成了交換架構(gòu),解決Cache一致性問(wèn)題,再也不用總線(xiàn)廣播了,只需向曾經(jīng)讀取過(guò)對(duì)應(yīng)Cache塊的節(jié)點(diǎn)處理機(jī)發(fā)送失效信號(hào)便可,而這是共享總線(xiàn)做做不到的。軟件方面,由于在集群系統(tǒng)中,使用廉價(jià)的PC Server做節(jié)點(diǎn),在沒(méi)有SAN后端存儲(chǔ)的情況下,基于本地磁盤(pán)的IO吞吐量瓶頸很大,遠(yuǎn)達(dá)不到科學(xué)計(jì)算的要求,怎么辦呢?分吧!把數(shù)據(jù)分別存放在各個(gè)節(jié)點(diǎn),把各個(gè)節(jié)點(diǎn)的Direct Attached的磁盤(pán)存儲(chǔ)資源,整合成一個(gè)大的共享存儲(chǔ)資源,這樣齊心合力,提高IO吞吐量,這就是分布式文件系統(tǒng)的效能。當(dāng)然作用還不止這些,不如這些FS一般都支持多節(jié)點(diǎn)可以讀寫(xiě)同一個(gè)文件,利用加鎖機(jī)制。通過(guò)集群網(wǎng)絡(luò)通信,保持?jǐn)?shù)據(jù)的一致性。在用SAN做后端存儲(chǔ)的條件下,吞吐量問(wèn)題是緩解了,但是文件共享問(wèn)題還是沒(méi)有解決,雖然可以用NFS之類(lèi)的NAS解決,但是NAS需要在SAN前端加NAS頭,這個(gè)是很大的瓶頸所在。所以出現(xiàn)了專(zhuān)門(mén)針對(duì)SAN的集群文件系統(tǒng),用來(lái)解決共享問(wèn)題,比如SANery以及其升級(jí)版合標(biāo)準(zhǔn)化版SANfs,以及國(guó)內(nèi)的BWFS等。這些SANfs,即保證了各個(gè)主機(jī)對(duì)SAN有直接訪(fǎng)問(wèn)權(quán),消除了NAS頭造成的瓶頸,又保證了不會(huì)造成沖突(用Metadata Server控制)。

針對(duì)分布式并行處理集群,開(kāi)發(fā)了通用API,比如MPI等等,讓程序可以充分利用分布式資源。

一篇清華大學(xué)的碩士論文,論述了一種利用獨(dú)立日志磁盤(pán)來(lái)同步磁盤(pán)數(shù)據(jù)的技術(shù)。日志是用來(lái)保證文件系統(tǒng)一致性的普遍利用的技術(shù),比如數(shù)據(jù)庫(kù)這種必須保證數(shù)據(jù)一致性的環(huán)境,其原理就是IO操作數(shù)據(jù)先寫(xiě)入日志,當(dāng)日志寫(xiě)完后即告成功,然后再?gòu)娜罩局袑?shù)據(jù)異步的后臺(tái)轉(zhuǎn)移到數(shù)據(jù)區(qū)磁盤(pán)空間,換句話(huà)說(shuō),日志提供了了一個(gè)磁盤(pán)IO緩沖區(qū),這個(gè)緩沖區(qū)雖然提高不了IO性能(因?yàn)槭谴疟P(pán)IO不是RAM IO),但是他極大的保證了數(shù)據(jù)一致性,相比用沒(méi)有掉電保護(hù)的RAM來(lái)做緩沖區(qū)的做法,這種方式廉價(jià),但性能很低。 有了日志緩沖區(qū),即便突然掉電,日志仍然保存在磁盤(pán)上,可以下次上電的時(shí)候從日志將數(shù)據(jù)恢復(fù)到數(shù)據(jù)區(qū)。但是保障了可靠性,就要犧牲性能,由于日志寫(xiě)到此盤(pán)上,造成了IO的瓶頸,雖然前端數(shù)據(jù)庫(kù)實(shí)例可以并發(fā),但是寫(xiě)日志,仍然是串行寫(xiě)入,而且還必須面對(duì)磁盤(pán)的IO瓶頸。要提高性能,就要提高成本,比如,不用磁盤(pán)來(lái)保存日志數(shù)據(jù),用NVRAM,這樣成本太高。比如NetApp的NAS系統(tǒng)中用的RAID4,雖然存在校驗(yàn)盤(pán)過(guò)熱現(xiàn)象,但是通過(guò)增加NVRAM(也可以通過(guò)增加Cache,但是Cache貴,沒(méi)有掉電保護(hù)),成功了解決了RAID4校驗(yàn)盤(pán)過(guò)熱的情況。 同樣清華的這個(gè)fastsync日志記錄系統(tǒng),其基本原理是這樣的:即利用單獨(dú)的日志記錄盤(pán),而不是集成在數(shù)據(jù)區(qū)RAID group中分出的lun來(lái)記錄日志,為什么這么做呢?因?yàn)樗昧艘环N特殊的算法,即每個(gè)磁道只記錄一條到3條日志,而且,通過(guò)預(yù)測(cè)磁頭所處的位置的算法,在當(dāng)前磁頭所處的磁道處,不用尋道,就在當(dāng)前位置進(jìn)行寫(xiě)操作,當(dāng)前磁道寫(xiě)一條或者3條日志,然后切換到下一磁道,繼續(xù)寫(xiě),而他參考的前人一篇論文,那篇論文是每個(gè)磁道只寫(xiě)一個(gè)日志,然后換道,這種一對(duì)一的方法,對(duì)小的IO比較有效,但是對(duì)大量快速到來(lái)的IO,換道將是一個(gè)耗時(shí)的操作,所以fastsync做了一些改進(jìn),即通過(guò)實(shí)驗(yàn),發(fā)現(xiàn)每磁道寫(xiě)3條日志,比較適合快速的,大塊的IO環(huán)境,所以fastsync可以根據(jù)IO速度和大小來(lái)自動(dòng)調(diào)整寫(xiě)磁道策略。通過(guò)實(shí)驗(yàn),發(fā)現(xiàn)這種架構(gòu)比傳統(tǒng)方式快了5倍。 這種做法看似比較不錯(cuò),不知道有沒(méi)有實(shí)際應(yīng)用過(guò),而且,對(duì)于現(xiàn)在的盤(pán)陣系統(tǒng),如果追求高性能,可以把Cache設(shè)置為write back,這樣同樣保證了高IO速率,而且Cache也有電池保護(hù),所以fastsync要想打贏,還有很多工作要做,不過(guò)對(duì)于追求性?xún)r(jià)比的用戶(hù),fastsync不妨是個(gè)選擇。因?yàn)閒astsync實(shí)現(xiàn)機(jī)制涉及到了底層的改變,而且Linux沒(méi)有提供相應(yīng)的接口來(lái)獲取磁頭當(dāng)前位置的信息,所以需要重新編譯Linux內(nèi)核。

再來(lái)看一下LB集群,將用戶(hù)的請(qǐng)求,按照一定策略輪詢(xún)重定向到后端的多臺(tái)服務(wù)器上,實(shí)現(xiàn)負(fù)載均衡,這也是分的思想。軟件比如Linux下的LVS,硬件產(chǎn)品比如F5,radware,甚至普通的Cisco路由器也可以通過(guò)NAT來(lái)完成簡(jiǎn)單的輪詢(xún)。

是什么促使了分而治之?就是一個(gè)速度,一個(gè)價(jià)格,眾人拾柴火焰高。

Google利用1萬(wàn)多臺(tái)PC組成了廉價(jià)的分布式集群,是這個(gè)思想最成功的典范!理論每秒浮點(diǎn)運(yùn)算數(shù)達(dá)到100T!

分而治之,任重而道遠(yuǎn)。

文章版權(quán)歸DoSTOR及作者本人所有,如需轉(zhuǎn)載,請(qǐng)與本站聯(lián)系。

<點(diǎn)擊此處討論該話(huà)題>

分享到

多易

相關(guān)推薦