寫入放大

垃圾回收和耗損平衡導致了SSD的寫入放大，從而增加了驅動器的寫入次數，減少了其使用壽命。
寫入放大（write amplification，簡稱WA）是閃存和固態硬盤（SSD）中一種不良的現象，即實際寫入的物理資料量是寫入資料量的多倍。
由於閃存在可重新寫入數據前必須先擦除，而擦除操作的粒度與寫入操作相比粗得多，執行這些操作就會多次移動（或改寫）用戶數據和元數據。因此，要改寫數據，就需要讀取閃存某些已使用的部分，更新它們，並寫入到新的位置，如果新位置在之前已被使用過，還需連同先擦除；由於閃存的這種工作方式，必須擦除改寫的閃存部分比新數據實際需要的大得多。此倍增效應會增加請求寫入的次數，縮短SSD的壽命，從而減小SSD能可靠運行的時間。增加的寫入也會消耗閃存的帶寬，此主要降低SSD的隨機寫入性能。許多因素會影響SSD的寫入放大，一些可以由用戶來控制，而另一些則是數據寫入和SSD使用的直接結果。
在2008年，英特爾和SiliconSystems（2009年為西部數據所收購）首先在他們的論文和出版物使用了術語“寫入放大”。寫入放大通常用閃存的寫入與主機系統的寫入之比來衡量。沒有開啟數據壓縮時，寫入放大不小於1。在使用壓縮的情況下，SandForce聲稱他們的典型寫入放大達到了0.5，而在最佳情況下，使用SF-2281控制器，此值能低至0.14。

**SSD基本操作**
NAND閃存以每頁4 KB寫入數據，以每塊256 KB擦除數據。
由於閃存操作的性質，數據不能像在硬盤中那樣直接覆寫。當首次向SSD寫入數據時，單元都處於已擦除狀態，因而數據可以直接寫入，一次一頁（大小as of|2010|5|alt=通常為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的寫入放大會受許多因素的影響。下表列出了主要因素以及它們對寫入放大的影響。對於變量因素，表中註明了“正面”相關或“反面”相關。如隨著預留空間的增加，寫入放大將減小（反相關）。如果該因素是一個開關（“啟用”或“禁用”）關係，那麼它的關係或“正向”或“反向”。

**GC垃圾回收**
頁面能一直寫入，直至填滿區塊。然後，當前的數據頁被移動至新的區塊，舊的區塊被擦除。（圖示：1.四個頁面（A-D）寫入一個區塊（X）。單獨的空閒（已擦除）頁面可以直接寫入；2.四個新頁（E-H）和四個替代頁（A'-D'）寫入區塊（X）。原來的A-D頁現在包含的是無效（過期）數據，但直至整個區塊被擦除前，頁面都不能重新寫入；3.要向含有過期數據的頁面（A-D）寫入數據，有效頁面（E-H和A'-D'）被讀取並寫入區塊（Y），然後區塊（X）被擦除。最後一步稱為“垃圾回收”。）
數據以頁面（由多個單元組成）為單位寫入到閃存中。然而，存儲器只能以較大的單位區塊（由多個頁面組成）擦除。如果不再需要一個塊中某些頁內的數據（稱為過期頁），僅會讀取該塊中含有有效數據的頁面，並重新寫入到另一個先前擦除的空塊中。因而，由於沒有移動過期數據，留下的空閒頁就可用來存儲新的數據。這一過程稱為“垃圾回收”（GC）所有的SSD都包含不同程度的垃圾回收機制，但在執行的頻率和速度上有所不同。垃圾回收佔了SSD上寫入放大的很大一部分。
讀取數據不需要擦除閃存，因此通常與寫入放大無關。在有限的情況下會發生讀取干擾錯誤，此時會讀取並重新寫入區塊中的數據，但是這不會對驅動器的寫入放大造成實質性的影響。

**BG-GC後臺垃圾回收**
垃圾回收的過程包括讀取並重新向閃存寫入數據。這意味著，主控寫入新數據時，就必須先讀取整個區塊，再寫入區塊中仍包含有效數據的部分，之後才寫入新數據。這顯著降低了系統的性能。有的SSD控制器實現了“後臺垃圾回收”（BGC），有時也被稱為“空閒垃圾回收”或“空閒時間垃圾回收”（ITGC），能讓控制器在主控需要寫入新的數據之前，使用空閒時間整理閃存塊。這使驅動器能維持較高的性能。
如果能在需要快閃記憶體前，控制器在後臺垃圾回收時,就已經收集好了所有的空閒區塊，那麼就可以直接寫入主控要寫入的新數據，而無須先移動數據，這樣驅動器就總能表現出最佳性能。不幸的是，實際上某些區塊上的數據主控並不需要，它們最終將會被刪除，但操作系統並沒有告訴控制器這些信息。結果，要被刪除的數據被重寫到了閃存的另一個位置，因而提高了寫入放大。在一些OCZ的SSD中，後臺垃圾回收僅會清除少量的塊，之後便停止，以此限制過度寫入的數量。另一種解決方案是配備一個高效的垃圾回收系統，在主控寫入的同時同步執行必要的數據移動。在SSD少有空閒的環境中，這種解決方案更有效。SandForce的SSD控制器和Violin Memory的系統有這項功能。

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

**預留空間**
SSD中的三級預留空間。（圖示：層級1：7.37%，230和109之間的差距。HDD和SSD基於十進制衡量空間，而不是像內存那樣用二進制單位。層級2：0，7，或28%，控制壽命、容量、性能達到期望平衡的比例。SSD由工廠設置層級2的預留空間，以維持基本的性能和壽命。層級3：?%，在SSD的使用過程中波動。（假設支持TRIM）存儲的用戶數據在變化，空閒空間被自動用作預留空間。）
預留空間（有時簡稱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無法發揮出它的功效。alt=截至2010年初，數據庫和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控制器在重寫時，就需要垃圾回收動態數據（引起重寫的原因）和靜態數據（不需要任何重寫）。任何對操作中未涉及數據的垃圾回收都會增加寫入放大。因此分離數據將使靜態數據留在原地，如果它永遠不會改寫，寫入放大就能達到最低。

**REMF順序寫入**
當順序向固態硬盤寫入數據時，寫入放大等於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控制器使用了壓縮。

**參見**
 閃存文件系統- 分區對齊- 耗損平衡

**註釋**

**參考**

**外部鏈接 ==