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