周末看了一些hpc的資料,有些感想,寫出來以便拋磚引玉。

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

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

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

說了一大堆廢話,快迷糊了……越說越后悔當初沒好好學習……。

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

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

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

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

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

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

Google利用1萬多臺PC組成了廉價的分布式集群,是這個思想最成功的典范!理論每秒浮點運算數(shù)達到100T!

分而治之,任重而道遠。

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

<點擊此處討論該話題>

分享到

多易

相關(guān)推薦