如何理解SSD的寫放大?

如何理解SSD的寫放大問題?


寫放大(Write Amplification),也可以簡稱WAF(Write Amplification Factor),寫放大係數。

SSD和USB一樣,常用的是nand flash,對其操作主要是:寫(program),讀(read),擦除(erase)。

寫放大係數的含義:當我們的host要求向ssd寫入 A 大小的有效資料,而實際上由於flash的特性,我們真正寫入flash的資料大小是B,那麼B/A就是寫放大係數。

之所以會出現寫放大,主要是因為nand flash的最小寫單位是page。假設一個page大小16K,如果host要求寫入一個2K資料,那麼最終實際寫的是16K,這時候WAF=8,實際情況更複雜,這裡只是為了方便理解做的簡單假設。

WAF越大,肯定是不利於ssd性能的,因為nand flash的讀寫次數有限。具體WAF和nand flash的耐久壽命如下圖所示:

(黑色線表示WAF,紅色線表示耐久壽命)

WAF越小,壽命肯定越久。所以在設計SSD的時候,WAF這些因素都是主控晶元設計要考慮的事情啦~~~


提出這樣問題人一般都知道快閃記憶體基本構成是由:頁page(4K)→塊block(通常64個page組成一個block,有的是128個)→面plane(多個blcok組成)→die(plane就是一個die)→快閃記憶體片(多個die組成)→SSD(多顆快閃記憶體片組成)

↑↑↑↑一個塊block是由128個頁page組成,一個頁page是大小是4KB

↑↑↑↑一個面Plane由1024個塊block組成

△▼△▼△▼△▼△▼分割線▼△▼▽▼△▼△▼△

其實WA寫入放大很好理解,而造成寫入的元兇是GC垃圾回收,說之前先說下操作系統當刪除一個數據時,他不會立馬刪除,而是把這個要刪除的數據上標記一個「刪」的標籤,實際上沒有真正刪除,就是因為如此硬碟上數據純在可恢復的原因,而機械硬碟與固態硬碟工作原理不同,當機械硬碟要寫入新數據時可以直接覆蓋那些已經被標記「刪」標籤的數據,而固態硬碟不行,只能先擦除舊的數據才能寫入新數據,而NAND快閃記憶體工作原理是以4K頁(page)為一個單元寫入的,但擦除只能以塊block(64個page)為單位,如果一個塊block上有32個page有效數據和32個被標記「刪」標籤的無效數據,那要在這個塊block上重新寫入數據,那必須要擦除整個塊block,那還有一半有效數據怎麼辦了?那只有把那32page的有效數據就要搬到另一個有空位置的塊block中,這個這就是GC垃圾回收技術,那把那有效的數據搬到另一個塊block中,原本就已經寫入過一次了再加上這次搬遷不就又多了一次寫入嗎,這就是所謂的寫入放大,講了這麼多小付我還要講個trim技術,trim只是一種命令,只負責通知固態硬碟哪些是無效的數據,因為我們剛才講過操作系統刪除數據時,只是把這個要刪除的數據上打上「刪」的標籤,並沒有真正的刪除,這只是操作層面上的,但作為底層的固態硬碟鬼知道哪數據是有效那些事是無效的,如果沒有trim指令的話當固態硬碟要擦除一個塊block時,GC垃圾回收就會把有效數據連同被打上「刪的」無效數據一起搬到別的塊block上,這樣寫入量變的更大,增加硬碟負擔,就會影響硬碟速度和硬碟壽命,因為SSD不像機械硬碟,SSD有壽命限制就是所謂的全盤的寫入擦除次數(全盤進行一次寫入擦除就是1P/E),這樣來看TRIM命令是和GC垃圾回收是互補的,TRIM命令給SSD的可刪除數據越多,GC操作需要轉移的數據就越少,寫入量也會減少,寫入放大就會減少。小弟不才,這些只是自己片面理解然後告訴大家,有錯誤的地方請前輩指正


「寫入放大(WA)是快閃記憶體和固態硬碟之間相關聯的一個屬性,因為快閃記憶體必須先刪除才能改寫(我們也叫「編程「),在執行這些操作的時候,移動(或重寫)用戶數據和元數據(metadata)不止一次。這些多次的操作,不但增加了寫入數據量,減少了SSD的使用壽命,而且還吃光了快閃記憶體的帶寬(間接地影響了隨機寫入性能)。」

詳見PCEVA

《原創》SSD的寫入放大-Write amplification_技術論壇_PCEVA,PC絕對領域,傳播真正的電腦知識


最首位的答案有一點點不準確的地方 ,其餘的都是灰常正確的o(╯□╰)o

所以補充一下:

「之所以會出現寫放大,主要是因為nand flash的最小寫單位是page...」

這一段的這個因果關係是不成立的,引起SSD寫放大的因素有很多,最根本的原因還是因為底層快閃記憶體「先擦除(以塊為單位)後寫入(以page為單位)」的介質特性。

磁碟也有最小寫入單位,但是並沒有人關心磁碟由於有讀寫最小單位而引起的「寫入放大」。why?


實際上還有一個很常見的原因會導致實際壽命比標稱的低很多:硬碟剩餘空間減少。

多數SSD壽命測試都是全盤擦寫的測試,實際上絕大多數用戶都把SSD作為系統盤使用,剩餘空間都是越用越小,120G的盤剩餘空間只有20G左右是很常見的,這樣一來,如果沒有磨損平衡,剩下區域的擦寫壽命只有標稱的六分之一了;而磨損平衡本身就會導致寫入放大。

另外,那些測試都是通著電反覆擦寫,實際上存儲單元損耗到一定程度,可靠性就變得很差,斷電保持數據的能力嚴重下降,可能斷電幾天數據就丟了,實際上根本就是報廢狀態,但在測試的時候仍然被視為正常。


SSD是用NAND flash存儲信息的。Flash的特點是不能隨機寫,所以SSD需要實現一套log structured的映射。所以這個寫放大和leveldb的寫放大是差不多的意思。


推薦閱讀:

為什麼計算機中需要各種文件格式(即不同擴展名的文件)?
.DS_Store 文件是什麼?
硬碟為什麼可以分成不同格式的分區?
ISO9001 質量管理體系如何學習理解?
為什麼電腦文件保存命名的時候不能用特殊符號,例如"/"?

TAG:硬體 | 文件系統 | 固態硬碟 | 緩存 | Linux內核 |