写入放大

寫入放大（英語：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的壽命。

垃圾回收

資料以頁面（由多個單元組成）為單位寫入到快閃記憶體中。然而，記憶體只能以較大的單位區塊（由多個頁面組成）擦除。如果不再需要一個塊中某些頁內的資料（稱為過期頁），僅會讀取該塊中含有有效資料的頁面，並重新寫入到另一個先前擦除的空塊中。因而，由於沒有移動過期資料，留下的空閒頁就可用來儲存新的資料。這一過程稱為「垃圾回收」（GC）所有的SSD都包含不同程度的垃圾回收機制，但在執行的頻率和速度上有所不同。垃圾回收占了SSD上寫入放大的很大一部分。
讀取資料不需要擦除快閃記憶體，因此通常與寫入放大無關。在有限的情況下會發生讀取干擾錯誤，此時會讀取並重新寫入區塊中的資料，但是這不會對驅動器的寫入放大造成實質性的影響。

後台垃圾回收

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

檔案系統感知垃圾回收

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

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無法發揮出它的功效。截至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控制器在重寫時，就需要垃圾回收動態資料（引起重寫的原因）和靜態資料（不需要任何重寫）。任何對操作中未涉及資料的垃圾回收都會增加寫入放大。因此分離資料將使靜態資料留在原地，如果它永遠不會覆寫，寫入放大就能達到最低。

順序寫入

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