ssd磁盤存儲原理及產生io抖動原因

作爲一名存儲工程師怎麼可以不瞭解存儲的物理介質呢,與磁盤相比,SSD具有很高的IO性能,但是和磁盤相比,SSD的性能穩定性不如磁盤好。在使用過程中,SSD的性能會發生變化,而不能保持很強的一致性。這是SSD的一個特性,性能會隨着時間、使用壽命發生變化。對於存儲系統設計而言,這種不確定的性能變化以及抖動都會對系統整體性能造成影響。因此,對於閃存存儲系統設計者而言,需要了解SSD內部的工作機制以及熟悉導致IO抖動的因素。在此之前先來了解一下ssd磁盤的基礎原理。

存儲原理

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

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

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

寫操作是在控制極加正電壓,使電子通過絕緣層進入浮柵極。寫操作如左圖,是在上面的控制柵極加正電壓Vpp,使電子通過絕緣層進入浮柵。寫入的過程是充電子的過程,如果寫入的page之前已經寫過,在寫入之前,必須先對flash進行擦除0,清除浮柵中的電子。

擦除(erase)操作與寫正好相反,如右圖,是在襯底加正電壓Vpp,把電子從浮柵中吸出來。

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

根據製作工藝,閃存存儲器可以分爲NOR型和NAND型。

NOR型是爲了替代EEPROM而設計,可以按位或者按字節進行訪問,NOR型閃存芯片具有可靠性高、隨機讀取速度快的優勢,但擦除和編程速度較慢,容量小,主要用於存儲可執行的成都代碼。

NAND閃存容量大,按頁進行讀寫,容量大,適合進行數據存儲。本文介紹都是基於NAND flash。

存儲結構

SSD中一般有多個NAND-Flash,每個NAND-Flash包含多個Block,每個Block包含多個(一般256個)Page。由於NAND的特性,存取都必須以Page爲單位,即每次讀寫至少是一個Page。通常地,每個Page的大小爲4K或者8K。

 

NAND的另一個特性是隻能讀寫單個Page,不能覆蓋寫某個Page,必須向空閒的page中寫。當沒有空閒page時就必須擦除一個page,由於擦除內容的電壓較高,必須是以Block爲單位,因此,必須要找到沒有有效內容的Block,先擦除再選擇空閒的Page寫入。

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的寫分爲新寫入覆蓋寫兩種,處理流程不同。

新寫

覆蓋寫

GC

磁盤空間有一部分是Over-Provisioning,因爲GC時需要一部分空間來做數據的騰挪,在ssd空間使用不多時排不上用場,但是當ssd空間快被用完時就可以使用Over-Provisioning來做gc,所以需要SSD提供額外空間即Over-Provisioning,保證GC的正常運行。

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命令來操作了。

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。

Program--Disturb

Program操作是在Block擦除的基礎上,通過往浮柵極注入電子,實現1變爲0,同一個Page,存在Program Disturb。如果往某個存儲單元寫入1,我們認爲這個比特可以不做Program操作,因爲擦除後的存儲單元,裏面數據本來就是1;如果我們寫入的是0,則真正需要做Program操作,即把之前的1改寫爲0。我們在寫一個Page的時候,本來某些bit我們想寫入1,但最後卻寫成0。

Io抖動分析

縱觀SSD的設計,我們可以發現影響SSD性能不穩定的因素有很多,其中主要因素有NAND介質本身的比特錯誤;讀與寫、擦除的衝突;Read Disturb、GC等問題導致性能變差。從外在表現來看,Bit Error的增多會導致SSD在使用過程中出現性能抖動問題,尤其是隨着使用壽命的耗盡,SSD性能會發生明顯的變化。另外在不同的IO Pattern下,性能也不盡相同,有些SSD甚至會存在寫後讀的問題,緊隨着寫之後的讀延遲會變得很大,達到毫秒級,這是由於內部IO衝突導致的。此外,在同一區域大量讀之後,也可能發現性能會出現抖動,這也是由於內部的Read Disturb機制開始工作了,會與用戶IO發生競爭,從而導致性能抖動,甚至下降。

(1)、Error Bit會導致IO的性能發生不確定的抖動。例如對於讀操作,如果Bit Error控制在一定範圍之內,BCH或者LDPC×××可以快速解碼,那麼一個正常的讀請求可以控制在100us左右。如果Bit Error超出了快速解碼的範圍,那麼×××將會花費大量的時間進行解碼,引入延遲;如果Bit Error過多,×××無法進行正確解碼,那麼在SSD內部會通過Read Retry機制嘗試通過調整NAND的參考電壓來重新讀取數據,這必然會導致更大的延遲;如果read retry也搞不定,那麼需要依賴企業級SSD內部的NAND級別RAID來進行數據恢復,同樣需要引入很大的延遲。當一個盤的使用壽命在不斷耗盡的過程中,NAND Flash的Bit Error錯誤將會呈上升趨勢,而很多譯碼器的解碼能力不會呈現線性變化趨勢,而更多的會呈現突變,類似於e指數變化趨勢。也就是說當Bit Error的數量達到一定程度之後,譯碼時間將會急劇增加,從而導致IO延遲急劇增加,外在表現爲IO性能的急劇抖動。

(2)、讀寫衝突、讀寫與擦除之間的衝突也是導致IO抖動的重要因素。當一個讀請求和擦除請求落在了同一個通道的相同Die上,那麼讀請求將會由於擦除操作而被迫等待。NAND Flash的擦除操作基本上在2ms以上,如果發生這種衝突,那麼IO的延遲將會從100us提升到2ms以上,從而發生嚴重的延遲。爲了解決這個問題,現在有些NAND也會提供Erase Suspend的功能,通過該命令讓擦除操作暫停,讓讀操作先進行,從而降低讀延遲。在SSD內部的讀寫衝突也會引入延遲,當讀寫操作發生在同一個Block時,會導致讀延遲增加。針對這個問題,在存儲系統設計過程中,需要將讀寫請求在空間上進行分離,從而避免讀寫請求在同一個Block上衝突。

(3)、Read/Program  Disturb的問題,當NANDFlash一個區域被重複讀之後,其Bit Error將會上升。爲了解決該問題,SSD內部的Firmware會進行Read Disturb的處理。一個區域被重複讀取之後,會進行數據搬移操作,該操作過程類似於Garbage Collection過程。一旦該過程被觸發之後,SSD內部的IO請求數量將會上升,從而對讀請求造成一定的影響,導致性能降低及抖動。

此外,SSD對於順序寫、隨機寫、順序讀、隨機讀以及混合讀寫情況下的性能都會有所變化,並且不同的IO Pattern會導致數據在NAND上的佈局發生變化,從而會導致各種讀寫情況下的性能都有所變化。例如,全盤順序寫之後的順序寫性能會比較高,但是在全盤隨機寫之後的順序寫性能會略差。其中的核心原因在於NAND上的數據佈局初始條件的不同,GC行爲會發生差異,從而導致後面的業務IO性能發生變化。在磁盤存儲中不存在這些因素,但是在SSD存儲中,一定需要考慮SSD固件的行爲。一個比較好的設計是讓SSD內部的FTL工作在最佳狀態下,從系統軟件層面整體控制存儲IO的行爲,從而保證IO的性能一致性,防止IO出現不確定的抖動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章