介紹
寫入放大(英語:Write amplification,簡稱 WA)是快閃記憶體和固態硬碟(SSD)中一種不良的現象,即實際寫入的物理數據量是寫入數據量的多倍。
由於快閃記憶體在可重新寫入數據前必須先擦除,而擦除操作的粒度與寫入操作相比低得多,執行這些操作就會多次移動(或改寫)用戶數據和元數據。因此,要改寫數據,就需要讀取快閃記憶體某些已使用的部分,更新它們,並寫入到新的位置,如果新位置在之前已使被用過,還需連同先擦除;由於快閃記憶體的這種工作方式,必須擦除改寫的快閃記憶體部分比新數據實際需要的大得多。此倍增效應會增加請求寫入的次數,縮短SSD的壽命,從而減小SSD能可靠運行的時間。增加的寫入也會消耗快閃記憶體的頻寬,此主要降低SSD的隨機寫入性能。許多因素會影響SSD的寫入放大,一些可以由用戶來控制,而另一些則是數據寫入和SSD使用的直接結果。
在2008年,英特爾和SiliconSystems(2009年為西部數據所收購)首先在他們的論文和出版物使用了術語“寫入放大”。寫入放大通常用快閃記憶體的寫入與主機系統的寫入之比來衡量。沒有開啟數據壓縮時,寫入放大不小於1。在使用壓縮的情況下,SandForce聲稱他們的典型寫入放大達到了0.5,而在最佳情況下,使用SF-2281控制器,此值能低至0.14。
SSD基本操作
由於快閃記憶體操作的性質,數據不能像在硬碟中那樣直接覆寫。當首次向SSD寫入數據時,單元都處於已擦除狀態,因而數據可以直接寫入,一次一頁(大小通常為4至8千位元組(KB))。SSD中管理快閃記憶體與主控系統接口的SSD控制器,使用稱為邏輯區塊地址(LBA)的邏輯到物理映射系統,這是快閃記憶體轉換層(FTL)的一部分。當新的數據要替換已寫入的舊數據時,SSD控制器將會寫入新的數據至新的位置,並且更新邏輯映射,將其指向新的物理位置。原位置的數據將不再有效。在可以再次寫入之前,它需要先被擦除。
快閃記憶體的編程和擦除次數有限。通常以快閃記憶體在整個壽命中最多可忍受的編程/擦除循環(P/E循環)次數來表示。單層單元(SLC)快閃記憶體,通常設計為高性能和長壽命,一般能有50000到100000次循環。截至2011年,設計用於低成本套用的多層單元(MLC)快閃記憶體,循環次數就大為減少,一般只有3000至5000次循環。自2013年起,已有三層單元(TLC)快閃記憶體,其編程-擦除(P/E)循環次數又降至1000。寫入放大越低,則越為理想,因為與之對應的是快閃記憶體中P/E循環次數減少,所以能延長SSD的壽命。
計算數值
即使是在定義術語之前,寫入放大就已經存在於固態硬碟中,但直到2008年,才有英特爾和SiliconSystems開始在他們的論文和出版物中使用它。所有的SSD都有一個寫入放大值,基於目前正在寫入的數據及先前已寫入到SSD的數據。為了能準確地測量特定SSD的該值,應使選定的測試流程運行足夠長的時間,以確保驅動器已達到穩態。
一個簡單計算SSD寫入放大的公式是:
快閃記憶體寫入的數據量 ÷ 主控寫入的數據量 = 寫入放大
影響因素
SSD的寫入放大會受許多因素的影響。下表列出了主要因素以及它們對寫入放大的影響。對於變數因素,表中註明了“正面”相關或“反面”相關。如隨著預留空間的增加,寫入放大將減小(反相關)。如果該因素是一個開關(“啟用”或“禁用”)關係,那么它的關係或“正向”或“反向”。
因素 | 描述 | 類型 | 關係* |
垃圾回收 | 用來挑選用於擦除和重寫的最佳塊的算法的效率 | 變數 | 反面(小為好) |
預留空間 | 分配到SSD控制器的物理容量百分比 | 變數 | 反面(小為好) |
SATA的TRIM命令 或 SCSI中的UNMAP | 這些命令必須由作業系統(OS)傳送,可以通知存儲設備哪些扇區含有無效數據 。可以處理這些命令的SSD能在擦除塊時,將包含這些扇區的頁作為空閒空間回收, 而不是複製無效的數據到乾淨的頁中。 | 開關 | 正向(小為好) |
空閒用戶容量 | 沒有實際用戶數據的用戶容量百分比;需要TRIM ,否則SSD不會從任何空閒的用戶容量中獲得好處 | 變數 | 反面(小為好) |
安全擦除 | 擦除所有的用戶數據和相關元數據 ,將SSD的性能重置到最初狀態(直至重新開始垃圾回收) | 開關 | 正向(小為好) |
耗損均衡 | 算法的效率,令每塊的寫入次數與其他的塊儘可能相同 | 變數 | 正面(大為壞) |
靜動數據分離 | 將數據按修改頻率分組 | 開關 | 正向(小為好) |
順序寫入 | 理論上,順序寫入的寫入放大為1,但其他因素仍會影響此值 | 開關 | 正向(小為好) |
隨機寫入 | 寫入到非連續的LBA對寫入放大的影響最大 | 開關 | 反向(大為壞) |
數據壓縮,包括重複數據刪除 | 數據壓縮和重複數據刪除能消除更多的冗餘數據 ,降低寫入放大,同時提升SSD速度。 | 變數 | 反面(小為好) |
以SLC模式使用MLCNAND | 以每單元1位,而不是以設計的每單元位數(通常為每單元2位 )寫入數據,以加快讀取和寫入操作。如果臨近SLC模式下的 NAND容量限制,SSD必須把舊有用SLC模式寫入的數據改寫 為MLC或TLC模式,才能讓SLC模式的NAND空間釋放出來, 以便容納更多的數據。然而,通過讓經常更改的頁面維持在 SLC模式,而不是以MLC或TLC模式修改,這種做法也可以 降低磨損,因為比用SLC模式,用MLC或TLC模式寫入對快閃記憶體 的傷害確實更大。因此,這種做法提高了寫入放大,但當 寫入模式設為向常寫頁面上寫入時,卻可以減少磨損。 然而,順序和隨機寫入卻會加劇磨損,因為這樣就沒有或 少有頻繁寫入的頁是SLC模式,迫使舊數據不斷地從SLC 模式改寫到MLC或TLC。 | 開關 | 反向(大為壞) |
類型 | 關係 | 描述 |
變數 | 正面 | 隨著因子增加WA增加 |
反面 | 隨著因子增加WA減小 | |
開關 | 正向 | 當因子開啟時WA減小 |
反向 | 當因子開啟時WA增加 |
預留空間
預留空間(有時簡稱OP)是快閃記憶體的物理容量和作業系統(OS)呈現給用戶的可用邏輯容量之間的差值。在SSD的垃圾收集、耗損均衡及壞塊映射操作中,額外的預留空間有助於降低控制器寫入快閃記憶體時的寫入放大。
預留空間的第一級來自容量的計算,單位使用吉位元組(GB),而不是gibibyte(GiB)。HDD和SSD的廠商都使用術語GB來表示“十進制”的GB,即1,000,000,000(10^9)位元組。快閃記憶體(象其它大多數電子存儲器一樣)以二的冪組裝,所以SSD的物理容量將以每二進制GB 1,073,741,824(2)位元組來計算。兩個值之間的差距是7.37%(=(2-10)/10× 100%)。從而預留0%空間的128 GB SSD提供給用戶的容量是128,000,000,000位元組。這個初始的7.37%通常不計算在總的預留空間數量中。
預留空間的第二級來自製造商。這一級的預留空間大小通常為0%、7%或28%,基於十進制吉位元組的物理容量與十進制吉位元組的用戶可用空間之差。舉例而言,製造商發布的規格為100 GB、120 GB或128 GB的SSD,可能它們的實際物理容量都是128 GB。這種差異就是由28%、7%和0%造成的,而這也是製造商聲稱它們的驅動器有28%預留空間的依據。這不包括額外的十進制和二進制吉位元組之間相差的7.37%。
預留空間的第三級來自驅動器上的已知可用空間,以獲得持久性和性能,前提是報告未使用的部分,和/或以目前或未來的空間為代價。可以藉由作業系統使用TRIM命令來確定空閒空間。另外,一些SSD提供了工具,以讓最終用戶選擇額外的預留空間。此外,如果在SSD上沒有100%地使用可用空間劃分分區布局,SSD也將會自動把未分區的空間作為預留空間使用。還有一個預留空間來源於作業系統的最小可用空間限制;一些作業系統在每一個驅動器上都保留有一定的最小可用空間,特別是在啟動或主驅動器上。如果SSD,也許是通過連續使用TRIM命令,能夠識別出這些額外空間,那么它就能作為半永久性的預留空間。預留空間往往需要占用用戶容量,或暫時或永久,但它能減少寫入放大,增加持久性,並提高性能。
順序寫入
當順序向固態硬碟寫入數據時,寫入放大等於1,意為沒有寫入放大。這是因為在數據寫入時,依次用來自同一檔案的數據填充區塊。如果OS確認該檔案將被替換或刪除,可以標記整個塊為無效,也不需要讀取它以將垃圾收集到的數據重寫入另一個塊。它只需要擦除,比隨機數據寫入所需的“讀取-擦除-修改-寫入”的垃圾收集過程更易、更快。
隨機寫入
在完全垃圾回收、安全擦除、100%TRIM、或新安裝之後,SSD有大量的空閒區塊,隨機寫入性能達到峰值。最大速度將取決於連線到SSD控制器的並行快閃記憶體通道數、固件效率及快閃記憶體寫入頁面的速度。在此階段,寫入放大之於隨機寫入達到最佳,接近1。一旦區塊都寫入了一次,垃圾收集過程將啟動,性能將會被此過程的速度和效率所限制。此階段的寫入放大將增至驅動器經歷過的最高水平。
對性能的影響
SSD的總體性能取決於許多因素,其中包括寫入放大。向快閃記憶體設備寫入比從它讀取所需的時間更長。SSD通常並聯使用多個快閃記憶體組件,以提高性能。如果SSD的寫入放大高,控制器將不得不多次向快閃記憶體寫入。主控將需要更多的時間寫入數據。低寫入放大的SSD不需要寫那么多的數據,因此能比高寫入放大的驅動器更早寫入完畢。