【初識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必須在寫入前擦除,那麼可想而知,上面的寫入,需要先讀出(之前的在同一頁資料),快取起來,再擦除,再整體寫入一頁,做了非常多的無用操作。