【底層原理】存儲數(shù)據(jù)包的一生(上)
最近認認真真學習了一個叫《Life of a Storage Packet》講座,借助這個講座將整個存儲的過程理解了下,不放過任何一個有疑問的點。這篇文章算是對講座的理解和自己收獲的總結(jié),同時也為那些對存儲系統(tǒng)不夠了解又想要了解的初學者,展現(xiàn)一個存儲數(shù)據(jù)包的“生命”。這個演講主要聚焦在“整體的存儲”,強調(diào)存儲系統(tǒng)中各個基本元素的關(guān)系,并且盡可能簡單、清楚地用一種不同的方式可視化一些存儲的概念。
先上一張大圖,可以說這篇文章目的就是解釋這個圖:
整體視角
存儲系統(tǒng)從整體的分層一覽,包括了主機/應(yīng)用,存儲介質(zhì),存儲網(wǎng)絡(luò)。對于存儲來說就做了一件事:Here is a bit of data. Hold onto it. Give that same bit back to me when I ask for it.
Application視角
每個系統(tǒng)都有會有很多應(yīng)用程序運行在CPU上,對于這些Application來說,他們覺得自己有很多很多足夠的可用內(nèi)存。
CPU和MMU
計算機系統(tǒng)中有一個“內(nèi)存管理單元”(MMU,Memory Management Unit)的概念,MMU負責與DRAM內(nèi)存直接通信,并且獲得一些可用的“頁”
多租戶:內(nèi)存被某個進程(比如一個應(yīng)用)獨享,這些內(nèi)存不能被其他進程重寫。
地址:將CPU的物理地址翻譯成獨有的DRAM地址或者是很多行DRAMs,有了MMU以后,對于每個進程來說,他們就像是一個人獨占了所有的內(nèi)存一樣。
訪問內(nèi)存
Application在他需要訪問的時候,獲取這些內(nèi)存,在實際進行訪問時,會發(fā)生如下事情:
1:Application會問操作系統(tǒng)“Hey,我需要一些可用內(nèi)存”
2:操作系統(tǒng)向MMU說,“能給我一些可以使用內(nèi)存頁不?”
3:MMU把一些可用的內(nèi)存頁給操作系統(tǒng)
4:操作系統(tǒng)把這些可用的內(nèi)存頁給Application。
分配內(nèi)存
在上圖中,獲取的那些內(nèi)存,實際是可以分布在內(nèi)存中的任何地方的(非連續(xù)),MMU在把這些內(nèi)存給應(yīng)用的時候會進行初始化操作,當然,當應(yīng)用不再訪問這些內(nèi)存頁的時候,也會MMU也會負責回收這些內(nèi)存。
加速訪問
如果Application對內(nèi)存的訪問,每次都要都要從MMU獲取的話,那太慢了,因此有個經(jīng)驗法則是:Always put storage/memory as close to the CPU as possible
可以說在存儲中,改善時間的限制是永恒不變的主題,然后訪問DRAM的話,需要60-100ns的時間。我們需要更快的訪問,甚至達到“0”時間訪問。
緩存的魔法
于是在CPU中增加了一些緩存,當然緩存也是分級別的,對于L1緩存大概花費1ns以內(nèi),L2緩存大概花費3-6ns,沒錯,這使得每次訪問從60-100ns提升了幾十倍!
更多的空間
如果DRAM中也沒有足夠的空間時,這是你需要更多的持久化存儲,比如說磁盤。當然直接去訪問磁盤會非常的昂貴,當然這里指的是時間的花費非常昂貴。
在Jeff Dean大神的Software Engineering Advice from Building Large-Scale Distributed Systems給出了數(shù)據(jù):L1緩存、L2緩存、主存、硬盤的訪問分別是1ns、5ns、100ns、10,000,000ns級別;
舉個比較形象的例子:你需要快遞送個包裹,快遞一個1公里(L1)、5公里(L2)外的包裹,oops,可能馬云爸爸保證當日達;快遞100公里(DRAM)的包裹,11點前下單,當日達,不能再快了??;快遞1000萬公里(Disk)的快遞,啊親,你真的需要快遞嗎?這可是從地球到月球(38.4萬公里)十幾個來回的距離啊親。
小結(jié)
存儲設(shè)備和RAM不太一樣,不會和CPU直接進行“對話”,而是有一些其他的部分來幫助他們完成對話,我們在下文從存儲視角進一步去講述。