基本SSD操作方式
寫入放大(WA)是閃存和固態(tài)硬盤之間相關(guān)聯(lián)的一個屬性,因為閃存必須先刪除才能改寫(我們也叫“編程“),在執(zhí)行這些操作的時候,移動(或重寫)用戶數(shù) 據(jù)和元數(shù)據(jù)(metadata)不止一次。這些多次的操作,不但增加了寫入數(shù)據(jù)量,減少了SSD的使用壽命,而且還吃光了閃存的帶寬(間接地影響了隨機寫 入性能)。許多因素會影響到SSD的寫入放大,下面我就來稍微詳細的解釋一下。
早在2008年,Intel公司和SiliconSystems公司(2009 年被西部數(shù)字收購)第一次提出了寫入放大并在公開稿件里用到這個術(shù)語。他們當時的說法是,寫入算法不可能低于1,但是這種說法在2009年被 SandForce打破,SandForce說他們的寫入放大是0.5。

由于閃存的運作特性,數(shù)據(jù)不能像在普通機械硬盤里那樣被直接覆蓋。當數(shù)據(jù)第一次寫入SSD的時候,由于SSD內(nèi)所有的顆粒都為已擦除狀態(tài),所以數(shù)據(jù)能夠以 頁為最小單位直接寫入進去(一般是4K,參考顆粒資料),SSD上的主控制器,使用了邏輯和物理的映射系統(tǒng)來管理著閃存。(邏輯我們一般指的是LBA,而 物理指的是FTL)。當有新的數(shù)據(jù)寫入時需要替換舊的數(shù)據(jù)時,SSD主控制器將把新的數(shù)據(jù)寫入到另外的空白的閃存空間上(已擦除狀態(tài))然后更新邏輯LBA 地址來指向到新的物理FTL地址。而舊的地址內(nèi)容就變成了無效的數(shù)據(jù),但是要在上面再次寫入的話,就需要首先擦除掉這個無效數(shù)據(jù)。(閃存運作特性,寫入最 小單位是頁,而擦除最小單位是塊,一般為128~256個頁)
那么問題就來了,閃存有編程和擦除的次數(shù)限制,這樣每次的編程/擦除就叫做1個P/E(program/erase cycles)周期,大家應(yīng)該都知道MLC一般是5000~10000次,而SLC是10萬次左右(查閃存資料)。也就是說寫入放大越低,P/E周期就越 少,閃存壽命就越久。
寫入放大的計算
2008年,Intel公司和SiliconSystems公司(2009 年被西部數(shù)字收購)第一次提出了寫入放大并在公開稿件里用到這個術(shù)語。所有的SSD都有一個寫入放大值,這個數(shù)值是非固定的,取決于這個SSD寫入的數(shù)據(jù) 是隨機的還是持續(xù)的?寫入量是多少?主控做了那些操作,等等。
計算寫入放大的公式大致是這樣:

對于單次操作,最簡單的例子,比如我要寫入一個4KB的數(shù)據(jù),最壞的情況就是,一個塊里已經(jīng)沒有干凈空間了,但是有無效數(shù)據(jù)可以擦除,所以主控就把所有的 數(shù)據(jù)讀出來,擦除塊,再加上這個4KB新數(shù)據(jù)寫回去,這個操作帶來的寫入放大就是: 我實際寫4K的數(shù)據(jù),造成了整個塊(512KB)的寫入操作,那就是128倍放大。同時帶來了原本只需要簡單的寫4KB的操作變成讀取(512KB),擦 (512KB),改寫(512KB),造成了延遲大大增加,速度慢是自然了。
影響寫入放大的因素
許多因素影響SSD的寫入放大。下面我列出了主要因素,以及它們?nèi)绾斡绊憣懛糯蟆?br>
1. 垃圾回收(GC) Garbage collection --- 雖然增加了寫入放大,但是速度有提升。
這個比較特殊的算法用來整理,移動,合并,刪除閃存塊來提升效率。
2. 預(yù)留空間(OP) Over-provisioning --- 減少寫入放大,好。(預(yù)留空間越大,寫入放大越低)
在SSD的閃存上劃出一部分空間留給主控做優(yōu)化,用戶不能操作的空間。
3. Trim 開啟后可以減少寫入放大,好。
一個ATA指令,由操作系統(tǒng)發(fā)送給SSD主控,告訴主控哪些數(shù)據(jù)是無效的并且可以不用做垃圾回收操作。
4. 可用容量 減少寫入放大,好。(可用空間越大,寫入放大越低)
用戶使用中沒有用到的空間,需要有Trim支持,不然不會影響寫入放大。
5. 安全擦除 Secure Erase 減少寫入放大,好
清除所有用戶數(shù)據(jù)和相關(guān)元數(shù)據(jù),讓SSD重置到初始性能。
6. 靜動數(shù)據(jù)分離 Separating Static and Dynamic Data 減少寫入放大,好
分組常改寫和不常改寫的數(shù)據(jù)。
7. 持續(xù)寫入 Sequential writes 減少寫入放大,好
理論上來說,持續(xù)寫入的寫入放大為1,但是某些因素還是會影響這個數(shù)值。
8. 隨機寫入 Random writes 提高寫入放大,不好
隨機寫入會寫入很多非連續(xù)的LBA,將會大大提升寫入放大。
9. 磨損平衡(WL) Wear Leveling 直接提高寫入放大,不好
確保閃存的每個塊被寫入的次數(shù)相等的一種機制。
詳細解釋
垃圾回收 Garbage collection

一旦SSD的所有塊都已經(jīng)寫入了一次,SSD主控制器將會初始化那些包含無效數(shù)據(jù)的塊。(陳舊數(shù)據(jù),這些塊里的數(shù)據(jù)已經(jīng)被更新的數(shù)據(jù)替換,已經(jīng)無效了,沒 了LBA地址),現(xiàn)在他們正在等待被刪除,以便新的數(shù)據(jù)可以寫入其中,如何優(yōu)化并整理這些個等待被刪除的無效數(shù)據(jù),這個算法被稱為垃圾收集(GC)。我們 可以看出這個操作是要有前提的,就是SSD必須要支持Trim技術(shù),不然GC就顯不出他的優(yōu)勢了(這也是為啥目前只有支持Trim的SSD才會有GC功 能),而GC的本質(zhì)區(qū)別是它們何時處理?效率多少?
數(shù)據(jù)的最小寫入單位是頁,然而擦除的最小單位是塊(大小取決于閃存,自己查資料,一般128~256頁)。如果在塊上的某些頁中的數(shù)據(jù)不再需要,與在該塊 內(nèi)好的數(shù)據(jù)的其他所有頁必須全部讀取并重新寫入到新的已擦除的塊內(nèi)。這個操作叫做Copy Block,每個主控都會帶。(包括U盤主控,這也是為了磨損平衡考慮)然后主控制器再刪除掉這個塊,用來給下一次寫入數(shù)據(jù)用。這種操作一切指令來自主控 而非用戶的叫做GC,將會影響寫入放大。請記住,GC有點像整理硬盤,所以要保證有一定的可用容量,可用容量越大,GC效率越高
GC分為后臺GC和主動GC
我們知道垃圾的收集過程,包括讀取和重寫數(shù)據(jù)到閃存。意味著這樣操作會大大降低主控的性能,因為占用了主控的能力和帶寬。所以,一些SSD控制器采用所謂 的后臺垃圾收集算法(也稱為閑置垃圾收集),該控制器會使用空閑的時間來做垃圾收集,讓主控在使用時一直保持高性能。試想一下如果垃圾回收把所有的空間都 整理合并過了,那樣在性能提升的同時,也增加了寫入放大,所以像barefoot主控的SSD(閑置GC)一般只垃圾回收一小部分的空白空間來限制過多的 寫入操作。另一種方案就是主動GC,這需要有相當性能的主控制器,來保證在操作數(shù)據(jù)的同時進行GC操作,這類GC適合在服務(wù)器里用到,因為個人用戶可以把 電腦閑置了做GC,但是服務(wù)器可不行,所以要保證性能的話必須在運行的同時做GC,這對主控制器的性能提出了很高的要求,SandForce的主控就是這 類。。
手動GC
記得以前我曾討論過手動GC的操作
乘著現(xiàn)在正好討論到寫入放大,我也再次強調(diào)下為何寫入GC能成功的道理:
不管你的SSD是不是支持Trim或者在RAID陣列狀態(tài)下,手動GC或多或少都會有點作用(特殊的除外),為何?
SSD的NAND顆粒有2個狀態(tài),物理上來說就是顆粒充電表示1,顆粒放電表示0,擦除數(shù)據(jù)意味著全盤寫1(充電)。顆粒必須以塊為最小單位一下子充電, 能以頁為單位一個個放電。前面我們得知,如果SSD不支持Trim的話(RAID陣列目前都不支持),在全部SSD寫滿后,主控并不知道顆粒的塊中哪些數(shù) 據(jù)是無效的,所以它認為他們都有效,操作系統(tǒng)的LBA卻知道(因為新數(shù)據(jù)有LBA,無效數(shù)據(jù)的LBA已經(jīng)被重定向了),所以不支持Trim的SSD就意味 著全盤顆粒寫滿后(指的是顆粒寫滿,其中包括有效和無效數(shù)據(jù),不是我們通常看到的系統(tǒng)里可用容量滿)再寫入數(shù)據(jù)要等待寫前的擦除操作,系統(tǒng)就會在沒用到的 LBA地址下做寫入操作。說白了就是系統(tǒng)知道哪里可以寫而SSD主控不知道。手動GC正是利用了這一點,做了全盤填FF操作,F(xiàn)F在邏輯上就是1,那么就 是全盤顆粒里的無效數(shù)據(jù)處填1,1在NAND顆粒上代表充電,代表擦除。所以隨著用戶的可用容量越來越少,然后再一下子刪除這個生成出來的大文件,代表了 全部可用容量區(qū)域都為邏輯1(擦除狀態(tài)),這個狀態(tài)就是GC操作后刪除無效數(shù)據(jù)區(qū)塊后的狀態(tài),所以叫做手動GC,自然這些區(qū)塊在之后的操作中可以直接寫入 而不需要再擦除了。
預(yù)留空間 Over-provisioning
預(yù)留空間一般是指用戶不可操作的容量,為實際物理閃存容量減去用戶可用容量。這塊取用一般被用來做優(yōu)化,包括磨損均衡,GC,Trim和壞塊映射。
預(yù)留空間分為3層:
 第一層為固定的7.37%,這個數(shù)字是如何得出的哪?我們知道機械硬盤和SSD的廠商容量是這樣算的,1GB是1,000,000,000字節(jié)(10的9 次方),但是閃存的實際容量是每GB=1,073,741,824,(2的30次方) ,2者相差7.37%。所以說假設(shè)1塊128GB的SSD,用戶得到的容量是128,000,000,000字節(jié),多出來的那個7.37%就被主控固件用 做OP了。
第二層來自制造商的設(shè)置,通常為0%,7%和28%等,打個比方,對于128G顆粒的SandForce主控SSD,市場上會有120G和100G兩種型號賣,這個取決于廠商的固件設(shè)置,這個容量不包括之前的第一層7.37%。
第三層是用戶在日常使用中可以分配的預(yù)留空間,像Fusion-IO公司還給用戶工具自己調(diào)節(jié)大小來滿足不同的耐用度和性能,而用戶也可以自己在分區(qū)的時候,不分到完全的SSD容量來達到同樣的目的。(要有Trim支持)
預(yù)留空間雖然讓SSD的可用容量小了,但是帶來了減少寫入放大,提高耐久,提高性能的效果。
TRIM
Trim是一種SATA命令,他能讓操作系統(tǒng)在刪除某個文件或者格式化后告訴SSD主控這個數(shù)據(jù)塊不再需要了。
一般情況下,當LBA被操作系統(tǒng)更新后,只有隨著之后的每次數(shù)據(jù)寫入(其實等于覆蓋),SSD主控制器才知道這個地址原來早已經(jīng)失效了。(之前認為每個數(shù) 據(jù)都是有效的)在Win7里,由于Trim的引入解決了這個問題,當某些文件被刪除或者格式化了整個分區(qū),操作系統(tǒng)把Trim指令和在操作中更新的LBA 一起發(fā)給SSD主控制器(其中包含了無效數(shù)據(jù)地址),這樣在之后的GC操作中,無效數(shù)據(jù)就能被清空了,減少了寫入放大同時也提升了性能。
可以看這個帖子: Trim解析
Trim的依賴性和局限性
1. Trim命令需要SSD的支持,某些老型號的SSD可以靠刷新固件得到Trim支持(G2,barefoot,YK40),或者用一些獨特的工具(barefoot wiper)提取出系統(tǒng)里所有無效的LBA告訴SSD主控并清除。
2. Trim命令之后,速度并不一定是立馬就能提升的,因為Trim后的干凈空間可能隨機的包含在每個塊里,只有等著多次的copy block操作和主控的GC操作才能明顯感覺到速度的提升。
3. 就算操作系統(tǒng),驅(qū)動,SSD主控固件都滿足Trim命令了,也不代表在某些特定環(huán)境下能工作,比如RAID陣列和數(shù)據(jù)庫(至少到目前為止)。
可用空間
SSD控制器會使用所有的可用空間做垃圾回收和磨損均衡。保證一定的可用空間可以提升SSD效率,減少寫入放大。(前提是支持Trim)
安全擦除 Secure erase
ATA安全擦除命令用來清除在磁盤上的所有用戶數(shù)據(jù),這個指令會讓SSD回到出廠性能(最優(yōu)性能,最少寫入放大),但是隨著之后的使用,GC,寫入放大又會慢慢增加回來。
許多軟件使用ATA安全擦除指令來重置磁盤,最著名的為HDDErase。對SSD來說,重置就是全盤加電(邏輯1),瞬間即可完成清除所有數(shù)據(jù)讓SSD回到初始狀態(tài)。
靜動數(shù)據(jù)分離 Separating Static and Dynamic Data
高端SSD主控制器支持靜態(tài)和動態(tài)數(shù)據(jù)的分離處理,此操作要求SSD主控制器對LBA里經(jīng)常寫入(動態(tài)數(shù)據(jù),熱數(shù)據(jù))和不經(jīng)常寫入(靜態(tài)數(shù)據(jù),冷數(shù)據(jù))的 數(shù)據(jù)塊進行歸類,因為如果塊里包含了靜態(tài)和動態(tài)數(shù)據(jù),在做GC操作的時候會為了改寫其實沒必要改寫的靜態(tài)數(shù)據(jù)而增加了寫入放大,所以把包含靜態(tài)數(shù)據(jù)的塊歸 類后,因為不常改寫,減少了寫入放大。但是遲早SSD主控會把這塊靜態(tài)的數(shù)據(jù)轉(zhuǎn)移到別的地方來彌補平衡磨損。(因為靜態(tài)數(shù)據(jù)占著的數(shù)據(jù)塊一直不改寫,編程 次數(shù)低于平均值的話,會造成顆粒磨損不平衡,違背了WL,真夠矛盾的。)
持續(xù)寫入
當SSD持續(xù)的寫入數(shù)據(jù)時,寫入放大一般為1,原因是隨著數(shù)據(jù)寫入,整個塊都是持續(xù)的填充著同一個文件,如果系統(tǒng)確認這個文件需要改寫或者刪除,整個塊都 可以被標記為無效(需要Trim支持),自然就不需要之后的GC操作了。(讀取整個塊并寫入新的塊)這個塊只需要擦除,比讀,改,寫更快速有效。
隨機寫入
一個SSD主控的隨機寫入峰值速度一般發(fā)生在安全擦除后,完全GC,全盤Trim,或新安裝的狀態(tài)下。 而隨機寫入的能力取決于主控制器的1.通道數(shù)。2.固件效率。3.閃存顆粒寫入頁面的性能。 然后就是寫入放大的多少,越接近于1越好,小于1更那好。 當全盤顆粒都被寫過后,GC功能就將被啟用,速度就會受到影響,之后的寫入放大就會達到SSD主控制器的最大倍數(shù)。大量的隨機小文件的寫入是“閃存殺手”。
磨損平衡(WL) Wear Leveling
 假設(shè)一個特定的塊被持續(xù)的編程寫入而不編程寫入到別的塊,那么這個塊將很快被消耗掉編程壽命,造成整個SSD的報廢。處于這個原因,SSD主控制器要平均 分配每個塊的編程次數(shù),這個技術(shù)叫做磨損平衡。在最樂觀的情況下,這個技術(shù)會讓全盤的顆粒磨損程度接近并同時報廢??上У氖沁@個技術(shù)要犧牲寫入放大,假設(shè) 對于冷數(shù)據(jù),必須經(jīng)常的移動到別的塊,再把熱數(shù)據(jù)移過來,保證2邊的塊都是一樣的磨損度,無謂的增加了寫入次數(shù)。關(guān)鍵就是要找一個最優(yōu)化的算法來盡可能的 同時最佳化這2個矛盾的條件。
總結(jié):
寫入放大是個很關(guān)鍵的SSD指標,我們知道閃存的寫入速度比讀取速度慢的多,所以現(xiàn)在的SSD主控制器用多通道來提升寫入速度(相對寫入速度,讀取速度其實早已經(jīng)不是啥大問題了),但是如果寫入放大太高,意味著一樣的操作需要寫入更多的數(shù)據(jù),這樣速度自然就快不起來了。
廢話那么多,就是想說好主控和壞主控之間的性能差別主要就是體現(xiàn)在放大上,你想想,假設(shè)大家都一樣的通道數(shù),顆粒也相同,可是差別為何那么大?說白了就是一個寫的少而另個寫的多了嘛。一切算法技術(shù)的根本目標是要盡可能的減少寫入放大。
|