我們知道機(jī)械硬盤最大的缺點(diǎn)在于,尋道時(shí)間比較長,也就是不適合隨機(jī)小塊IO亮元。所以這幾年固態(tài)存儲(chǔ)大行其道猛计,因?yàn)樗鼘θ魏蔚刂吩L問的開銷都相等,節(jié)省了機(jī)械尋道時(shí)間爆捞,所以隨機(jī)IO性能很好奉瘤。
當(dāng)前的SSD硬盤,單塊SSD的大塊連續(xù)讀吞吐量超過了350MB/s煮甥,寫超過了210MB/s盗温,甚至4K塊隨機(jī)讀吞吐量超過了200MB/s,寫超過了180MB/s成肘,隨機(jī)讀IOPS超過了600卖局,隨機(jī)IO延遲不超過1ms。這種速度滿足當(dāng)前主流的架構(gòu)不成問題双霍。
SSD固態(tài)硬盤的硬件組成
SSD(Solid State Drive):是一種利用Flash芯片或者DRAM芯片作為數(shù)據(jù)永久存儲(chǔ)的硬盤砚偶。所以不再使用磁技術(shù)來存儲(chǔ)數(shù)據(jù)。
利用DRAM作為永久存儲(chǔ)介質(zhì)的SSD洒闸,又稱為RAM-Disk染坯,使用DRAM內(nèi)存條來存儲(chǔ)數(shù)據(jù),所以在外部電池?cái)嚅_后丘逸,需要使用電池來維持DRAM中的數(shù)據(jù)单鹿。
-
基于Flash介質(zhì)的SSD:使用“浮動(dòng)門場效應(yīng)晶體管”的晶體管來保存數(shù)據(jù),每個(gè)這樣的晶體管叫做一個(gè)“Cell”鸣个,即單元羞反。有兩種類型的單元:
Single Level Cell(SLC):每個(gè)單元可以保存1B的數(shù)據(jù)
Mult Level Cell(MLC):每個(gè)單元可以保存2B的數(shù)據(jù)。所以MLC容量是SLC的兩倍囤萤,成本卻與SLC大致相當(dāng)。但因?yàn)镸LC的每個(gè)單元需要存儲(chǔ)2B是趴,所以復(fù)雜度比較高涛舍,出錯(cuò)率自然比較高。
Flash 芯片
Cell
本節(jié)我們介紹一下Cell的構(gòu)成唆途,這就是SSD可以在掉電后不丟失信息的原因
SSD是由浮動(dòng)門構(gòu)成的富雅,所謂浮動(dòng)門是一個(gè)邏輯電路,四周被$SiO_2$包裹著肛搬。在Word Line(字線)上抬高電勢没佑,電子存儲(chǔ)在浮動(dòng)門中,字線恢復(fù)電勢温赔,電子不會(huì)丟失蛤奢,也就是說浮動(dòng)門仍然是充電的。
那么什么時(shí)候狀態(tài)為0,什么時(shí)候狀態(tài)為1呢啤贩?充電到一定電勢的后表示0待秃,電勢降到一定的閾值以后,表示為1痹屹。
在前面我們說過章郁,MLC可以在一個(gè)Cell里面保存多位,也就是一個(gè)Cell可以有多種電勢閾值志衍,這樣就可以表示00,01,11,10 4種狀態(tài)暖庄。
Cell串
把多個(gè)Cell串聯(lián)起來,就組成了Cell串楼肪。對每個(gè)cell串雄驹,每次只能讀寫其中一個(gè)Cell,所以我們會(huì)把多個(gè)Cell串并聯(lián)起來淹辞,并行操作医舆,這樣就可以讀多位數(shù)據(jù)呢。
NADD就是由這種晶體管有序排列起來的Flash芯片象缀。每43148=34512個(gè)Cell組成一個(gè)Page蔬将,當(dāng)然這只是邏輯上,它是IO的最小單位央星。每個(gè)Page可以存放4KB的內(nèi)容*霞怀。
每128個(gè)Page組成一個(gè)Block,每2048個(gè)Block組成一個(gè)Plane區(qū)域莉给。而一個(gè)Flash芯片由兩個(gè)區(qū)域組稱毙石,一個(gè)存儲(chǔ)奇數(shù)序號,另一個(gè)存儲(chǔ)偶數(shù)序號颓遏。
SSD固態(tài)盤的構(gòu)成
上面我們講解了NAND Flash芯片的主要構(gòu)成部分徐矩,現(xiàn)在我們來看SSD固態(tài)盤的整體構(gòu)成。
下圖為Intel X-25M固態(tài)硬盤的拆機(jī)圖叁幢。里面包含:
- 10片NAND Flash芯片
- SSD控制器
- RAM Buffer
SSD控制器芯片負(fù)責(zé)向所有的NAND Flash芯片執(zhí)行讀寫任務(wù)滤灯,同樣也就通過指令的方式來運(yùn)作,因?yàn)榈刂沸畔⒑蛿?shù)據(jù)信息都在這8位的總線上傳送曼玩,加上總線位寬太窄鳞骤,所以一個(gè)簡單的尋址都需要多個(gè)時(shí)鐘周期才能僅完成。
我們知道芯片容量越大黍判,地址就會(huì)越長豫尽,尋址時(shí)間也就會(huì)越長,對小塊隨機(jī)IO顷帖,F(xiàn)lash會(huì)隨著容量的增加而變得越來越低效美旧。
讀寫數(shù)據(jù)流程
下面來看一下讀寫操作都需要做哪些工作渤滞?
如何讀數(shù)據(jù)
當(dāng)需要讀某個(gè)Page時(shí),F(xiàn)lash控制器將這個(gè)Page的字線組電勢置為0陈症,可以將電勢值解碼成1或者0蔼水,放到SSD的RAM Buffer中。
從上述過程就可以看出SSD的最小IO單位為1個(gè)Page
如何寫數(shù)據(jù)
Flash芯片要求在修改一個(gè)Cell中的位之前录肯,必須擦除這個(gè)Cell趴腋。其實(shí)這個(gè)擦除動(dòng)作就是將一個(gè)Block一下全放電。也就是每次擦除只能一下擦除整個(gè)Block论咏,將所有的Cell全置1优炬。
這就是SSD的一個(gè)非常致命的缺點(diǎn),它不能單獨(dú)擦除某個(gè)Page或者Cell
擦除完畢以后厅贪,SSD會(huì)以Page為單位進(jìn)行寫入蠢护。
SSD的問題
SSD天然的缺陷
Flash芯片在寫入數(shù)據(jù)的時(shí)候有很多效率低下的地方,這是Flash芯片的通病
-
擦除前需要將整個(gè)Block清掉(Erase before overwrite)
上面我們講到過如果要寫入數(shù)據(jù)养涮,必須先Erase整個(gè)Block葵硕,而不只是把一個(gè)Page或者Cell給清掉。相比于機(jī)械磁盤贯吓,多了擦除的這個(gè)步驟懈凹。
特別是如果僅僅需要更改某個(gè)Page的內(nèi)容,卻需要擦除整個(gè)Block悄谐,性能浪費(fèi)很嚴(yán)重介评。我們可以看看修改只修改某個(gè)Page的過程,
在擦除之前爬舰,先將Block的數(shù)據(jù)讀入RAM中们陆,
然后擦除整個(gè)Block,
再更新RAM中的對應(yīng)Page情屹,寫回Flash芯片中
這也是SSD的緩存通常比較大的原因坪仇。
這就叫做寫擴(kuò)大,我們姑且稱之為寫懲罰
這個(gè)時(shí)候我們會(huì)問屁商, 為什么如果只需要修改一個(gè)Cell烟很,卻需要把Block放電?
因?yàn)镃ell之間是存在干擾的蜡镶,如果有的在充電,有的在放電恤筛,則會(huì)產(chǎn)生不可控的干擾問題官还。所以不如直接將所有的先放電。
那 為什么需要一次擦一個(gè)Block毒坛,而不是一個(gè)Page望伦?
這是管理粒度的問題林说,粒度越小,管理開銷越大屯伞,所以一次擦一個(gè)Block是一種比較折中的方案腿箩。
不過幸好,向Free Space寫入數(shù)據(jù)時(shí)劣摇,因?yàn)槔锩鏇]有被寫過珠移,所以不需要擦除,當(dāng)然沒有寫懲罰末融。
但是另一個(gè)問題又來了钧惧,SSD如何知道哪些是Free Space?
我們知道只有文件系統(tǒng)才知道硬盤上哪些數(shù)據(jù)是有用的勾习,它會(huì)使用元數(shù)據(jù)來進(jìn)行記錄浓瞪,即使是刪除一份數(shù)據(jù)也只是修改了元數(shù)據(jù),而不是把數(shù)據(jù)真正的刪除掉巧婶。
這樣看來乾颁,SSD其實(shí)是不知道硬盤上哪些地方是所謂的Free Space,它只會(huì)把數(shù)據(jù)往從來沒修過的地方寫艺栈,所以Free Space會(huì)越來越少英岭。
- Wear Off:
什么是Wear off?就是邏輯門充放電次數(shù)過多眼滤,$SiO_2$絕緣層的絕緣能力遭到損耗巴席,逐漸不再絕緣,無法保證有充足的電荷诅需,也就是Cell已經(jīng)物理損壞了漾唉。
更糟糕的是,損壞的Cell會(huì)拖累整個(gè)Page堰塌,因?yàn)樽钚〉膶ぶ穯挝皇荘age赵刑。這個(gè)Page的邏輯地址會(huì)被重定向到其他的Page上
MLC因?yàn)槠骷?fù)雜,可擦寫的壽命小于10000次场刑,而SLC則十倍于MLC般此,小于100000次。
如何解決牵现?
之前我們提到SSD在寫上有會(huì)極大的寫懲罰铐懊,而且會(huì)加速Wear off,有什么好的解決方案瞎疼?
-
方法一:拆東墻補(bǔ)西墻重定向?qū)?/p>
如果同一個(gè)Cell被高頻擦寫科乎,那么它被損壞的幾率當(dāng)然增大。如果一個(gè)Page之前都被寫過了贼急,我們不如把所有針對這個(gè)Page的寫請求重定向到Free Space上.
這樣的好處在于對Free Space的寫是不需要提前擦除的茅茂,減少了擦除次數(shù)捏萍。不過這些被寫過的Page也不能浪費(fèi)了,我們可以把他們標(biāo)為"Garbage"空闲,等待比較多的時(shí)候令杈,再批量回收。
這樣做的目的是將寫操作平衡到所有可能的Block中碴倾,降低單位時(shí)間內(nèi)的每個(gè)Block擦寫次數(shù)逗噩。問題是,F(xiàn)ree Space會(huì)越來越少影斑,重定向?qū)懙膸茁室矔?huì)越來越少给赞,最后降為0.
而且因?yàn)橛兄囟ㄏ颍琒SD內(nèi)部很定需要維護(hù)一個(gè)地址映射表矫户,需要SSD的CPU能維護(hù)一定比較復(fù)雜的程序片迅,稱為
wear Leveling
(損耗平衡算法) -
方法二:定期清垃圾
前面我們說過SSD自己是不知道哪些空間是Free Space,但是文件系統(tǒng)知道皆辽,可以在操作系統(tǒng)里面運(yùn)行一種Wiper柑蛇,可以不斷掃描,然后把空閑空間通知給SSD驱闷,由SSD來執(zhí)行擦除工作耻台。
不過這種清除工作只能定期執(zhí)行
-
方法三:持續(xù)清除體內(nèi)垃圾
有沒有辦法可以讓文件系統(tǒng)在刪除之后實(shí)時(shí)通知SSD。
可以使用ATA指令里面一個(gè)功能——TRIM空另,現(xiàn)在已經(jīng)集成在很多SSD的Firmware中了盆耽。
-
方法四:IO 優(yōu)化
之前的方法主要著力點(diǎn)在Free Space。我們也可以采用另一種思路扼菠,對IO進(jìn)行優(yōu)化摄杂。
比如Delay write。現(xiàn)在有兩個(gè)針對同一個(gè)地址的寫IO循榆,在Write1還沒寫到硬盤之前析恢,Write 2就到了,控制器直接用Write 2來覆蓋Write 1 秧饮,這個(gè)操作是在內(nèi)存里面的映挂,省去了Write 1 寫入硬盤的過程。這種機(jī)制為“寫命中”的一種情況盗尸。問題就是數(shù)據(jù)可能不一致柑船。比如有如下IO:Write 1 , Read 2 , Write 3 ,此時(shí)如果用Write 3取代Write 1泼各,那么Read 2 讀出了Write 3 的內(nèi)容椎组,實(shí)際上Read 2應(yīng)該讀Write 1的內(nèi)容,所以數(shù)據(jù)不一致历恐。
另外還可以使用Combine Write寸癌,對機(jī)械硬盤來說,如果控制器一段時(shí)間內(nèi)收到多個(gè)寫IO弱贼,而這些寫IO的地址在邏輯上是連續(xù)的蒸苇,可以將小寫IO合并為大IO,一次性寫入吮旅,節(jié)約了SCSI指令周期溪烤。
對SSD來說,邏輯地址和物理地址存在一個(gè)映射關(guān)系庇勃,我們讀數(shù)據(jù)的時(shí)候是根據(jù)這個(gè)映射關(guān)系來的檬嘀,所以可以任何地址的小IO整合為大IO,直接寫到Free的Block中责嚷。因?yàn)镾SD需要對數(shù)據(jù)進(jìn)行合并以及優(yōu)化鸳兽,所以SSD對收到的寫數(shù)據(jù)一般采用Write Back模式,即收到主機(jī)控制器的數(shù)據(jù)立即返回成功罕拂,然后異步處理揍异。這樣就存在一個(gè)風(fēng)險(xiǎn),如果掉電了爆班,數(shù)據(jù)就會(huì)丟失衷掷,所以SSD是需要掉電保護(hù)機(jī)制的,一般使用一個(gè)超級電容來維持掉電之后的臟數(shù)據(jù)刷盤柿菩。
-
預(yù)留備用空間
為了防止文件系統(tǒng)將數(shù)據(jù)寫滿的極端情況戚嗅,SSD可以自己預(yù)留一部分備用空間用于重定向?qū)懀驗(yàn)椴煌ㄖ募到y(tǒng)枢舶,所以只有SSD才知道懦胞,這樣就有了一個(gè)永遠(yuǎn)不會(huì)被占用的定額Free Space。
下面說一個(gè)題外話祟辟, 為什么不需要對SSD進(jìn)行碎片整理医瘫?
我們來看一下機(jī)械硬盤為什么需要進(jìn)行碎片整理?機(jī)械硬盤主要瓶頸在于尋道時(shí)間旧困,因?yàn)樗槠遣涣闵⒌膲K醇份,尋道次數(shù)會(huì)很多。整合到一起呢吼具,邏輯上連續(xù)的LBA地址同樣也是物理上連續(xù)的僚纷,磁盤臂換道的時(shí)間就少了。
但是對SSD而言拗盒,沒有了磁盤臂怖竭,它是通過映射關(guān)系來讀的,即使整理了碎片也沒啥用陡蝇。反而做了大堆無用功痊臭,還會(huì)減少SSD的壽命哮肚。
SSD如何處理Cell損壞
機(jī)械硬盤如果損壞,則該扇區(qū)不能磁化广匙,磁頭會(huì)感知允趟。
而Flash中的Cell被擊穿一定次數(shù)后,損壞的幾率很高鸦致,
SSD如何判斷損壞的呢潮剪?實(shí)際上Cell只有充電和沒充電兩種狀態(tài),那么電路實(shí)際上無法直接判斷是漏電導(dǎo)致的還是說原本就是沒電的分唾。
只好使用ECC糾錯(cuò)碼抗碰,每次讀出某個(gè)Page需要進(jìn)行ECC校驗(yàn)。Flash廠商會(huì)在Datasheet中給出最低要求绽乔,即使用該顆粒起碼配合使用何種力度的糾錯(cuò)碼弧蝇。比如8b@512B,意味著512B的范圍內(nèi)出現(xiàn)8b錯(cuò)誤迄汛,可以糾錯(cuò)捍壤。如果超過了,就只能上報(bào)“不可恢復(fù)錯(cuò)誤”鞍爱。
廠商給出的糾錯(cuò)碼力度越低鹃觉,說明顆粒的品質(zhì)越好,損壞率越低睹逃。
SSD的前景
以上緩解SSD效率的問題都是治標(biāo)不治本的盗扇,為了解決多個(gè)問題,設(shè)計(jì)了若干的補(bǔ)救措施沉填,需要TRIM來維持疗隶,而且數(shù)據(jù)不能占得太滿。SSD在使用的時(shí)候也略顯尷尬翼闹,因?yàn)槌杀咎甙弑牵脩羧粜枰粋€(gè)10TB的存儲(chǔ)系統(tǒng),不可能都用SSD猎荠,所以很多廠商出品了SSD + HDD混合存儲(chǔ)坚弱,其實(shí)就是將Flash芯片作為磁盤的二級緩存,一級緩存是RAM关摇,二級是FLASH荒叶,三級是磁盤片。
有人說傳統(tǒng)磁盤有64MB的RAM緩存输虱,為什么還需要Flash作為下一級的緩存些楣?如果只用磁盤的RAM,首先空間比較小,很快就塞滿了愁茁,另外不能掉電蚕钦,刷到盤片里面的時(shí)候,會(huì)導(dǎo)致性能驟降埋市。
而使用Flash芯片再加一級緩存冠桃,可以把RAM中的數(shù)據(jù)存儲(chǔ)Flash中,最關(guān)鍵的是可以掉電道宅,這樣可以直接回復(fù)給控制器成功之后,磁盤驅(qū)動(dòng)器再在后臺(tái)將數(shù)據(jù)從Flash中寫到磁盤片中胸蛛,這樣既比純SSD便宜污茵,還保證了性能。