NO IMAGE

好記性不如爛筆頭o(^▽^)o

認識SSD

定義

固態硬碟(Solid State Disk)用固態電子儲存晶片陣列而製成的硬碟,由控制單元和儲存單元(FLASH晶片、DRAM晶片)組成。
一塊SSD,核心部件是一顆控制器和多顆Flash顆粒,一般還會有一些記憶體和超級電容。

-->控制器主要作用是提供高效的手段來訪問這些Flash顆粒。
-->記憶體的作用主要是表項管理和讀寫CACHE。
-->超級電容的作用是在異常下電時保證關鍵資料不丟失。

Flash顆粒是SSD最重要的器件,其相關特性決定了SSD的實現方式。

FLASH顆粒

定義和分類

快閃記憶體是一種不揮發性( Non-Volatile )記憶體,在沒有電流供應的條件下也能夠長久地保持資料,其儲存特性相當於硬碟,這項特性正是快閃記憶體得以成為各類便攜型數字裝置的儲存介質的基礎。

Flash顆粒是SSD最重要的器件,其相關特性決定了SSD的實現方式。目前業界主要有兩種型別的Flash技術:NOR(Intel開發)和NAND(東芝開發)。由於這兩種技術在如下方面的一些差異:

-->NOR的讀取速度略快於NAND;
-->NOR的寫入速度遠低於NAND;
-->NOR的擦除速度遠低於NAND;
-->的擦寫次數約為NAND的1/10;
-->的單元尺寸約為NAND的2倍;

導致1~16M的快閃記憶體市場主要採用NOR顆粒(主要用於儲存嵌入式裝置的程式),而更大容量的資料儲存(例如SSD)則主要選擇NAND顆粒

SLC和MLC

NAND FLASH晶片,flash顆粒有兩種型別:SLC和MLC

SLC:Single Level Cell,每個儲存單元均只能儲存1個bit的資料。只包含0和1兩個電壓符。
MLC:Multi Level Cell,每個儲存單元能夠儲存2個bit或者更多bit的資料。包含四個電壓符(00,01,10,11)。

SLC和MLC的比較:
MLC容量比SLC大,且價格便宜。
但在效能、使用壽命和穩定性上:
1、SLC更簡單可靠;
2、SLC讀取和寫入的速度都比MLC更快;
3、SLC比MLC更耐用,MLC每單元可擦除1w次,而SLC可擦除10w次。

一般而言,SLC主要用於企業級市場,MLC主要用於消費級市場。下表顯示了SLC和MLC兩種Flash顆粒的一些效能指標:

比較項SLCMLC
隨機讀25us50us
擦除2ms2ms
程式設計250us900us
擦除次數100k10k

SSD的內部邏輯劃分

一顆NAND Flash顆粒,其內部被劃分為若干block,每個block又包含若干page。page的大小一般為2k/4k/8k(同一顆Flash顆粒內的page大小是固定且相同的)。

Flash的一個特點是:不能對任意bit位進行0/1互轉,只能按照一定的顆粒度進行擦除和程式設計操作;

-->擦除 —— 顆粒度為block,是將指定block中所有的bit位全部設定為1;
-->程式設計 —— 顆粒度為page,是將指定page中指定的bit位設定為0;

因此,對SSD進行寫的操作實際上對需要寫的Page所在的Block全部完成“擦除”(全部bit位置1)後,才能對指定的Page進行“程式設計”(部分bit位置0)。PS:實際上SSD硬碟在出廠時,廠商都會把所有Block完成擦除操作。

SSD的表項管理

  每一個IO讀寫都是下發給一個地址,這個地址稱為LBA(Logic Block Address),其真正對應在磁碟上的地址稱為PBA(Physical Block Address),和傳統機械硬碟中LBA到PBA的對映通過磁軌、磁軌、扇區來進行唯一對應不同的是,SSD的LBA到PBA的對映通過一張對映表來記錄。
  LBA的粒度是扇區,而Flash顆粒的擦粒度是block,寫粒度是page,均為扇區的若干倍,在這種條件下,如果仍以扇區為粒度進行對映,雖然理論上可行,但是顯然是增加實現難度和效能的.
  同時,如果強制以扇區為粒度進行對映,會導致所需要的對映表空間超過實體記憶體的限制,這就直接決定了不可能以扇區為粒度進行對映。
  即使以page為粒度進行對映,也可能存在實體記憶體不夠用的情況(現在正在使用的SSD盤即屬於這種情況),所以需要以更大一些的粒度進行管理。
  這個粒度成為”小塊(Sub Block)“,是SSD進行擦除和程式設計的最小單位。每個block中,均包含多個sub block;每個sub block,由多個page組成;每個sub block,可能的狀態包括:有效、垃圾、空白:

-->有效:該小塊中的資料正在被引用;
-->垃圾:該小塊中的資料沒有被引用;
-->空白:該小塊可用於寫入新的資料;

垃圾回收

  SSD的寫要先進行整個Block的擦除,然後才能對指定的Sub Block進行程式設計。實際上,如果某一個寫操作需要修改一個Sub Block的內容,是無法直接進行修改的,而是寫到一個新的Sub Block中,把該LBA的對映指向新的這個Sub Block,同時把原來資料所在的Sub Block標記為“垃圾”。
  這樣,隨著SSD使用時間的越來越長,新的未被程式設計過的Sub Block越來越少,後面新的寫請求則只能重新擦除所有Sub Block均為垃圾的Block才能再次寫入,這樣必然會造成寫操作的效能降低,因此,在SSD內部引入了一個重要的機制——垃圾回收(Garbage Collection),用以提升SSD長期寫入操作的效能。

垃圾回收的工作:

-->找出合適的block
-->將該block中的有效小塊遷移到別的地方,同時更改對映表
-->將該block擦除,並放入空白塊表

  所謂“最合適進行回收的block”,是指這個block的垃圾小塊足夠多、有效/空白小塊足夠少。
  垃圾回收演算法是否高效,與該SSD的效能有很強的聯絡。

SSD的磨損均衡

  上面說過,每個Flash顆粒中Block的可擦除次數是有限制的,如果顆粒中的某些Block很快達到了擦除次數上限,而其他大部分都幾乎沒有被擦除過,則會很快的造成整個SSD失效。而磨損均衡(Wear Leveling)則是通過各種手段,保證整個SSD所有的block的擦除次數是相近的從而延長SSD的使用壽命。

磨損均衡分為 動態磨損均衡靜態磨損均衡

動態磨損均衡,是指在外部力量的驅動下,自然完成磨損均衡。這裡外部力量,包括寫IO和垃圾回收。
靜態磨損均衡,是指磨損均衡功能模組主動地查詢那些長時間沒有變化的資料,將這些資料搬移到其他位置,以便釋放出擦除次數較少的block,使其投入到擦除/程式設計的迴圈之中。

SSD使用壽命計算舉例

  雖然一個block擦寫次數只有100k(SLC),但是因為動態對映、磨損均衡等機制的存在,使得SSD的壽命遠不止寫入100k個IO。
計算SSD壽命的方式,一般是先確認一個block在其生命週期內能夠寫入多少資料量,再乘以該SSD具有的block數量,再除以一個估計的寫入頻寬,最後得到壽命值。
  以我司(你們猜o(^▽^)o)自研的100G SLC SSD為例,16片Flash顆粒,每片顆粒擁有32k個block,每個block擁有64個4k的page,每個block可以被擦除100k次:

16 x (32 x 1024) x 64 x (4 x 1024) x 100000 = 12500 TB

  12500 TB,這是當所有block同時達到擦除次數上限時,可以寫入的資料總量。
按照使用者平均每秒鐘寫入10MB的資料進行計算:

 (12500 x 1024 x 1024) / (10 x 60 x 60 x 24 x 365.25) = 41.5 年

  41.5年,這是在10MB/s的壓力下、持續不斷地向SSD寫入資料的使用壽命。
  考慮到其他一些因素的影響,一塊SLC SSD的使用壽命,10年是可以保證的。

SSD和傳統磁碟的對比

  SSD與傳統磁碟相比:
  第一是沒有機械裝置;
  第二是由磁介質改為了電介質。
  在SSD內部有一個FTL(Flash Transalation Layer),它相當於磁碟中的控制器,主要功能就是作地址對映,將flash memory的實體地址對映為磁碟的LBA邏輯地址,並提供給OS作透明訪問。

讀方面

隨機讀
  SSD沒有傳統磁碟的尋道時間和延遲時間,所以SSD可以提供非常高的隨機讀取能力。

型別引數
SLC型別的SSD超過35000的IOPS
傳統15k的SAS磁碟最高160個IOPS。

連續讀
  SSD連續讀的能力相比普通磁碟優勢並不明顯。傳統磁碟連續讀,並不需要尋道時間:

型別引數
15k的SAS磁碟吞吐能力最高可達130MB
SLC型別的SSD170-200MB

寫方面

  Page為最小的讀寫單位,Block為最小的擦除/程式設計單位,其中1個Page為4KB,1個Block由256個Page組成,1個Plane由2048個Block組成,2個Plane組成1個Die,也就是最小的晶片(4GB)

  向一個空白的page寫入資訊時,可以直接寫入而無需擦除,但是如果需要改寫某個儲存單元(page)的資料,必須首先將整個block讀入快取,然後修改資料,並擦除整個block的資料,最後將整個block寫入。SSD改寫資料的代價很高,SSD的這個特性,我們稱之為erase-before-write。因為這個特性,引入“寫放大”的概念。

  比如你想改寫4K的資料,必須首先將整個擦除塊(1024KB)中的資料讀出到快取中,改寫後,將整個塊一起寫入,這時你實際寫入了1024KB的資料,寫入放大係數是256。寫入放大最好的情況是1,就是不存在放大的情況。

  在長時間寫入後,MLC隨機寫IO下降得非常厲害,而SLC表現則比較穩定,可以穩定在3000 IOPS,而MLC隨機寫IOPS甚至降低到300。

  當某個單元長時間被反覆擦寫時(比如Oracle redo),不僅會造成寫入的效能問題,而且會大大縮短SSD的使用壽命。所以,引入磨損均衡演算法(wear leveling)。