寫入放大

寫入放大（write amplification，簡稱WA）是快閃記憶體和固態硬碟（SSD）中一種不良的現象，即實際寫入的物理資料量是寫入資料量的多倍。

由於快閃記憶體在可重新寫入數據前必須先擦除，而擦除操作的粒度與寫入操作相比粗得多，執行這些操作就會多次移動（或改寫）使用者數據和元數據。因此，要改寫數據，就需要讀取快閃記憶體某些已使用的部分，更新它們，並寫入到新的位置，如果新位置在之前已被使用過，還需連同先擦除；由於快閃記憶體的這種工作方式，必須擦除改寫的快閃記憶體部分比新數據實際需要的大得多。此倍增效應會增加請求寫入的次數，縮短SSD的壽命，從而減小SSD能可靠運行的時間。增加的寫入也會消耗快閃記憶體的帶寬，此主要降低SSD的隨機寫入性能。許多因素會影響SSD的寫入放大，一些可以由使用者來控制，而另一些則是數據寫入和SSD使用的直接結果。

在2008年，英特爾和SiliconSystems（2009年為威騰電子所收購）首先在他們的論文和出版物使用了術語「寫入放大」。寫入放大通常用快閃記憶體的寫入與主機系統的寫入之比來衡量。沒有開啟數據壓縮時，寫入放大不小於1。在使用壓縮的情況下，SandForce聲稱他們的典型寫入放大達到了0.5，而在最佳情況下，使用SF-2281控制器，此值能低至0.14。

## SSD基本操作

<image>

由於快閃記憶體操作的性質，數據不能像在硬碟中那樣直接覆寫。當首次向SSD寫入數據時，單元都處於已擦除狀態，因而數據可以直接寫入，一次一頁（大小）。SSD中管理快閃記憶體與主控系統接口的SSD控制器，使用稱為邏輯區塊地址（LBA）的邏輯到物理映射系統，這是快閃記憶體轉換層（FTL）的一部分。當新的數據要替換已寫入的舊數據時，SSD控制器將會寫入新的數據至新的位置，並且更新邏輯映射，將其指向新的物理位置。原位置的數據將不再有效。在可以再次寫入之前，它需要先被擦除。

快閃記憶體的編程和擦除次數有限。通常以快閃記憶體在整個壽命中最多可忍受的編程/擦除循環（P/E循環）次數來表示。單層單元（SLC）快閃記憶體，通常設計為高性能和長壽命，一般能有50000到100000次循環。設計用於低成本應用的多層單元（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模式使用MLC NAND｜以每單元1位，而不是以設計的每單元位數（通常為每單元2位）寫入數據，以加快讀取和寫入操作。如果臨近SLC模式下的NAND容量限制，SSD必須把舊有用SLC模式寫入的數據改寫為MLC或TLC模式，才能讓SLC模式的NAND空間釋放出來，以便容納更多的數據。然而，通過讓經常更改的頁面維持在SLC模式，而不是以MLC或TLC模式修改，這種做法也可以降低磨損，因為比用SLC模式，用MLC或TLC模式寫入對快閃記憶體的傷害確實更大。因此，這種做法提高了寫入放大，但當寫入模式設為向常寫頁面上寫入時，卻可以減少磨損。然而，順序和隨機寫入卻會加劇磨損，因為這樣就沒有或少有頻繁寫入的頁是SLC模式，迫使舊數據不斷地從SLC模式改寫到MLC或TLC。｜開關｜反向（大為壞）

類型｜關係｜描述

變量｜正面｜隨著因子增加WA增加

反面｜隨著因子增加WA減小

開關｜正向｜當因子開啟時WA減小

反向｜當因子開啟時WA增加

## 垃圾回收

<image>

數據以頁面（由多個單元組成）為單位寫入到快閃記憶體中。然而，存儲器只能以較大的單位區塊（由多個頁面組成）擦除。如果不再需要一個塊中某些頁內的數據（稱為過期頁），僅會讀取該塊中含有有效數據的頁面，並重新寫入到另一個先前擦除的空塊中。因而，由於沒有移動過期數據，留下的空閒頁就可用來存儲新的數據。這一過程稱為「垃圾回收」（GC）所有的SSD都包含不同程度的垃圾回收機制，但在執行的頻率和速度上有所不同。垃圾回收占了SSD上寫入放大的很大一部分。

讀取數據不需要擦除快閃記憶體，因此通常與寫入放大無關。在有限的情況下會發生讀取干擾錯誤，此時會讀取並重新寫入區塊中的數據，但是這不會對驅動器的寫入放大造成實質性的影響。

### 後台垃圾回收

垃圾回收的過程包括讀取並重新向快閃記憶體寫入數據。這意味著，主控寫入新數據時，就必須先讀取整個區塊，再寫入區塊中仍包含有效數據的部分，之後才寫入新數據。這顯著降低了系統的性能。有的SSD控制器實現了「後台垃圾回收」（BGC），有時也被稱為「空閒垃圾回收」或「空閒時間垃圾回收」（ITGC），能讓控制器在主控需要寫入新的數據之前，使用空閒時間整理快閃記憶體塊。這使驅動器能維持較高的性能。

如果能在需要快閃記憶體前，控制器在後台垃圾回收時,就已經收集好了所有的空閒區塊，那麼就可以直接寫入主控要寫入的新數據，而無須先移動數據，這樣驅動器就總能表現出最佳性能。不幸的是，實際上某些區塊上的數據主控並不需要，它們最終將會被刪除，但作業系統並沒有告訴控制器這些資訊。結果，要被刪除的數據被重寫到了快閃記憶體的另一個位置，因而提高了寫入放大。在一些OCZ的SSD中，後台垃圾回收僅會清除少量的塊，之後便停止，以此限制過度寫入的數量。另一種解決方案是配備一個高效的垃圾回收系統，在主控寫入的同時同步執行必要的數據移動。在SSD少有空閒的環境中，這種解決方案更有效。SandForce的SSD控制器和Violin Memory的系統有這項功能。

### 文件系統感知垃圾回收

2010年，一些廠商（特別是三星）推出的SSD控制器擴展了BGC的概念，它們會分析固態硬碟上使用的文件系統，以識別出最近刪除的文件，及未分區的空間。製造商聲稱，系統（作業系統和SATA控制器硬體）即便不支持TRIM，也能獲得相似的性能。三星實現的操作似乎在假定、並且需要有一個NTFS文件系統。目前，這些廠商生產的SSD是否仍具備該功能不得而知。有報導稱，如果沒有正確地用MBR和NTFS格式化這些驅動器，將會出現系統數據的損壞。

## 預留空間

<image>

預留空間（有時簡稱OP）是快閃記憶體的物理容量和作業系統（OS）呈現給使用者的可用邏輯容量之間的差值。在SSD的垃圾收集、耗損均衡及壞塊映射操作中，額外的預留空間有助於降低控制器寫入快閃記憶體時的寫入放大。

預留空間的第一級來自容量的計算，單位使用吉字節（GB），而不是gibibyte（GiB）。HDD和SSD的廠商都使用術語GB來表示「十進位」的GB，即1,000,000,000（10^9）字節。快閃記憶體（象其它大多數電子存儲器一樣）以二的冪組裝，所以SSD的物理容量將以每二進位GB 1,073,741,824（230）字節來計算。兩個值之間的差距是7.37%（=(230-109)/109 × 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命令，能夠識別出這些額外空間，那麼它就能作為半永久性的預留空間。預留空間往往需要占用使用者容量，或暫時或永久，但它能減少寫入放大，增加持久性，並提高性能。

( 物理容量 - 使用者容量 ) ÷ 使用者容量 = 預留空間

## TRIM

TRIM是一個SATA命令，使得作業系統可以告訴SSD不再需要哪些之前保存過數據的區塊。可能這些文件已被刪除，或整個分區已被格式化。若作業系統替換了一個LBA的同時覆寫了一個文件時，SSD就能知道可以標記原來的LBA為過時或無效，在垃圾回收的過程中就不用再保留那些塊。如果使用者或作業系統刪除一個文件（不只是除去它的一部分），通常只會將該文件標記為已刪除，而並未真正擦除磁碟上的實際內容。正因如此，SSD不知道可以擦除文件先前占用的LBA，所以在垃圾回收時仍會保留它們。

在有作業系統支持的情況下，TRIM命令解決了這個問題，如Windows 7、Mac OS（Snow Leopard、Lion及Mountain Lion的最新版，有些情況下需要補丁）及Linux >= 2.6.33。當永久刪除一個文件或格式化硬碟時，作業系統依據不再包含有效數據的LBA發送TRIM命令。這可告知SSD可以擦除並重新使用哪些使用中的LBA。垃圾回收過程中需要移動的LBA因此而減少。結果是SSD將有更多的空閒空間，同時獲得低寫入放大及更高的性能。

### 限制和依賴

TRIM命令也需要SSD支持。SSD固件如果不支持TRIM命令，就不會標記TRIM命令收到的LBA為無效，而仍假設數據有效，並在垃圾回收時繼續予以保留。只有當作業系統向這些LBA中保存新數據時，SSD才能將最初的LBA標記為無效。若驅動器中沒有內建支持TRIM，SSD廠商可以為使用者升級固件，或提供一個單獨的實用程序，以從作業系統中提取關於無效數據的資訊，再另外TRIM SSD。只有使用者每次運行程序後，才能從中獲得好處。使用者可以設定計劃任務，讓該實用程序在後台定期自動運行。

正因為SSD支持TRIM命令，在收到命令後，它不一定能立即表現出最快性能。TRIM命令釋放的空間可能隨機散落於SSD中。要經過幾輪的數據寫入和垃圾回收之後，空間才會逐漸合併，表現的性能才能提高。

即使已配置OS和SSD支持TRIM命令，其他情況也可能會使TRIM無法發揮出它的功效。資料庫和RAID系統還沒有配備TRIM感知，因而無法向SSD傳遞資訊。這種情況下，SSD將繼續保留那些區塊，直到OS將那些LBA用於新的寫操作。

實際可從TRIM命令中得到的益處取決於SSD上的空閒使用者容量。如果SSD使用者容量為100 GB，使用者實際在驅動器上存儲了95 GB數據，任何TRIM操作為垃圾回收和耗損均衡增加的可用空間都不會超過5 GB。在這種情況下，增加5 GB的預留空間將使SSD的性能更加穩定一致，因為可用空間總會有額外的5 GB，而不必等待OS發來TRIM命令。

## 空閒使用者容量

SSD控制器將使用SSD上的任何空閒塊以進行垃圾回收和耗損均衡。無用戶數據的使用者容量部分（或已TRIM，或從未寫入）就如同預留空間（直至使用者向SSD保存新數據）。如果使用者保存的數據僅占驅動器總使用者容量的一半，使用者容量的另一半看起來就如同額外的預留空間（只要系統支持TRIM命令）。

## 安全擦除

ATA安全擦除命令旨在從驅動器中刪除所有使用者數據。對於沒有內置加密功能的固態硬碟，此命令將會把驅動器恢復至其出廠狀態。剛開始，它的性能將恢復至可能的最高水平及最佳的（最低）寫入放大，但只要驅動器再次開始垃圾收集，性能和寫入放大就會逐漸降至先前水平。許多工具能使用ATA安全擦除命令重置驅動器，而且有使用者界面。在行業中經常提到的一個免費工具是HDDErase。Gparted和Ubuntu live CD提供可啟動的Linux系統，上有包含安全擦除的磁碟實用程序。

實時加密所有寫入數據的驅動器可以以另一種方式實現ATA安全擦除。方法是簡單地向其補零，並在每次完成安全擦除後產生一個新的隨機加密密鑰。這樣就無法再讀取舊數據，因為無法解密。內置加密的驅動器可能需要發送TRIM命令，以將其設為出廠狀態。

## 耗損均衡

如果反覆地編程和擦寫某區塊，而其他區塊卻沒有寫入，該區塊會早於其他的區塊而磨損——從而過早地結束了SSD的壽命。由於這個原因，SSD控制器使用稱為耗損均衡的技術，以儘可能均勻地將寫入分配到SSD的所有快閃記憶體區塊上。

理想情況下，每一區塊都能寫入到最大次數，這樣它們都能同時失效。不幸的是，耗損均衡操作會要求移動之前寫入後就未改變的數據（冷數據），以使頻繁變動的數據（熱數據）可以寫入到冷數據的區塊中，讓冷數據的區塊達到均衡。數據被重定位，而主控卻並沒有修改它們，這增加了寫入放大，而降低了快閃記憶體的壽命。關鍵是要找到最優演算法以使兩者同時達到最佳化。

## 靜動數據分離

對SSD控制器來說，靜動數據分離並不是一件簡單的事。該方法需要SSD控制器將數據不斷變化、需要重寫（動態數據）的與數據很少改變、且不需要任何重寫（靜態數據）的LBA分離開來。如果數據混於同一區塊，正如目前幾乎所有系統所做的那樣，SSD控制器在重寫時，就需要垃圾回收動態數據（引起重寫的原因）和靜態數據（不需要任何重寫）。任何對操作中未涉及數據的垃圾回收都會增加寫入放大。因此分離數據將使靜態數據留在原地，如果它永遠不會改寫，寫入放大就能達到最低。

## 順序寫入

當順序向固態硬碟寫入數據時，寫入放大等於1，意為沒有寫入放大。這是因為在數據寫入時，依次用來自同一文件的數據填充區塊。如果OS確認該文件將被替換或刪除，可以標記整個塊為無效，也不需要讀取它以將垃圾收集到的數據重寫入另一個塊。它只需要擦除，比隨機數據寫入所需的「讀取-擦除-修改-寫入」的垃圾收集過程更易、更快。

## 隨機寫入

在完全垃圾回收、安全擦除、100％TRIM、或新安裝之後，SSD有大量的空閒區塊，隨機寫入性能達到峰值。最大速度將取決於連接到SSD控制器的並行快閃記憶體通道數、固件效率及快閃記憶體寫入頁面的速度。在此階段，寫入放大之於隨機寫入達到最佳，接近1。一旦區塊都寫入了一次，垃圾收集過程將啟動，性能將會被此過程的速度和效率所限制。此階段的寫入放大將增至驅動器經歷過的最高水平。

## 對性能的影響

SSD的總體性能取決於許多因素，其中包括寫入放大。向快閃記憶體設備寫入比從它讀取所需的時間更長。SSD通常並聯使用多個快閃記憶體組件，以提高性能。如果SSD的寫入放大高，控制器將不得不多次向快閃記憶體寫入。主控將需要更多的時間寫入數據。低寫入放大的SSD不需要寫那麼多的數據，因此能比高寫入放大的驅動器更早寫入完畢。

## 產品聲明

2008年9月，英特爾宣布了X25-M SATA SSD，聲稱WA能低至1.1。2009年4月，SandForce宣布了SF-1000 SSD處理器系列，報稱其WA為0.5，似乎是藉由某種形式的數據壓縮而達到。在此次發布前，曾認為1.0的寫入放大是SSD可以達到的最低水平。目前，只有SandForce的SSD控制器使用了壓縮。