認識SSD

好記性不如爛筆頭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顆粒的一些性能指標:

比較項 SLC MLC
隨機讀 25us 50us
擦除 2ms 2ms
編程 250us 900us
擦除次數 100k 10k

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類型的SSD 170-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)。

發佈了140 篇原創文章 · 獲贊 97 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章