1. 程式人生 > >【初識SSD】SSD的基本知識

【初識SSD】SSD的基本知識

前言

《深圳男子圖鑑》 繼續搬磚ing,今天(4天前)看到某面向SSD的專案,趕緊學習了一下SSD的基礎知識。
主要是從儲存系統、DB開發的角度來看SSD,並非專業搞硬體的,完全初學者。

正文

SSD的壽命

首先是我對SSD最初瞭解的一點,SSD是有壽命的。由於SSD的物理性質,導致了它是有一定使用壽命的,當每個單元被讀寫一定次數之後就將不可用。
而主要有3種材質的
SLC MLC TLC
這三種材質最大的區別就是單元儲存的bit數不同 SLC1個 TLC3個,
隨著儲存的bit多,效能(讀取、寫入延時)越來越高,壽命越來越短,當然成本也越來越低。

損耗均衡

正因為有壽命的影響,所以我們希望整塊SSD最好可以達到一個損耗均衡的效果(一個512G的SSD,每天IO數目相同,總壽命有5年,那麼我肯定不希望2。5年時只有256G可用。。),所以會有一定的策略來保證損耗均衡。

具體引數可見下圖(出自coding for ssd–Part 2

 

 

SLC MLC TLC HDD RAM L1 cache L2 cache
P/E cycles 100k 10k 5k * * * *
Bits per cell 1 2 3 * * * *
Seek latency (μs) * * * 9000 * * *
Read latency (μs) 25 50 100 2000-7000 0.04-0.1 0.001 0.004
Write latency (μs) 250 900 1500 2000-7000 0.04-0.1 0.001 0.004
Erase latency (μs) 1500 3000 5000 * * * *
Notes * metric is not applicable for that type of memory

對於機械硬碟來說,由於需要尋道,旋轉,所以隨機讀寫的效率很低。但是順序讀寫的效率相對高
而對於SSD來說,不需要尋道旋轉,因此隨機讀的效率強於HDD。順序 寫的效率也是相對高於隨機寫的

與HDD不同的寫入

SSD和我們普通HDD很不同的一點是寫入。我對於硬碟之前的印象都是直接寫入,也就是說像一個本子,寫完一頁後,如果這頁的內容不需要了,就打個標記,下次,繼續寫這頁。或者說和記憶體一樣,刪除並不是擦除,只是打標記。
但SSD不是這樣,SSD的操作只有program(寫)erase(擦除)read(讀),也就是說必須要在寫之前擦乾淨。(具體必然是跟物理性質有關啦,這裡不深入)。
所以這就導致了一些問題。
1.我們的檔案系統對於刪除操作,就類似於記憶體這樣只是靠標記來區分空閒儲存,但是對於SSD來說,它並不知道這個標記的存在,只有當下次寫入時,SSD才能“意識”到這塊是不需要的,才開始執行擦除,或者叫垃圾回收操作,大大降低了寫的效率。
2.前面提到的損耗均衡在這裡依然有效,對於一塊被標記為空但是SSD不知道的頁,SSD的損耗均衡機制會讓它去進行無意義的資料移動,這依然是一種寫放大,降低了效能。

Trim命令

那麼針對這種問題,關鍵在於SSD需要知道哪些被標記了。就誕生了這樣一個命令Trim,通過這個命令就可以讓SSD知道了。但是這個命令需要OS,FS,SSD三方共同支援才可以。
但是對於寫,存在

SSD的寫放大效應

寫放大(write amp)效應。什麼放大?我大CD了。。。。xx放大不止存在於SSD這裡,是一個很尋常的概念,例如,有一棵BST,那麼我的一個讀/查詢操作實際上是要讀取好幾次葉子節點中的值,只希望讀取一次的操作實際上讀了好幾次,那麼可以說這個讀被放大了。寫操作同理。

SSD的寫放大,也是它的特點之一。為什麼SSD存在寫放大呢?SSD的組織形式是頁(page)–塊(block)–片(plane)。讀寫都是頁對齊擦除是塊對齊,因此加入我們只想寫小於一頁的資料時,卻實際要寫入一頁的資料,這就是我們說的寫放大。頁往往是KB這個數量級的,所以對於效率的損失是需要好好考量的。
其次,我們知道SSD必須在寫入前擦除,那麼可想而知,上面的寫入,需要先讀出(之前的在同一頁資料),快取起來,再擦除,再整體寫入一頁,做了非常多的無用操作。

主要參考

coding for ssd
coding for ssd 的中文翻譯版