SSD內部的IO抖動因素

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

 

可能大家會說,SSD性能發生變化的一個重要因素是內部GC(垃圾回收)機制的影響。其實不全是,GC會導致SSD性能發生變化,NAND Flash上的數據佈局方式會對GC性能造成影響,其本質問題是數據遷移與用戶IO之間的資源競爭。另外,企業級SSD標稱的性能往往都是在GC全速運行情況下的穩態性能,而不是出廠時的空盤性能。所以,在一般情況下,應用測試的IO穩定性都還是可以的。存儲系統在使用SSD時,也都會只考慮穩態性能,而不是空盤性能。問題是在穩態性能情況下,在不同的IO Pattern情況下,不同的使用壽命情況下,其性能穩定性、IO抖動性還會發生變化。而這種性能變化恰恰是存儲系統設計者需要考慮和解決的重要問題。對於存儲系統設計者來說,不能將SSD當成一個黑盒進行使用,這是與磁盤存儲系統設計來說是一個重大差別。


wKioL1g5eIygkqcbAAA1PjA0Ei8634.jpg


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

 

NAND Flash作爲半導體存儲介質,其存在嚴重的比特錯誤(BitError)。不同製造工藝會導致NAND具有不同的比特出錯率;不同的NAND類型,MLCTLC以及未來的QLC都會具有不同的比特出錯率;3D TLC在使用不當的情況下,其出錯概率會發生變化;不同的使用壽命狀態,NAND存放時間,其比特出錯概率也會發生變化。所以,對於NAND介質來說,多種因素會導致出錯概率發生變化。對於SSD而言,這種Error Bit會導致IO的性能發生不確定的抖動。例如對於讀操作,如果Bit Error控制在一定範圍之內,BCH或者LDPC解碼器可以快速解碼,那麼一個正常的讀請求可以控制在100us左右。如果Bit Error超出了快速解碼的範圍,那麼解碼器將會花費大量的時間進行解碼,引入延遲;如果Bit Error過多,解碼器無法進行正確解碼,那麼在SSD內部會通過Read Retry機制嘗試通過調整NAND的參考電壓來重新讀取數據,這必然會導致更大的延遲;如果read retry也搞不定,那麼需要依賴企業級SSD內部的NAND級別RAID來進行數據恢復,同樣需要引入很大的延遲。當一個盤的使用壽命在不斷耗盡的過程中,NAND FlashBit Error錯誤將會呈上升趨勢,而很多譯碼器的解碼能力不會呈現線性變化趨勢,而更多的會呈現突變,類似於e指數變化趨勢。也就是說當Bit Error的數量達到一定程度之後,譯碼時間將會急劇增加,從而導致IO延遲急劇增加,外在表現爲IO性能的急劇抖動。

 

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

 

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

 

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

 


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