分而治之----中國成語前端
週末看了一些hpc的資料,有些感想,寫出來以便拋磚引玉。linux
計算機技術已經發展了半個世紀了,短短几十年內,發展了到了如今的程度,並有加速的趨勢,讓人一時沒法相信。早期的計算機,個把cpu,幾M內存,半落軟盤,內存總線,io總線,接個ascII字符顯示器,完事了,沒有什麼操做系統之說。想運行什麼程序,插入存有程序的軟盤,上電,運行程序,完畢,結束,下電。記得我小學34年紀的時候,學校裏還有幾十臺apple機,那時候不到10歲,也就91年左右吧,居然在老師的教導下,用好像是logo語言(一個綠色烏龜)在屏幕上畫圖,如今想一想真是難以想象。估計當時的計算機老師如今也該是頂極高手了。(如今我卻只能看printf(hello world),其餘代碼一律看不懂,慚愧慚愧)那時候的apple機,不知道是什麼架構,記得好像有軟驅,忘了怎麼開機了,好像是先顯示器,後主機,啓動的時候顯示什麼也忘了。初期,硬件方面,除了cpu、「二喬」以外,沒有任何其餘控制器芯片存在於主板上,也沒有文件系統,想把程序運行數據保存在軟盤或者磁盤上,只能靠你本身寫程序操做磁盤,也沒有所謂文件的概念。算法
幸虧沒留級,上了中學,學校退休老師響應了國家號召,下海,開了電腦班賺外塊,我參加了,機器用的是486的。這個時期,硬件方面,有了專門的顯示適配器(sis系列的),有了io控制器,之前這二者的功能通通由cpu來實現。軟件方面,蓋茨團伙已經開發出了dos操做系統,以及美國的大學開發的unix系列。應用程序不再用從頭寫到尾了,操做系統的文件系統已經給你準備好了接口,你只要告訴os建立,讀,寫文件就能夠了。在屏幕上輸出不再用一句一句寫代碼了,一個printf()就好了(看來我tm還真就只會這一句了),printf會調用顯示適配器驅動程序提供的api,在屏幕上顯示圖象和字符。數據庫
好不容易熬到了高中。這個時候,大奔出來了,多媒體計算機出來了,聲卡也有了,固然那時候還基本靠cpu來運算髮聲(軟聲卡),不像如今的。網卡也有了。磁盤控制器也加入了raid功能。後端
說了一大堆廢話,快迷糊了。。。越說越後悔當初沒好好學習。。。。。api
進入正題,我想說的是:分而治之中的「分」字。顯示輸出,音頻輸入輸出,以太網編碼×××,磁盤io控制器,這些就像cpu的手臂同樣,屬於「分」的概念,甚至如今還在不停的分,好比ToE,把tcpip協議處理從cpu轉移到獨立的芯片上,又好比大型機的前置處理機,好比dcp,3270等,這些「分而治之」的思想,體現了什麼? 是分佈式! san的出現,把磁盤子系統徹底從主機獨立還來,分而治之! NAS的出現,把文件系統從主機分出了一部分,由單獨的nas來處理,而後呈現給os,這也體現了一個「分」字。OSI分了7層,也體現了一個分!raid技術將數據分塊存放在多塊磁盤上,正是「分而治之「思想的完美體現。服務器
再來看hpc中的內容,這裏面的「分」的思想就數不勝數了。好比,傳統smp架構,存在總線共享的問題,好,那就分,用crossbar也好,infiniband也好,sci也好,都成了交換架構,解決cache一致性問題,不再用總線廣播了,只需向曾經讀取過對應cache塊的節點處理機發送失效信號即可,而這是共享總線作做不到的。軟件方面,因爲在集羣系統中,使用廉價的pc server作節點,在沒有san後端存儲的狀況下,基於本地磁盤的io吞吐量瓶頸很大,遠達不到科學計算的要求,怎麼辦呢?分吧!把數據分別存放在各個節點,把各個節點的direct attached的磁盤存儲資源,整合成一個大的共享存儲資源,這樣齊心協力,提升io吞吐量,這就是分佈式文件系統的效能,固然做用還不止這些,不如這些fs通常都支持多節點能夠讀寫同一個文件,利用加鎖機制。經過集羣網絡通訊,保持數據的一致性。在用san作後端存儲的條件下,吞吐量問題是緩解了,可是文件共享問題仍是沒有解決,雖然能夠用nfs之類的nas解決,可是nas須要在san前端加nas頭,這個是很大的瓶頸所在。因此出現了專門針對san的集羣文件系統,用來解決共享問題,好比sanery以及其升級版合標準化版sanfs,以及國內的BWFS等。這些sanfs,即保證了各個主機對san有直接訪問權,消除了nas頭形成的瓶頸,又保證了不會形成衝突(用metadata server控制)。網絡
針對分佈式並行處理集羣,開發了通用api,好比MPI等等,讓程序能夠充分利用分佈式資源。架構
一篇清華大學的碩士論文,論述了一種利用獨立日誌磁盤來同步磁盤數據的技術。日誌是用來保證文件系統一致性的廣泛利用的技術,好比數據庫這種必須保證數據一致性的環境,其原理就是io操做數據先寫入日誌,當日志寫完後即告成功,而後再從日誌中將數據異步的後臺轉移到數據區磁盤空間,換句話說,日誌提供了了一個磁盤io緩衝區,這個緩衝區雖然提升不了io性能(由於是磁盤io不是ramio),可是他極大的保證了數據一致性,相比用沒有掉電保護的ram來作緩衝區的作法,這種方式廉價,但性能很低。 有了日誌緩衝區,即使忽然掉電,日誌仍然保存在磁盤上,能夠下次上電的時候從日誌將數據恢復到數據區。可是保障了可靠性,就要犧牲性能,因爲日誌寫到此盤上,形成了io的瓶頸,雖然前端數據庫實例能夠併發,可是寫日誌,仍然是串行寫入,並且還必須面對磁盤的io瓶頸。要提升性能,就要提升成本,好比,不用磁盤來保存日誌數據,用nvram,這樣成本過高。好比netapp的nas系統中用的raid4,雖然存在校驗盤過熱現象,可是經過增長nvram(也能夠經過增長cache,可是cache貴,沒有掉電保護),成功瞭解決了raid4校驗盤過熱的狀況。 一樣清華的這個fastsync日誌記錄系統,其基本原理是這樣的:即利用單獨的日誌記錄盤,而不是集成在數據區raid group中分出的lun來記錄日誌,爲何這麼作呢?由於他用了一種特殊的算法,即每一個磁道只記錄一條到3條日誌,並且,經過預測磁頭所處的位置的算法,在當前磁頭所處的磁道處,不用尋道,就在當前位置進行寫操做,當前磁道寫一條或者3條日誌,而後切換到下一磁道,繼續寫,而他參考的前人一篇論文,那篇論文是每一個磁道只寫一個日誌,而後換道,這種一對一的方法,對小的io比較有效,可是對大量快速到來的io,換道將是一個耗時的操做,因此fastsync作了一些改進,即經過實驗,發現每磁道寫3條日誌,比較適合快速的,大塊的io環境,因此fastsync能夠根據io速度和大小來自動調整寫磁道策略。經過實驗,發現這種架構比傳統方式快了5倍。 這種作法看似比較不錯,不知道有沒有實際應用過,並且,對於如今的盤陣系統,若是追求高性能,能夠把cache設置爲write back,這樣一樣保證了高io速率,並且cache也有電池保護,因此fastsync要想打贏,還有不少工做要作,不過對於追求性價比的用戶,fastsync不妨是個選擇。由於fastsync實現機制涉及到了底層的改變,並且linux沒有提供相應的接口來獲取磁頭當前位置的信息,因此須要從新編譯linux內核。併發
再來看一下LB集羣,將用戶的請求,按照必定策略輪詢重定向到後端的多臺服務器上,實現負載均衡,這也是分的思想。軟件好比linux下的LVS,硬件產品好比F5,radware,甚至普通的cisco路由器也能夠經過NAT來完成簡單的輪詢。
是什麼促使了分而治之?就是一個速度,一個價格,衆人拾柴火焰高。
分而治之,任重而道遠。