來源:林仕鼎的輕部落格
系統架構是一個工程和研究相結合的領域,既注重實踐又依賴理論指導,入門容易但精通很難,有時候還要講點悟性,很具有“偽科學”的特徵。要在此領域進階,除了要不斷設計並搭建實際系統,也要注意方法論和設計理念的學習和提煉。
經常有同學詢問如何學習,特貼一篇學習材料,供大家參考。09年時寫的,在系統領域浩如煙海的文獻中提取了一些我認為值得研究和學習的專案,沒包括近幾年出現的一些工作,也不夠全面。不過,其實也足夠了,看paper是一個從少到多再到少的過程。對問題本質、背景和發展歷史有大致瞭解,再輔以hands-on的實踐(長期的真正的實踐),足以摸到本領域的門徑。
此文在網上轉載不少,但多數沒有說明出處。今天在這裡重發,也順便向315致敬。
—
對於工程師來說,到一定階段後往往會遇到成長瓶頸。要突破此瓶頸,需要在所屬技術領域更深入學習,瞭解本領域的問題本質、方法論與設計理念、發展歷史等。以下提供一些架構相關領域的學習材料,附上簡單點評,供有興趣的工程師參考。希望大家能通過對這些領域的瞭解和學習,掌握更多system design principles,在自己的工作中得心應手,步入自由王國。
1. Operating Systems
Mach [Intro: http://www-2.cs.cmu.edu/afs/cs/project/mach/public/www/mach.html,Paper: http://www-2.cs.cmu.edu/afs/cs/project/mach/public/www/doc/publications.html]
傳統的kernel實現中,對中斷的響應是在一個“大函式”裡實現的。稱為大函式的原因是從中斷的入口到出口都是同一個控制流,當有中斷重入發生的時候,實現邏輯將變得非常複雜。大多數的OS,如UNIX,都採用這種monolithic kernel architecture。
1985年開始的Mach專案,提出了一種全新的microkernel結構,使得由於70年代UNIX的發展到了極致而覺得後續無枝可依的學術界頓時找到了興奮點,也開始了沸沸揚揚的monokernel與microkernel的爭論。
插播一個花絮:Mach的主導者Richard Rashid,彼時是CMU的教授,受BillGates之託去遊說JimGray加盟MS。結果把自己也被繞了進來,組建了Microsoft Research。他到中國來做過幾次21Century Computing的keynotes。
Exokernel [Intro:http://pdos.csail.mit.edu/exo/,Paper:http://pdos.csail.mit.edu/PDOS-papers.html#Exokernels]
雖然microkernel的結構很好,但實際中並沒有廣泛應用,因為performance太差,而且大家逐漸發現OS的問題並不在於實現的複雜性,而更多在於如何提高application使用資源的靈活性。這也就是在kernel extension(例如loadable module in Linux)出現後,有關OS kernel architecture的爭論就慢慢淡出人們視線的原因。
Exokernel正是在這樣的背景中出現的,它並不提供傳統OS的abstraction(process,virtual memory等),而是專注於資源隔離與複用(resource isolation and multiplexing),由MIT提出。在exokernel之上,提供了一套庫,著名的libOS,用於實現各種OS的interface。這樣的結構為application提供了最大的靈活度,使不同的application可以或專注於排程公平性或響應實時性,或專注於提高資源使用效率以優化效能。以今天的眼光來看,exokernel更像是一個virtual machine monitor。
Singularity [Intro:http://research.microsoft.com/os/Singularity/,Paper: http://www.
research.microsoft.com/os/singularity/publications/HotOS2005_BroadNewResearch.pdf]
Singularity出現在virus,spyware取之不盡、殺之不絕的21世紀初期,由Microsoft Research提出。學術界和工業界都在討論如何提供一個trust-worthy computing環境,如何使計算機系統更具有manage-ability。Singularity認為要解決這些問題,底層系統必須提供hardisolation,而以前人們都依賴的硬體virtual memory機制並無法提供高靈活性和良好效能。在.Net和Java等runtime出現之後,一個軟體級的解決方案成為可能。
Singularity在microkernel的基礎上,通過.Net構建了一套type-safed assembly作為ABI,同時規定了資料交換的message passing機制,從根本上防止了修改隔離資料的可能。再加上對application的安全性檢查,從而提供一個可控、可管理的作業系統。由於.NetCLR的持續優化以及硬體的發展,加了這些檢查後的Singularity在效能上的損失相對於它提供的這些良好特性,仍是可以接受的。
這種設計目前還處於實驗室階段,是否能最終勝出,還需要有當年UNIX的機遇。
2. Virtual Machines
VMWare [” MemoryResource Management in VMware ESX Server“,OSDI’02,Best paper award]
耳熟能詳的vmware,無需多說。
XEN [“Xen and the Art of Virtualization”, OSDI’04]
效能極好的VMM,來自Cambridge。
Denali [“Scaleand Performance in the Denali Isolation Kernel”, OSDI’02, UW]
為internetservices而設計的application level virtual machine,在普通機器上可執行數千個VMs。其VMM基於isolation kernel,提供隔離,但並不要求資源分配絕對公平,以此減少效能消耗。
Entropia [“The Entropia VirtualMachine for Desktop Grids”, VEE’05]
要統一利用公司內桌面機器資源來進行計算,需要對計算任務進行良好的包裝,以保證不影響機器正常使用並與使用者資料隔離。Entropia就提供了這樣的一個計算環境,基於windows實現了一個application level virtual machine。其基本做法就是對計算任務所呼叫的syscall進行重定向以保證隔離。類似的工作還有FVM:“AFeather-weight Virtual Machine for Windows Applications”。
3. Design Revisited
“Are Virtual Machine Monitors Microkernels Done Right?”,HotOS’05
這個題目乍聽起來,十分費解,其意思是VMMs其實就是Microkernel的正確實現方法。裡面詳細討論了VMM和Microkernel,是瞭解這兩個概念的極好參考。
“Thirty Years Is Long Enough: Getting Beyond C”, HotOS’05
C可能是這個世界上最成功的程式語言,但其缺點也十分明顯。比如不支援thread,在今天高度並行的硬體結構中顯得有點力不從心,而這方面則是functional programming language的長處,如何結合二者的優點,是一個很promising的領域。
4. Programming Model
單使用thread結構的server是很難真正做到高效能的,原因在於記憶體使用、切換開銷、同步開銷和保證鎖正確性帶來的程式設計複雜度等。
“SEDA: An Architecture for Well-Conditioned, Scalable Internet Services”,OSDI’01
Thread不好,但event也沒法解決所有問題,於是我們尋找一個結合的方法。SEDA將應用拆分為多個stage,不同stage通過queue相連線,同一個stage內可以啟動多個thread來執行queue中的event,並且可通過反饋來自動調整thread數量。
Software Transactional Memory
如果記憶體可以提供transaction語義,那麼我們面對的世界將完全兩樣,language, compiler, OS, runtime都將發生根本變化。雖然intel現在正在做hardware transactional memory,但估計可預見的將來不會商用,所以人們轉而尋求軟體解決方案。可想而知,這個方案無法base在native assembly上,目前有C#,haskell等語言的實現版本。資料比較多,參見Wikipedia。
5. Distributed Algorithms
Logical clock, [“Time,clocks, and the ordering of events in a distributed system”, Leslie Lamport, 1978]
這是一篇關於Logic clock, time stamp, distributed synchronization的經典paper。
Byzantine [“The ByzantineGenerals Problem”, Leslie Lamport, 1982]
分散式系統中的錯誤各種各樣,有出錯就能停機的,有出錯了拖後腿的,更嚴重的是出錯了會做出惡意行為的。最後的這種malicious behavior,就好像出征將軍的叛變,將會對系統造成嚴重影響。對於這類問題,Lamport提出了Byzantine failure model,對於一個由3f+1個replica組成的statemachine,只要叛變的replica數量小於等於f,整個state machine還能正常工作。
Paxos [“The part-time parliament”, Leslie Lamport, 1998]
如何在一個非同步的分散式環境中達成consensus,這是分散式演算法研究的最根本問題。Paxos是這類演算法的頂峰。不過這篇paper太難了,據說全世界就3.5人能看懂,所以Lamport後來又寫了一篇普及版paper:“Paxos Made Simple” ,不過還是很難懂。另外,也可參看Butler Lampson寫的“The ABCD’s of Paxos”(PODC’01),其中關於replicated state machine的描述會嚴重啟發你對並行世界本質的認識,圖靈獎的實力可不是蓋的。
這上面反覆出現了一個名字:Leslie Lamport,他在distributed computing這個領域挖坑不輟,終成一代宗師。關於他,也有幾則軼事。記得以前他在MSR的主頁是這麼寫的,“當我在研究logicalclock的時候,BillGates還穿著開襠褲(in diaper)…”(大意如此,原文現在找不到了)。另外,他在寫paper的時候,很喜歡把其他牛人的名字變換一下編排進去。這可能也是他還沒拿到圖靈獎的原因。
關於Lamport的其他成就,還可以參見這篇向他60歲生日獻禮的paper:“Lamport on mutual exclusion: 27 years of planting seeds”, PODC’01。
6. Overlay Networking, and P2P DHT
RON [“Resilient Overlay Networks”, SOSP’01]
RON描述瞭如何在應用層搭建一個overlay,以提供秒級廣域網網路層故障恢復速度,而現有的通過路由協議來恢復通訊的時間至少在幾十分鐘。這種快速恢復特性和靈活性使得overlay networking現在被廣泛應用。
Application Level Multicast
“End System Multicast”, SigMetrics’00
“Scalable Application Layer Multicast”, SigComm’02
關於ALM的paper很多,基本上都是描述如何搭建一個mesh network用以魯棒的傳輸控制資訊,另外再搭建一個multicast tree用以高效傳輸資料,然後再根據多媒體資料的特點做一些layered delivery。前幾年出現的coolstream, pplive等系統都是這類系統的商業化產品。
P2P
P2P的出現改變了網路。按照各種P2P網路的結構,可以分為三種。
1. Napster式,集中式目錄服務,資料傳輸Peer to peer。
2. Gnutella式,通過在鄰居間gossip來查詢,也被稱為unstructured P2P。
3. DHT,與unstructured P2P不同的是,DHT進行的查詢有保證,如果資料存在,可在一定的hop數內返回。這個hop數通常為logN,N為系統節點數。
典型的DHT有CAN, Chord,Pastry, Tapestry等四種。這些研究主要在演算法層面,系統方面的工作主要是在其上建立廣域網儲存系統。還有一些人在機制層面進行研究,例如如何激勵使用者共享、防止作弊等。
7. Distributed Systems
GFS/MapReduce/BigTable/Chubby/Sawzall
Google的系列paper,大家比較熟悉,不再多說。在此可查。
Storage
Distributed storage system的paper太多了。下面列出幾篇最相關的。
“Chain Replication for Supporting High Throughput and Availability”, OSDI’04。
“Dynamo: Amazon’s Highly Available Key-value Store”,SOSP’07。
“BitVault: a Highly Reliable Distributed Data Retention Platform”, SIGOPS OSR’07。
“PacificA: Replication inLog-Based Distributed Storage Systems”, MSR-TR。
Distributed Simulation
“Simulating Large-Scale P2P Systems with the WiDS Toolkit”, MASCOTS’05。Distributed simulation有意思的地方是simulated protocol是distributed的,而這個simulation engine本身也是distributed的。Logical和physical的time和event交雜在系統中,需要仔細處理。
8. Controversial Computing Models
現在的軟體系統已經複雜到了人已經無法掌握的程度,很多系統在釋出時都仍然帶著許多確定性(deterministic)或非確定性(non-deterministic)的bugs,只能不斷的patch。既然作為人類,不夠精細的特性決定了我們無法把系統的bug fix乾淨,我們只能從其他角度入手研究一種讓系統在這令人沮喪的環境中仍能工作的方法。這就像一個分散式系統,故障無法避免,我們選擇讓系統作為整體來提供高可靠性。
以下3個便是典型代表。基本上,主要研究內容都集中於1) 如何正確儲存狀態;2)如何捕捉錯誤並恢復狀態;3)在進行單元級恢復時,如何做到不影響整體。
Failure oblivious computing, OSDI’04
Treating Bugs as Allergies, SOSP’05
9. Debugging
系統很複雜,人類無法從邏輯上直接分析,只能通過data mining的方法在巨集觀上進行觀察。
Black box debugging 《Performance debugging for distributed systems of black boxes”, SOSP’03》
對大型系統的performance debugging非常困難,因為裡面的問題很多都是非確定性的,而且無法重現。只能通過對log的挖掘,找出配對的呼叫/訊息以定位問題。
CP-miner [“A Tool for Finding Copy-paste and Related Bugs in Operating System Code”, OSDI’04]
很多人在重用程式碼的時候,都使用copy-paste。但有時候簡單的CP會帶來嚴重的問題,例如區域性變數的重名等。CP-miner通過分析程式碼,建立語法樹結構,然後mine出這類錯誤。