ssd 工作原理

NAND工作原理 


首先我們來看下,作爲L63B顆粒,Intel/Micron的34nm 4KB page的顆粒,內部結構是這樣的。

wKiom1O6oxzQM4IyAACXY2dzEKg085.jpg

1個page爲4KB,1個Block爲256個page組成,1個Plane由2048個Block組成,2個Plane組成1個Die,也就是最小的芯片(4GB),X25-M 80G Gen2 SSD上面我們看到10個顆粒,每個顆粒是8GB的,就是由2個Die封裝起來的。  

Page爲最小的讀寫單位,Block爲最小的擦除/編程單位。接下來,我來假設一個主控和顆粒環境。

wKiom1O6oziRLE2XAAD2xo9KQws412.jpg

1個8通道8位的主控連接到8個Die上,爲了解釋方便,我這裏就畫了每個Die裏的第一個Block。(實際當然要複雜很多)  

好了,接下來我們要進行讀寫了,看清楚,這下面的東西纔是你們最想知道的。 1. 現在我先對主機發送一條命令,要求寫入4KB。

wKioL1O6oyCAGMTLAAEFF1PXD04641.jpg

 

主控接到主機發來的指令後,往顆粒1的Block1裏寫入了1個4KB(佔1Page)。  


2.繼續寫入8KB。

wKioL1O6ozHyExIIAAEDFIquScA137.jpg

主控接到主機發來的指令後,往顆粒2的Block1裏和顆粒3的Block1裏各寫入4KB。

好了,我們來舉一反三,如果寫入的是32KB,那麼主控就會一下子往每個顆粒的Block1裏寫入4KB,這樣就能發揮出這個SSD主控理論最大的寫入帶寬,相對4KB來說最好情況下我們可以得到8倍的速度(取決於主控對通道的優化,顆粒當前的文件狀況等等)。這樣你們就會知道爲啥4KB的寫入慢,而持續寫入SSD並不慢的道理了吧,實際情況下當然不會都寫Block1,我這裏只是想解釋的簡單點。這個類似RAID 0的操作模式就是大部分的SSD內部操作情況。

上面是寫入的情況,對於讀取自然也是如此,4KB的讀取就從一個Block裏讀,而32KB的話就從8個Block裏拿,速度是不是8倍提升取決於要讀取 的數據是不是平均分佈在每個顆粒的Block裏,如果32KB數據是存儲在圖中顆粒1~4的Block1裏的(每個Block假設8KB),那麼讀取就最 多隻有4倍的提升了,這也是爲啥文件越小傳輸率越低的道理。

這樣經過一段時間之後,所有的NAND Block都被填滿了,就會產生如下圖的情況:

wKiom1O6o3HznupcAAD47-120_Q600.jpg

這個圖顯示的是LBA(邏輯塊地址),也就是我們的操作系統看到的文件系統結構,而非我們的SSD主控制器看到的結構。  

圖中紅色的地方表示爲這個地址裏的數據已經“過期”或者“無效”,這些紅色地址是如何產生的?在你刪除文件的時候,這個地址就“無效”了,裏面的文件還在,只不過不用了而已,等待下一次的數據更新並覆蓋進去。  

對於SSD的主控制器來說,它看到的並不是如圖中這樣,而是如下圖:

wKiom1O6o4DAYhNdAADlzsxFabA971.jpg

是的,在SSD主控制器看來,這裏的文件都是有效的,也就是不能擦除,那麼接下來如何?在操作系統的要求下,繼續寫入數據的話就要在前面LBA紅色的地方寫入,對於SSD來說,這時候就需要把整個塊的綠色讀進緩存並更新操作系統發來的數據,之後擦除這整個塊並把緩存裏的整個更新完的塊寫回去,這樣即使寫入4KB的數據,其實也是大費周章的折騰,這就是早期SSD主控制器或者U盤寫入放大高的道理,這些SSD的算法上不支持GC,也沒有Trim,所以在隨機寫入的表現上非常的悲劇。

Trim是什麼?他帶來了什麼好處? 

Trim是一條ATA的指令,當最新的操作系統刪除文件的時候(包括格式化),同時把這個文件地址發送給SSD的主控制器,讓主控制器知道這個地址的文件地址無效了,好了,到此結束,沒有下文了。  

Trim的完成需要幾點:1.SSD的主控制器必須認識Trim指令,也就是固件要支持。2.操作系統必須會發送Trim指令,也就是刪除時候會發送。3.操作系統下的控制器驅動必須要支持Trim指令的傳輸,也就是能夠Pass Trim指令到SSD主控制器。  

如果SSD的主控制器支持Trim並且有開啓的話,他看到的圖就會是這樣:

wKioL1O6o2HwJss3AAEDLHVM2N8523.jpg

是的,基本和操作系統看到的差不多,那些不一樣的地址是因爲並非刪除操作造成的“無效”,而是由於覆蓋等原因造成的,所以操作系統並沒有發送Trim指令告訴SSD主控這個地址。  

那麼相比之前的SSD主控制器,我們有了Trim,帶來了提升是啥道理哪。  

如果光有Trim,提升並不大,因爲數據的寫入還是需要讀取進入緩存並更改整個塊,只是Trim後紅色的page就不需要讀取進入緩存更新了,因爲SSD主控已經知道那個地址的數據無效了,只省下來了紅色page的讀取寫入時間,寫入放大一樣很高,如何才能解決這個問題?  

那就是GC,垃圾回收技術:  

垃圾回收類似於硬件級的整理,不受制於文件系統和操作系統,而由SSD主控制器全權負責的合併有效文件,擦除無效文件。  

我們知道每個SSD至少都有7.37%容量的第一層OP(預留空間),GC技術就可以利用那個空間來作爲垃圾回收處理廠。 如圖

wKioL1O6o2-yEMOOAAEOWAZLVLM063.jpg

前面說過了,SSD有備用空間,那麼合理應用那個空間作爲垃圾回收,我們可以把顆粒1的Block1和顆粒2的Block1裏的綠色有效page合併到顆粒N的block1裏面,並刪除掉顆粒1的Block1和顆粒2的Block1.這樣我們就用了1個空白Block(顆粒N的Block1換到了2個空白Block) ,並把2個空白Block轉到備用區去,這就是垃圾回收操作。  

操作後就像下圖

wKioL1O6o32yZp-gAADyY3o0M1Q080.jpg

這樣接下的寫入就可以直接寫入沒寫入過的顆粒N的Block1裏的page和顆粒N+1的Block1。達到寫入的性能提升,也避免了寫入放大的大幅度增加。  

如果沒有Trim的支持,而光有GC垃圾回收的話又會如何?(很多人沒有開Trim,或者組了RAID開不了Trim的就會像下面這樣,如圖:

wKioL1O6o46T3L_qAADp1RHF-2g128.jpg

由於沒有Trim,操作系統在刪除文件的時候並不會告訴SSD主控這個文件地址爲無效,那麼只有在更新操作的時候SSD主控才知道這個地址爲無效(新數據寫入新page,舊page地址被主控映射表標記爲無效)。由於紅色的page很少,這樣就給垃圾回收帶來了效率低下的問題,按照這個圖中的情況做垃圾回收後會如下圖:

wKioL1O6o5nQgifCAAD_iP6NCAA569.jpg

是的,垃圾回收用2個空白Block換來了幾個page的空白,這樣低下的垃圾回收就類似於基本上Copy了整個Block數據到空白Block,花費的時間很多。所以這裏我們知道,Trim提升速度的奧祕是產生了大量的紅色page(無效數據),造成垃圾回收的效率提高,類似以1換N的效率。  

垃圾回收分爲閒置垃圾回收和被動垃圾回收。  

所謂閒置垃圾回收就是在機器閒置的時候做提前垃圾回收,保證一定數量的空白Block來保證接下來的寫入可以順利進行。而被動垃圾回收就是到了不能不做垃圾回收的時候了,邊寫入邊垃圾回收。(這時候的性能一般是比較低下的,但是肯定不會增加多餘的寫入放大)  

閒置垃圾回收會增加寫入放大的道理是這樣的,比如前面圖中顆粒3的Block1和顆粒4的Block1內部紅色page還是比較少的情況下在閒置時被垃圾回收了,如果我們接下來刪除的數據(有Trim)原本是顆粒3的Block1和顆粒4的Block1內部綠色page裏的話,就等於做了多餘的垃圾回收,因爲如果我們可以等到刪除的時候,這幾個綠色的page變紅色後就不用Copy到新的block裏了,所以等於說寫入放大被增加了。  

很多人會問垃圾回收何時做?爲啥我明明開Trim了,但是還是沒感覺到性能的提升?  

一般在全盤的物理地址被寫滿一次後做,由於主控設計上爲了儘量減少沒必要的寫入放大,所以閒置垃圾回收被限制了一定的容量,也就是說並非所有包含無效page的Block都會被垃圾回收,主控會盡量取其中效率最高的先做掉,還有一點就是,Trim後不一定馬上做垃圾回收,而是等待到不得不做的時候做來做。比如鎂光C300的0002固件的Trim指令發送完後就會馬上做垃圾回收,但是到了0006固件,Trim指令發送完後垃圾回收並沒有馬上做,而是要等待到最佳時機,所以我們說0006的固件寫入放大會低於0002固件,但是性能的恢復會慢一些。這是在耐久度和寫入性能之間需要取得的平衡。


3. 不同環境下的SSD性能是不同的  

你們也知道,SSD的讀取很快,但是寫入相對較慢,其實影響SSD寫性能的並不是很多人認爲的擦除操作(一般1.5ms),而是寫入(每個page/SLC 250us,MLC 900us)。對於相同平臺相同的2塊SSD在使用環境不同的情況下,寫入性能的差距是很明顯的,爲何會造成了這麼明顯的差距?這是因爲同樣的寫入操作,需要花費的時間是不同的。 下面2張圖我來告訴你: 

wKiom1O6o-_AV81zAAESCxUz0DY006.jpg

wKioL1O6o8qhxdwWAAD11LKqBQw902.jpg


這是2塊一摸一樣的SSD,一樣的操作系統驅動,但是唯一的不同是環境,前面圖中的SSD作爲系統盤,後面圖中的SSD偏向於視頻編輯,所以在上面2個圖中我們得到了2個完全不同的情況,我可以這樣說,下圖中的SSD寫入會強於上圖的SSD,因爲對下圖的SSD來說,要得到2個空Block只要直接擦除掉顆粒1的Block1和顆粒2的Block1就行了,而上面的圖裏就需要做完整的垃圾回收操作,同樣的寫入操作由於後臺垃圾回收的關係會造成性能上的差距也就不言而喻了,爲啥下圖會有全紅塊的情況?因爲視頻文件一般都偏大,當刪除的時候地址是連續的,一整塊都變無效(紅page)了,所以在垃圾回收的時候效率是極高的,這也是爲啥持續寫入並不會對SSD耐久度造成傷害的道理。說句直接了當的話,SSD在每個時間段的寫入性能都會不同,因爲性能取決於當前內部碎片的程度。

4. 提升垃圾回收效率的另一個方法,提升OP(備用空間)

企業級產品大多都有很高的OP容量,一般爲20%以上,這是爲啥哪? 最簡單一個道理,看圖吧:

wKiom1O6pAyD7X88AAEN9U-xOMo081.jpg

wKioL1O6o-fwdXHqAAEQG2cS-M0978.jpg


有誰認爲下圖的垃圾回收效率會低於上圖的?我相信沒人吧,更多的備用空間意味着啥?更高的效率,更多的寫入空間,磁盤碎片整理程序也是空白空間越大效率越高吧,在企業級這類極限情況下,靠着被動GC來拉開性能的話,備用空間就顯得尤爲重要了。  

沒有Trim的時代:OP的容量越大,代表用戶的可用空間越小,當寫滿整個LBA的時候,用戶就需要刪除文件以得到空閒容量,LBA裏文件佔的地址page變紅了,而在SSD看來還是全綠(無Trim),刪除文件後用戶可以繼續寫入(LBA地址覆蓋),在SSD主控內的FTL幫助下,操作系統LBA的紅色在慢慢變綠,而SSD實際把數據更新到之後沒寫入過的PBA(物理地址)裏,在SSD裏看來,PBA—LBA越大,在LBA裏紅色出現的概率越高,需要複製進緩存的綠色page越少,性能越好。在沒有Trim甚至GC的年代,提升OP容量是唯一保證SSD寫入性能的方法,在極端情況下OP是非常重要的,如今雖然SSD性能大大增強了,但是OP被大多數企業級SSD產品沿用了下來。  

OP不能提升SSD的最高性能,但是卻能明顯提升SSD的最低性能,越是極端情況下,OP越顯得重要,OP還能讓SSD的性能下降更慢,恢復更快,減少寫入放大來大大提升顆粒耐久度。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章