淺談分散式儲存之SSD基本原理

java06051515發表於2020-01-10

前言

隨著製造工藝的不斷進步,SSD(Solid State Drive)效能和容量不斷突破,價格不斷降低,迎來了快速的發展,目前已經是商用伺服器、高效能儲存服務中非常流行的儲存介質。作為開發人員,需要了解SSD的基本原理,以便開發時能更好地發揮其優勢,規避其劣勢。本文章基於末尾所列參考文獻整理而來。

目錄

SSD簡介

SSD誕生於上世紀70年代,最早的SSD使用RAM作為儲存介質,但是RAM掉電後資料就會丟失,同時價格也特別貴。後來出現了基於快閃記憶體(Flash)的SSD,Flash掉電後資料不會丟失,因此Flash-SSD慢慢取代了RAM-SSD,但是此時HDD已經佔據了大部分的市場。到本世紀初,隨著製造工藝的不斷進步,SDD迎來了長足的發展,同時HDD在工藝和技術上已經很難有突破性的進展,SSD在效能和容量上還在不斷突破,相信在不久的將來,SSD在線上儲存領域會取代HDD,成為軟體定義儲存(SDS)的主流裝置。

快閃記憶體基礎

SSD主要由SSD控制器,Flash儲存陣列,板上DRAM(可選)以及跟HOST介面(SATA、SAS、PCIe等)組成。

Flash的基本儲存單元是 浮柵電晶體,同時根據製造工藝分為 NOR型和 NAND型。 NAND容量大,按照Page進行讀寫,適合進行資料儲存,基本上儲存使用的SSD的Flash都是 NAND

Flash的工作原理和場效電晶體類似都是利用電壓控制源極和漏極之間的通斷來工作的。

寫操作 是在控制極加正電壓,使電子透過絕緣層進入浮柵極。因此寫操作無法將電子從浮柵極吸出,所以覆蓋寫入前必須擦除

擦除(erase)操作 正好相反,是在襯底加正電壓,把電子從浮柵極中吸出來

讀操作 給控制柵加讀取電壓,判斷漏極-源極之間是否處於導通狀態,進而可以判斷浮置柵有沒有儲存電荷,進而判斷該儲存單元是 1還是 0

圖片引用自

淺談分散式儲存之SSD基本原理


儲存原理

如第二節-快閃記憶體基礎,SSD內部一般都是使用NAND-Flash作為儲存介質,邏輯結構如下圖:


淺談分散式儲存之SSD基本原理


SSD中一般有多個NAND-Flash,每個NAND-Flash包含多個Block,每個Block包含多個Page。由於NAND的特性,存取都必須以Page為單位,即每次讀寫至少是一個Page。通常地,每個Page的大小為4K或者8K。NAND的另一個特性是隻能讀寫單個Page,不能覆蓋寫某個Page,如果要覆蓋寫,必須先要清空裡面的內容,再寫入。由於清空內容的電壓較高,必須是以Block為單位,因此,沒有空閒的Page時,必須要找到沒有有效內容的Block,先擦除再選擇空閒的Page寫入。理論上也是可以設計成為按位元組擦除,但是NAND容量一般很大,按位元組擦除效率低,速度慢,所以就設計為按Block擦除了。

SSD中也會維護一個mapping table,維護邏輯地址到實體地址的對映。每次讀寫時,可以透過邏輯地址直接查表計算出實體地址,與傳統的機械磁碟相比,省去了尋道時間和旋轉時間。

讀寫流程

從NAND-Flash的原理可以看出,其和HDD的主要區別為:

  • 定位資料快:HDD需要經過尋道和旋轉,才能定位到要讀寫的資料塊,而SSD透過mapping table直接計算即可。
  • 讀取速度快:HDD的速度取決於旋轉速度,而SSD只需要加電壓讀取資料,一般而言,要快於HDD。

順序讀測試中,由於定位資料只需要一次,定位之後,則是大批次的讀取資料的過程,此時,HDD和SSD的效能差距主要體現在讀取速度上,HDD能到200M左右,而普通SSD是其兩倍。

隨機讀測試中,由於每次讀都要先定位資料,然後再讀取,HDD的定位資料的耗費時間很多,一般是幾毫秒到十幾毫秒,遠遠高於SSD的定位資料時間(一般0.1ms左右),因此,隨機讀寫測試主要體現在兩者定位資料的速度上,此時,SSD的效能是要遠遠好於HDD的。

SSD的寫分為 新寫入覆蓋寫兩種,處理流程不同。

新寫入


淺談分散式儲存之SSD基本原理


  1. 找到一個空閒Page。
  2. 資料寫入到空閒Page。
  3. 更新mapping table。

覆蓋寫


淺談分散式儲存之SSD基本原理


  1. SSD不能覆蓋寫,因此先找到一個空閒頁H。
  2. 讀取Page-G中的資料到SSD內部的buffer中,把更新的位元組更新到buffer。
  3. buffer中的資料寫入到H。
  4. 更新mapping table中G頁,置為無效頁。
  5. 更新mapping table中H頁,新增對映關係。

如果在覆蓋寫操作比較多的情況下,會產生較多的無效頁,類似於磁碟碎片,此時需要SSD的GC機制來回收這部分空間了。

GC機制

在討論GC機制之前,我們先了解一下 Over-Provisioning是指SSD實際的儲存空間比可寫入的空間要大。比如一塊SSD實際空間128G,可用容量卻只有120G。為什麼需要Over-Provisioning呢?請看如下例子:

淺談分散式儲存之SSD基本原理


如上圖所示,假設系統中只有兩個Block,最終還剩下兩個無效的Page。此時要寫入一個新Page,根據NAND原理,必須要先對兩個無效的Page擦除才能用於寫入。而擦除的粒度是Block,需要讀取當前Block有效資料到新的Block,如果此時沒有額外的空間,便做不了擦除操作了,那麼最終那兩個無效的Page便不能得到利用。所以需要SSD提供額外空間即 Over-Provisioning,保證GC的正常執行。


淺談分散式儲存之SSD基本原理


GC流程如下:

  1. 從Over-Provisoning空間中,找到一個空閒的Block-T。
  2. 把Block-0的ABCDEFH和Block-1的A複製到空閒Block-T。
  3. 擦除Block-0。
  4. 把Block-1的BCDEFH複製到Block-0,此時Block0就有兩個空閒Page。
  5. 擦除BLock-1。

SSD的GC機制會帶來兩個問題:

  • SSD的壽命減少。NAND-Flash中每個原件都有擦寫次數限制,超過一定擦寫次數後,就只能讀取不能寫入了。
  • 寫放大(Write Amplification)。即內部真正寫入的資料量大於使用者請求寫入的資料量。

如果頻繁的在某些Block上做GC,會使得這些元件比其他部分更快到達擦寫次數限制。因此,需要損耗均衡控制(Wear-Leveling)演算法,使得原件的擦寫次數比較平均,進而延長SSD的壽命。

Trim機制

Trim指令也叫 Disable Delete Notify(禁用刪除通知),是微軟聯合各大SSD廠商所開發的一項技術,屬於ATA8-ACS規範的技術指令。

Trim(Discard)的出現主要是為了提高GC的效率以及減少寫入放大的發生,最大作用是清空待刪除的無效資料。在SSD執行讀、擦、寫步驟的時候,預先把擦除的步驟先做了,這樣才能發揮出SSD的效能,通常SSD掉速很大一部分原因就是待刪除的無效資料太多,每次寫入的時候主控都要先做清空處理,所以效能受到了限制。

在檔案系統上刪除某個檔案時候,簡單的在邏輯資料表內把儲存要刪除的資料的位置標記為可用而已,而並不是真正將磁碟上的資料給刪除掉。使用機械硬碟的系統根本就不需要向儲存裝置傳送任何有關檔案刪除的訊息,系統可以隨時把新資料直接覆蓋到無用的資料上。固態硬碟只有當系統準備把新資料要寫入那個位置的時候,固態硬碟才意識到原來這寫資料已經被刪除。而如果在這之前,SSD執行了GC操作,那麼GC會把這些實際上已經刪除了的資料還當作是有效資料進行遷移寫入到其他的Block中,這是沒有必要的。

在沒有Trim的情況下,SSD無法事先知道那些被‘刪除’的資料頁已經是‘無效’的,必須到系統要求在相同的地方寫入資料時才知道那些資料可以被擦除,這樣就無法在最適當的時機做出最好的最佳化,既影響GC的效率(間接影響效能),又影響SSD的壽命。

Trim和Discard的支援,不僅僅要SSD實現這個功能,而是整個資料鏈路中涉及到的檔案系統、RAID控制卡以及SSD都需要實現。要使用這個功能必須要在mount檔案系統時,加上discard選項。如果自己管理SSD裸裝置就需要透過 ioctl函式 BLKDISCARD命令來操作了。

int block_device_discard(int fd, int64_t offset, int64_t len)
{
    uint64_t range[2] = {(uint64_t)offset, (uint64_t)len};
    return ioctl(fd, BLKDISCARD, range);
}

Bit-Error

在分析Bit-Error之前,我們先回顧一下 快閃記憶體基礎章節的知識。Bit-Error是磁碟的一種靜默錯誤。造成Nand-Error的因素有:

  • 電荷洩漏:長期不使用,會發生電荷洩漏,導致電壓分佈往左移,例如00漂移到01,10漂移到11。
  • 讀干擾(Read-Disturb):讀干擾小節會詳細介紹。
  • 寫干擾(Program-Disturb):寫干擾小節會詳細介紹。

不同因素造成的錯誤型別也不同:

  • Erase-Error:erase操作未能將cell復位到erase狀態時,稱為erase error。可能是製造問題,或者多次P/E引起的柵極氧化層缺陷所致。
  • Program-Interference-Error:由Program-Disturb所導致的錯誤,會使電壓分佈偏移。
  • Retention-Error:由電荷洩露引發的錯誤,會使電壓分佈偏移。
  • Read-Error:由Read-Disturb所導致的錯誤,會使電壓分佈偏移。

retention時間越長,flash的浮柵極洩露的電子會越多,因而誤位元速率越高,所以NAND-Error機制主要是為了減少Retention-Error。

Read-Disturb

讀取NAND的某個Page時,Block當中未被選取的Page控制極都會加一個正電壓,以保證未被選中的MOS管是導通的。這樣頻繁的在一個MOS管控制極加正電壓,就可能導致電子被吸進浮柵極,形成輕微的Program,導致分佈電壓右移,產生Bit-Error。注意Read-Disturb隻影響同一Block中的其他Page。

淺談分散式儲存之SSD基本原理


Program-Disturb

erase之後所有bit都為1,寫1不需要program,寫0才需要program。如下圖所示,綠色的Cell是寫0,它們需要Program,紅色的cell寫1,並不需要Program。我們把綠色的Cell稱為Programmed Cells,紅色的Cell稱為Stressed Cells。寫某個Page的時候,會在其WordLine的控制極加一個正電壓(下圖是20V),對於Programmed Cells所在的String,它是接地的,對於不需要Program Cell所在的String,則接一正電壓(下圖為10V)。這樣最終產生的後果是,Stressed Cell也會被輕微Program。與Read Disturb不同的是,Program Disturb 不但影響同一個Block當中的其它Page,自身Page也受影響。相同的是,都是不期望的輕微Program導致位元翻轉,都非永久性損傷,經擦除後,Block還能再次使用。

淺談分散式儲存之SSD基本原理


Wear-Leveling

可參考: 經典Dual-pool 演算法-高效Wear Leveling

IO抖動因素

  • GC機制:會導致內部IO,從而搶佔使用者的IO,導致效能抖動,甚至下降。
  • Bit-Error:對於讀操作,如果Bit-Error控制在一定範圍內,那麼延遲可以控制在100us內。如果超過了BCH快速解碼的範圍,將花費大量時間解碼,延遲將增加。
  • 讀寫衝突:當一個讀請求和寫請求落在了同一個Block或者Page,會導致讀延遲增加。針對這個問題,在儲存系統設計過程中,需要將讀寫請求在空間上進行分離,從而避免讀寫請求在同一個Block上衝突。
  • 讀擦衝突:當一個讀請求和擦除請求落在了同一個Block,那麼讀請求將會被擦除請求block,NAND-Flash的擦除操作基本上在2ms以上,導致讀延遲增加。為了解決這個問題,有些NAND-FLash也引入了Erase-Suspend的功能,讓讀優先於擦除操作,從而降低延遲。

參考文獻

作者:史明亞

- [現在註冊滴滴雲,有機會可得30元無門檻滴滴出行券]( )

- [新購雲服務1月5折 3月4折 6月低至3折]( "新購雲服務1月5折 3月4折 6月低至3折")

- [滴滴雲使者招募,推薦最高返傭50%]()


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559758/viewspace-2672806/,如需轉載,請註明出處,否則將追究法律責任。

相關文章