固態(tài)硬盤,英文名Solid State Disk或Solid State Drive,是一種以存儲器作為永久性存儲器的電腦存儲設(shè)備。雖然SSD已不是使用“碟盤”來記存數(shù)據(jù),也沒有用于“驅(qū)動”的馬達(dá),但是人們依照命名習(xí)慣,仍然稱為固態(tài)硬盤或固態(tài)驅(qū)動器。固態(tài)硬盤分易失性與非易失性兩種,我們著重研究更適合作為傳統(tǒng)硬盤替代品的非易失性固態(tài)硬盤。非易失性固態(tài)硬盤中數(shù)據(jù)的存取主要由NAND Flash及其主控芯片來實(shí)現(xiàn),沒有活動的機(jī)械部件,為純芯片結(jié)構(gòu)。
一,SSD的歷史背景
1967.貝爾實(shí)驗(yàn)室的韓裔工程師姜大元和華裔工程師施敏發(fā)明了浮柵晶體管(Floating Gate Transistor) .
20世紀(jì)70年代,出現(xiàn)以RAM(內(nèi)存芯片)為組裝的SSD.缺點(diǎn):體積大,容量小,掉電丟失數(shù)據(jù).
1999年,BiTMICRO發(fā)布18GB的閃存SSD. RAM逐漸被閃存替代.
2003年,SSD開始被存儲行業(yè)所熟知,各大存儲廠商開始研究SSD.
2006年,三星發(fā)布32G的SSD,NextCom推出以SSD為存儲的筆記本.
2007年,SSD的讀寫帶寬和隨機(jī)IOPS性能超越HDD,SSD和HDD的競爭正式開始.
2008年,全球SSD廠商突破100家,SanDisk成為全球SSD領(lǐng)頭羊.
2009年,SSD容量超越HDD,各大廠商開始推出以TB為容量的SSD.
2010年,全球SSD市場達(dá)到10億美元.企業(yè)級以SLC為主,消費(fèi)級開始走向MLC.
2013年,企業(yè)級PCIE的SSD問世,容量大,速度快,數(shù)據(jù)掉電保護(hù),SSD開始在協(xié)議上引發(fā)技術(shù)革命.
2015年,東芝發(fā)布了48層16GB的3D閃存樣品,西部數(shù)據(jù)190億美金收購Sandisk.
2016年,企業(yè)級SSD開始出現(xiàn)快速的技術(shù)更新,支持PCIE 4.0的SSD問世.
2020年,全球SSD出貨量超越了HDD,HDD開始走向大容量發(fā)展的道路.
二 SSD常見的形態(tài)
NAND是半導(dǎo)體存儲顆粒的一種(還有其他的種類,比如NOR), 簡單來說,NAND可以視作是由很多很多個(gè)電容器組成的集成電路。制造NAND和制造CPU處理器類似,都是使用高純度硅,切割成晶圓之后使用光刻機(jī)和化學(xué)溶劑將設(shè)計(jì)好的電路蝕刻上去,然后用金屬材料“鑲嵌”制作而成的。這樣做出來的是一個(gè)布滿NAND芯片的晶圓。將晶圓切開,然后對切割后的芯片精心挑選測試,封裝后就可以出廠了。雖然整個(gè)工藝雖然和制造CPU類似,但是電路等方面還是簡單不少的
常見的企業(yè)級SSD有SATA,NVME這兩種。隨著PCIE的不斷提速,nvme的SSD產(chǎn)量越來越高,SATA的SSD在逐步減少。本文重點(diǎn)介紹NVME的SSD
三 SSD的內(nèi)部結(jié)構(gòu)
SSD主要由控制單元和存儲單元(當(dāng)前主要是FLASH閃存顆粒)組成,控制單元包括SSD控制器、主機(jī)接口、DRAM等,存儲單元主要是NAND FLASH顆粒。
主機(jī)接口:主機(jī)訪問SSD的協(xié)議和物理接口,常用的有SATA、SAS和PCIE等。
SSD控制器:負(fù)責(zé)主機(jī)到后端介質(zhì)的讀寫訪問和協(xié)議轉(zhuǎn)換,表項(xiàng)管理、數(shù)據(jù)緩存及校驗(yàn)等,是SSD的核心部件。
DRAM:FTL表項(xiàng)和數(shù)據(jù)的緩存,以提供數(shù)據(jù)訪問性能。
NAND FLASH:數(shù)據(jù)存儲的物理器件載體。
四 SSD的讀寫原理
SSD的內(nèi)部構(gòu)造比較簡單,一般是主控和NAND這兩大部分。下面我看看SSD是如何工作的
SSD主控通過若干個(gè)通道(channel)并行操作多塊FLASH顆粒,類似RAID0,大大提高底層的帶寬。舉個(gè)例子,假設(shè)主控與FLASH顆粒之間有8個(gè)通道,每個(gè)通道上掛載了一個(gè)閃存顆粒,HOST與FLASH之間數(shù)據(jù)傳輸速率為200MB/s。該閃存顆粒Page大小為8KB,F(xiàn)LASH page的讀取時(shí)間為Tr=50us,平均寫入時(shí)間為Tp=800us,8KB數(shù)據(jù)傳輸時(shí)間為Tx=40us。那么底層讀取最大帶寬為(8KB/(50us+40us))*8 = 711MB/s,寫入最大帶寬為 (8KB/(800us+40us))*8 = 76MB/s。從上可以看出,要提高底層帶寬,可以增加底層并行的顆粒數(shù)目,也可以選擇速度快的FLASH顆粒(或者讓速度慢的顆粒變快,比如MLC配成SLC使用)。
我們以8通道為例,來講講HOST怎么讀寫SSD。主控通過8通道連接8個(gè)FLASH DIE,為方便解釋,這里只畫了每個(gè)DIE里的一個(gè)Block,其中每個(gè)小方塊表示一個(gè)Page (假設(shè)大小為4KB)。
HOST寫入4KB數(shù)據(jù)
HOST繼續(xù)寫入16KB數(shù)據(jù)
HOST繼續(xù)寫入,最后整個(gè)Block都寫滿
當(dāng)所有Channel上的Block都寫滿的時(shí)候,SSD主控會挑選下一個(gè)Block以同樣的方式繼續(xù)寫入。
HOST是通過LBA(Logical Block Address,邏輯地址塊)訪問SSD的,每個(gè)LBA代表著一個(gè)Sector(一般為512B大?。?,操作系統(tǒng)一般以4K為單位訪問SSD,我們把HOST訪問SSD的基本單元叫用戶頁(Host Page)。而在SSD內(nèi)部,SSD主控與FLASH之間是FLASH Page為基本單元訪問FLASH的,我們稱FLASH Page為物理頁(Physical Page)。HOST每寫入一個(gè)Host Page, SSD主控會找一個(gè)Physical Page把Host數(shù)據(jù)寫入,SSD內(nèi)部同時(shí)記錄了這樣一條映射(Map)。有了這樣一個(gè)映射關(guān)系后,下次HOST需要讀某個(gè)Host Page 時(shí),SSD就知道從FLASH的哪個(gè)位置把數(shù)據(jù)讀取上來。
SSD內(nèi)部維護(hù)了一張映射表(Map Table),HOST每寫入一個(gè)Host Page,就會產(chǎn)生一個(gè)新的映射關(guān)系,這個(gè)映射關(guān)系會加入(第一次寫)或者更改(覆蓋寫)Map Table;當(dāng)讀取某個(gè)Host Page時(shí), SSD首先查找Map Table中該Host Page對應(yīng)的Physical Page,然后再訪問Flash讀取相應(yīng)的Host數(shù)據(jù)。
由于閃存頁和邏輯頁大小不同,一般前者大于后者,所以實(shí)際上不會是一個(gè)邏輯頁對應(yīng)一個(gè)物理頁,而是若干個(gè)邏輯頁寫在一個(gè)物理頁中,邏輯頁其實(shí)是和子物理頁一一對應(yīng)的。
一張映射表有多大呢?
這里假設(shè)我們有一個(gè)256GB的SSD,以4KB大小的邏輯頁為例,那么用戶空間一共有64M(256GB/4KB)個(gè)邏輯頁,也就意味著SSD需要有能容納64M條映射關(guān)系的映射表。映射表中的每個(gè)單元(entry)存儲的就是物理地址(Physical Page Address),假設(shè)其為4字節(jié)(32bits),那么整個(gè)映射表的大小為64M×4B=256MB。一般來說,映射表大小為SSD容量大小的千分之一。
準(zhǔn)確來說,映射表大小是SSD容量大小的1/1024。前提條件是:映射頁大小為4KB,物理地址用4Byte表示。這里假設(shè)了SSD內(nèi)部映射粒度等于邏輯頁大小,當(dāng)然它們可以不一樣。對于絕大多數(shù)SSD,我們可以看到上面都有板載DRAM,其主要作用就是存儲這張映射表,如圖4-7所示。在SSD工作時(shí),全部或絕大部分的映射表都可以放在DRAM上,映射關(guān)系可以快速訪問。
對絕大多數(shù)SSD,我們可以看到上面都有板載DRAM,其主要作用就是用來存儲這張映射表。也有例外,比如基于Sandforce主控的SSD,它并不支持板載DRAM,那么它的映射表存在哪里呢?SSD工作時(shí),它的絕大部分映射是存儲在FLASH里面,還有一部分存儲在片上RAM上。當(dāng)HOST需要讀取一筆數(shù)據(jù)時(shí),對有板載DRAM的SSD來說,只要查找DRAM當(dāng)中的映射表,獲取到物理地址后訪問FLASH從而得到HOST數(shù)據(jù).這期間只需要訪問一次FLASH;而對Sandforce的SSD來說,它首先看看該Host Page對應(yīng)的映射關(guān)系是否在RAM內(nèi),如果在,那好辦,直接根據(jù)映射關(guān)系讀取FLASH;如果該映射關(guān)系不在RAM內(nèi),那么它首先需要把映射關(guān)系從FLASH里面讀取出來,然后再根據(jù)這個(gè)映射關(guān)系讀取Host數(shù)據(jù),這就意味著相比有DRAM的SSD,它需要讀取兩次FLASH才能把HOST數(shù)據(jù)讀取出來,底層有效帶寬減半。對HOST隨機(jī)讀來說,由于片上RAM有限,映射關(guān)系Cache命中(映射關(guān)系在片上RAM)的概率很小,所以對它來說,基本每次讀都需要訪問兩次FLASH,所以我們可以看到基于Sandforce主控的SSD隨機(jī)讀取性能是不太理想的。
當(dāng)整個(gè)SSD寫滿后,從用戶角度來看,如果想寫入新的數(shù)據(jù),則必須刪除一些數(shù)據(jù),然后騰出空間再寫。用戶在刪除和寫入數(shù)據(jù)的過程中,會導(dǎo)致一些Block里面的數(shù)據(jù)變無效或者變老。由于閃存不能覆蓋寫,閃存塊需擦除才能寫入。主機(jī)發(fā)來的某個(gè)數(shù)據(jù)塊,它不是寫在閃存固定位置,SSD可以為其分配任何可能的閃存空間寫入。因此,SSD內(nèi)部需要FTL這樣一個(gè)東西,完成邏輯數(shù)塊到閃存物理空間的轉(zhuǎn)換或者映射。
Block中的數(shù)據(jù)變老或者無效,是指沒有任何映射關(guān)系指向它們,用戶不會訪問到這些FLASH空間,它們被新的映射關(guān)系所取代。比如有一個(gè)Host Page A,開始它存儲在FLASH空間的X,映射關(guān)系為A->X。后來,HOST重寫了該Host Page,由于FLASH不能覆蓋寫,SSD內(nèi)部必須尋找一個(gè)沒有寫過的位置寫入新的數(shù)據(jù),假設(shè)為Y,這個(gè)時(shí)候新的映射關(guān)系建立:A→Y,之前的映射關(guān)系解除,位置X上的數(shù)據(jù)變老失效,我們把這些數(shù)據(jù)叫垃圾數(shù)據(jù)。
隨著HOST的持續(xù)寫入,F(xiàn)LASH存儲空間慢慢變小,直到耗盡。如果不及時(shí)清除這些垃圾數(shù)據(jù),HOST就無法寫入。SSD內(nèi)部都有垃圾回收機(jī)制,它的基本原理是把幾個(gè)Block中的有效數(shù)據(jù)(非垃圾數(shù)據(jù),上圖中的綠色小方塊表示的)集中搬到一個(gè)新的Block上面去,然后再把這幾個(gè)Block擦除掉,這樣就產(chǎn)生新的可用Block了。
上圖中,Block x上面有效數(shù)據(jù)為A,B,C,Block y上面有效數(shù)據(jù)為D,E,F,G,紅色方塊為無效數(shù)據(jù)。垃圾回收機(jī)制就是先找一個(gè)未寫過的可用Block z,然后把Block x和Block y的有效數(shù)據(jù)搬移到Block z上面去,這樣Block x和Block y上面就沒有任何有效數(shù)據(jù),可以擦除變成兩個(gè)可用的Block。
一塊剛買的SSD,你會發(fā)現(xiàn)寫入速度很快,那是因?yàn)橐婚_始總能找到可用的Block來進(jìn)行寫入。但是,隨著你對SSD的使用,你會發(fā)現(xiàn)它會變慢。原因就在于SSD寫滿后,當(dāng)你需要寫入新的數(shù)據(jù),往往需要做上述的垃圾回收:把若干個(gè)Block上面的有效數(shù)據(jù)搬移到某個(gè)Block,然后擦掉原先的Block,然后再把你的Host數(shù)據(jù)寫入。這比最初單純的找個(gè)可用的Block來寫耗時(shí)多了,所以速度變慢也就可以理解了。
還是以上圖為例。假設(shè)HOST要寫入4KB數(shù)據(jù) (H) ,由于當(dāng)前可用Block過少,SSD開始做垃圾回收。從上圖可以看出,對Block x來說,它需要把Page A,B,C的數(shù)據(jù)讀出并寫入到Block z,然后Block x擦除用于HOST數(shù)據(jù)寫入。從Host角度,它只寫了4KB數(shù)據(jù),但從SSD內(nèi)部來說,它實(shí)際寫入了4個(gè)Page(Page A, B, C寫入Block z,4KB數(shù)據(jù)H寫入到Block x)
2008年,Intel公司和SiliconSystems公司(2009 年被西部數(shù)字收購)第一次提出了寫入放大(Write Application)并在公開稿件里用到這個(gè)術(shù)語。
在上面例子中,Host寫了4KB數(shù)據(jù),閃存寫了4個(gè)4KB數(shù)據(jù),所以上面例子中寫放大為4。
假設(shè)一個(gè)SSD,底下所有FLASH容量為256GB,開放給用戶使用也是256GB,那么問題就來了。想象一個(gè)場景,HOST持續(xù)寫滿整個(gè)SSD,接著刪除一些文件,寫入新的文件數(shù)據(jù),試問新的數(shù)據(jù)能寫入嗎?在SSD底層,如果要寫入新的數(shù)據(jù),必須要有可用的空閑Block,但由于之前256GB空間已經(jīng)被HOST數(shù)據(jù)占用了,根本就沒有空閑Block來寫你的數(shù)據(jù)。不對,你剛才不是刪了一些數(shù)據(jù)嗎?你可以垃圾回收呀。不錯(cuò),但問題來了,在上面介紹垃圾回收的時(shí)候,我們需要有Block z來寫回收來的有效數(shù)據(jù),我們這個(gè)時(shí)候連Block z都找不到,談什么垃圾回收?所以,最后是用戶寫失敗。
上面這個(gè)場景至少說明了一點(diǎn),SSD內(nèi)部需要預(yù)留空間(需要有自己的小金庫,不能工資全部上繳),這部分空間HOST是看不到的。這部分預(yù)留空間,不僅僅用以做垃圾回收,事實(shí)上,SSD內(nèi)部的一些系統(tǒng)數(shù)據(jù),也需要預(yù)留空間來存儲,比如前面說到的映射表(Map Table),比如SSD固件,以及其它的一些SSD系統(tǒng)管理數(shù)據(jù)。
一般從HOST角度來看,1GB= 1,000,000,000Byte,從底層FLASH角度,1GB=1102410241024Byte。256GB FLASH 為256(2^30) Byte,而一般說的256GB SSD 容量為256*(10^9) Byte,這樣,天然的有(256*(230)-256*(109))/(256*(10^9)) = 7.37%的OP。如果把256GB Flash容量的SSD配成240GB的,那么它的OP是多大呢? (256*(230)-240*(109))/(240*(10^9)) = 14.5%
除了滿足基本的使用要求外,OP變大有什么壞處或者好處呢?壞處很顯然,用戶能使用的SSD容量變小。那么好處呢?
回到垃圾回收原理來。
再看一下這張圖?;厥誃lock x,上面有3個(gè)有效Page,需要讀寫3個(gè)Page完成整個(gè)Block的回收;而回收Block y時(shí),則需要讀寫4個(gè)有效Page。兩者相比,顯然回收Block x比回收Block y快一些。說明一個(gè)簡單的道理:一個(gè)Block上有效的數(shù)據(jù)越少(垃圾數(shù)據(jù)越多),則回收速度越快。
256GB FLASH配成256GB的SSD (OP = 7.37%), 意味著256*(10^9)的有效數(shù)據(jù)寫到 256*(230)的空間,每個(gè)Block上面的平均有效數(shù)據(jù)率可以認(rèn)為是256*(109)/256*(2^30) = 93.1%。
如果配成240GB的SSD,則意味著240*(109)的有效數(shù)據(jù)寫到256*(230)的空間,每個(gè)Block的平均有效數(shù)據(jù)率為240*(109)/256*(230) = 87.3%。 OP越大,每個(gè)Block平均有效數(shù)據(jù)率越小,因此我們可以得出的結(jié)論:
OP越大,垃圾回收越快,寫放大越小。這就是OP大的好處。
寫放大越小,意味著寫入同樣多的HOST數(shù)據(jù),寫入到FLASH中的數(shù)據(jù)越少,也就意味著FLASH損耗越小。FLASH都是有一定壽命的,它是用P/E數(shù) (Program/Erase Count)來衡量的。如果SSD集中對某幾個(gè)Block進(jìn)行擦寫,那么這幾個(gè)Block很快就壽命耗盡。比如在用戶空間,有些數(shù)據(jù)是頻繁需要更新的,那么這些數(shù)據(jù)所在Block就需要頻繁的進(jìn)行擦寫,這些Block的壽命就可能很快的耗盡。相反,有些數(shù)據(jù)用戶是很少更新的,比如一些只讀文件,那么這些數(shù)據(jù)所在的Block擦寫的次數(shù)就很少。隨著用戶對SSD的使用,就會形成一些Block有很高的PE數(shù),而有些Block的PE數(shù)卻很低的。這不是我們想看到的,我們希望所有Block的PE數(shù)都應(yīng)該差不多,就是這些Block被均衡的使用。在SSD內(nèi)部,有一種叫磨損平衡(Wear Leveling,WL)的機(jī)制來保證這點(diǎn)。
一個(gè)閃存塊壽命有多長呢?從SLC十幾萬的擦寫次數(shù),到MLC幾千的擦寫次數(shù),然后到TLC的一兩千次甚至幾百次擦寫次數(shù),隨著閃存工藝不斷向前推,閃存的壽命越來越短,SSD對磨損平衡的處理要求也越來越高,如下所示。
WL有兩種算法:動態(tài)WL和靜態(tài)WL。所謂動態(tài)WL,就是在使用Block進(jìn)行擦寫操作的時(shí)候,優(yōu)先挑選PE 數(shù)低的;所謂靜態(tài)WL,就是把長期沒有修改的老數(shù)據(jù)(如前面提到的只讀文件數(shù)據(jù))從PE數(shù)低的Block當(dāng)中搬出來,然后找個(gè)PE 數(shù)高的Block進(jìn)行存放,這樣,之前低PE數(shù)的Block就能拿出來使用文章來源:http://www.zghlxwxcb.cn/news/detail-684027.html
假設(shè)有一個(gè)SSD里有4096個(gè)閃存塊,擦寫次數(shù)為10000次,其中2.5%為備用區(qū)。現(xiàn)在我寫入三個(gè)文件,每個(gè)文件占據(jù)了50個(gè)塊的容量,每10分鐘更新其中一個(gè)文件,如果沒有WL的話,那就是全盤只有前200(3個(gè)數(shù)據(jù)塊3*50,+ 一個(gè)搬運(yùn)數(shù)據(jù)塊50)個(gè)塊在做擦寫操作了。那么可以計(jì)算它的壽命大概是
如果做了WL呢
可以看到 做磨損平衡之后。SSD的壽命能延長很多文章來源地址http://www.zghlxwxcb.cn/news/detail-684027.html
到了這里,關(guān)于SSD的基礎(chǔ)知識介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!