垃圾回收和耗损平衡导致了SSD的写入放大垃圾回收和耗损平衡导致了SSD的写入放大，从而增加了驱动器的写入次数，减少了其使用寿命。
**写入放大**（英語：，简称**WA**）是闪存和固态硬盘（SSD）中一种不良的现象，即实际写入的物理資料量是写入資料量的多倍。

由于闪存在可重新写入数据前必须先擦除，而擦除操作的粒度与写入操作相比低得多，执行这些操作就会多次移动（或改写）用户数据和元数据。因此，要改写数据，就需要读取闪存某些已使用的部分，更新它们，并写入到新的位置，如果新位置在之前已被使用过，还需连同先擦除；由于闪存的这种工作方式，必须擦除改写的闪存部分比新数据实际需要的大得多。此倍增效应会增加请求写入的次数，缩短SSD的寿命，从而减小SSD能可靠运行的时间。增加的写入也会消耗闪存的带宽，此主要降低SSD的随机写入性能。许多因素会影响SSD的写入放大，一些可以由用户来控制，而另一些则是数据写入和SSD使用的直接结果。

在2008年，英特尔和SiliconSystems（2009年为西部数据所收购）首先在他们的论文和出版物使用了术语"写入放大"。写入放大通常用闪存的写入与主机系统的写入之比来衡量。没有开启数据压缩时，写入放大不小于1。在使用压缩的情况下，SandForce声称他们的典型写入放大达到了0.5，而在最佳情况下，使用SF-2281控制器，此值能低至0.14。

SSD基本操作
-------

参见：闪存和固态硬盘
NAND闪存以每页4 KB写入数据，以每块256 KB擦除数据NAND闪存以每页4 KB写入数据，以每块256 KB擦除数据。
由于闪存操作的性质，数据不能像在硬盘中那样直接覆写。当首次向SSD写入数据时，单元都处于已擦除状态，因而数据可以直接写入，一次一页（大小通常为4至8千字节（KB）[update]）。SSD中管理闪存与主控系统接口的SSD控制器，使用称为逻辑区块地址（LBA）的逻辑到物理映射系统，这是闪存转换层（FTL）的一部分。当新的数据要替换已写入的旧数据时，SSD控制器将会写入新的数据至新的位置，并且更新逻辑映射，将其指向新的物理位置。原位置的数据将不再有效。在可以再次写入之前，它需要先被擦除。

闪存的编程和擦除次数有限。通常以闪存在整个寿命中最多可忍受的编程/擦除循环（P/E循环）次数来表示。单层单元（SLC）闪存，通常设计为高性能和长寿命，一般能有50000到100000次循环。截至2011年 (2011-Missing required parameter 1=*month*!)[update]，设计用于低成本应用的多层单元（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增加 |

垃圾回收
----

更多：垃圾回收 (計算機科學)
页面能一直写入，直至填满区块。然后，当前的数据页被移动至新的区块，旧的区块被擦除。页面能一直写入，直至填满区块。然后，当前的数据页被移动至新的区块，旧的区块被擦除。（图示：1.四个页面（A-D）写入一个区块（X）。单独的空闲（已擦除）页面可以直接写入；2.四个新页（E-H）和四个替代页（A'-D'）写入区块（X）。原来的A-D页现在包含的是无效（过期）数据，但直至整个区块被擦除前，页面都不能重新写入；3.要向含有过期数据的页面（A-D）写入数据，有效页面（E-H和A'-D'）被读取并写入区块（Y），然后区块（X）被擦除。最后一步称为"垃圾回收"。）
数据以页面（由多个单元组成）为单位写入到闪存中。然而，存储器只能以较大的单位区块（由多个页面组成）擦除。如果不再需要一个块中某些页内的数据（称为过期页），仅会读取该块中含有有效数据的页面，并重新写入到另一个先前擦除的空块中。因而，由于没有移动过期数据，留下的空闲页就可用来存储新的数据。这一过程称为"垃圾回收"（GC）所有的SSD都包含不同程度的垃圾回收机制，但在执行的频率和速度上有所不同。垃圾回收占了SSD上写入放大的很大一部分。

读取数据不需要擦除闪存，因此通常与写入放大无关。在有限的情况下会发生读取干扰错误，此时会读取并重新写入区块中的数据，但是这不会对驱动器的写入放大造成实质性的影响。

### 后台垃圾回收

垃圾回收的过程包括读取并重新向闪存写入数据。这意味着，主控写入新数据时，就必须先读取整个区块，再写入区块中仍包含有效数据的部分，之后才写入新数据。这显著降低了系统的性能。有的SSD控制器实现了"后台垃圾回收"（BGC），有时也被称为"空闲垃圾回收"或"空闲时间垃圾回收"（ITGC），能让控制器在主控需要写入新的数据之前，使用空闲时间整理闪存块。这使驱动器能维持较高的性能。

如果能在需要快閃記憶體前，控制器在后台垃圾回收时,就已经收集好了所有的空闲区块，那么就可以直接写入主控要写入的新数据，而無須先移動数据，这样驱动器就总能表现出最佳性能。不幸的是，实际上某些區块上的数据主控并不需要，它们最终将会被删除，但操作系统并没有告诉控制器这些信息。结果，要被删除的数据被重写到了闪存的另一个位置，因而提高了写入放大。在一些OCZ的SSD中，后台垃圾回收仅会清除少量的块，之后便停止，以此限制过度写入的数量。另一种解决方案是配备一个高效的垃圾回收系统，在主控写入的同时同步执行必要的数据移动。在SSD少有空闲的环境中，这种解决方案更有效。SandForce的SSD控制器和Violin Memory的系统有这项功能。

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

2010年，一些厂商（特别是三星）推出的SSD控制器扩展了BGC的概念，它们会分析固态硬盘上使用的文件系统，以识别出最近删除的文件，及未分区的空间。制造商声称，系统（操作系统和SATA控制器硬件）即便不支持TRIM，也能获得相似的性能。三星实现的操作似乎在假定、并且需要有一个NTFS文件系统。目前，这些厂商生产的SSD是否仍具备该功能不得而知。有报道称，如果没有正确地用MBR和NTFS格式化这些驱动器，将会出现系统数据的损坏。

预留空间
----

SSD中的三级预留空间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命令
**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年初[update]，数据库和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控制器使用了压缩。

参见
--

* 闪存文件系统
* 分区对齐
* 耗损平衡

外部链接
----

* 维基共享资源上的相關多媒體資源：写入放大

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
固态硬盘 |
| --- |
|  |
| 关键术语 | 
* 加密
* ECC
* 快閃記憶體檔案系統
* 闪存
* SLC/MLC
* 闪存控制器
* 垃圾回收
* IOPS
* Mbit/s
* 开放通道SSD
* 预留空间
* 讀取干擾
* 安全擦除
* 固态存储
* TRIM
* 耗損平均技術
* 写入放大

 |
|  |
| 闪存制造商 | 
* IMFT（英语：）（英特尔與美光合資）
* 美光
* 三星
* SK海力士
* 鎧俠
* 长江存储

 |
|  |
| 控制器開發商 | 

|  |  |
| --- | --- |
| 独立開發商 | 
* Greenliant Systems（英语：）
* Hyperstone
* Indilinx（英语：）（現為東芝所有）
* JMicro
* 美满電子
* PMC-Sierra（英语：）
* Phison
* SandForce（現為希捷子公司）
* SMI
* VIA

 |
|  |
| 附属開發商 | 
* Fusion-io（英语：）
* 英特尔
* 美光
* HGST
	+ sTec（英语：）
* 希捷
* 鎧俠
	+ OCZ存儲解決方案
* 三星

 |

 |
|  |
| 固態硬碟制造商 | 
* 威剛科技
* 十銓科技
* 宇瞻科技
* 海盜船
* 英特爾
* 影馳
* 金士頓
* 光寶科技（旗下建興電子及浦科特品牌）
* 美光科技
* Memblaze
* 三星
* 希捷科技
* 東芝（包括旗下OCZ及其代工的AMD以及松下）
* 威騰電子
	+ HGST
	+ 新帝
* 創見資訊
* 以及更多其它製造商（英语：）......

 |
|  |
| 匯流排及傳輸協定 | 
* 並列ATA（甚少使用）
* 串列ATA
* SAS
* PCIe
* SATAe
* 光纤通道（FC）
* USB
* Thunderbolt
* AHCI
* NVMe

 |
|  |
| 外觀結構配置及連接介面 | 
* 傳統硬碟機尺寸
	+ IDE
	+ SATA
	+ SAS
	+ U.2
	+ SATAe
* 擴展介面卡
	+ mSATA
	+ M.2
	+ PCIe
* 抽取式磁碟
	+ Mini DP
	+ USB-A/B、USB-C
* 其它廠商專用規格（如Apple專用SSD）

 |
|  |
| 相关组织機構 | 
* INCITS（英语：）
* JEDEC/JC-64.8
* ONFI（英语：）
* NVMHCI
* USB-IF
* SATA-IO
* SFF委员会（英语：）
* SNIA
* SSSI
* T10/SCSI
* T11/FC
* T13/ATA

 |
|  |
| 分类 **分类** |

 |