Memory_over-provisioning

**寫入放大**（英語：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 年 (2011-Missing required parameter 1=_month_!)，設計用於低成本應用的多層單元（MLC）快閃記憶體，迴圈次數就大為減少，一般只有 3000 至 5000 次迴圈。自 2013 年起，已有三層單元（TLC）快閃記憶體，其編程 - 擦除（P/E）迴圈次數又降至 1000。寫入放大越低，則越為理想，因為與之對應的是快閃記憶體中 P/E 迴圈次數減少，所以能延長 SSD 的壽命。

## 計算數值

即使是在定義術語之前，寫入放大就已經存在於固態硬碟中，但直到 2008 年，才有英特爾和 SiliconSystems 開始在他們的論文和出版物中使用它。所有的 SSD 都有一個寫入放大值，基於目前正在寫入的資料及先前已寫入到 SSD 的資料。為了能準確地測量特定 SSD 的該值，應使選定的測試流程執行足夠長的時間，以確保驅動器已達到穩態。

一個簡單計算 SSD 寫入放大的公式是：

　
: 快閃記憶體寫入的資料量 ÷ 主控寫入的資料量 = 寫入放大

## 影響因素

SSD 的寫入放大會受許多因素的影響。下表列出了主要因素以及它們對寫入放大的影響。對於變數因素，表中註明了「正面」相關或「反面」相關。如隨著預留空間的增加，寫入放大將減小（反相關）。如果該因素是一個開關（「啟用」或「禁用」）關係，那麼它的關係或「正向」或「反向」。

## 垃圾回收

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

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

### 後台垃圾回收

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

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

### 檔案系統感知垃圾回收

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

## 預留空間

預留空間（有時簡稱 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 無法發揮出它的功效。截至 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 控制器使用了壓縮。

## 參見

* 快閃記憶體檔案系統
* 分割區對齊
* 耗損平衡

## 注釋

## 參考

## 外部連結

* 維基共享資源上的相關多媒體資源：寫入放大