我曾经接触过闪存文件系统,但并不理解一个重要的术语“写入放大”。维基百科页面,我不明白以下信息:
重写某些数据需要读取、更新和写入闪存中已使用的部分,同时如果新位置之前在某个时间点使用过,则需要先擦除该位置;由于闪存的工作方式,必须擦除和重写的闪存部分比新数据量实际需要的要多得多。这种乘数效应增加了 SSD 使用寿命内所需的写入次数,从而缩短了其可靠运行的时间。
我的问题是:
为什么更新后的数据被写入新位置而不是旧位置(最初读取数据的位置)?
所谓的倍增效应在哪里发生?能不能解释得更全面一些?
答案1
首先:写入放大并不是Flash独有的属性,而是所有块设备都会发生的。
这是块设备被称为设备的原因之一block
:数据以部分(“块”)的形式写入,通常由 512 字节到 4 千字节组成。这导致了一种情况,要更改块设备上的单个字节,我们需要先读取块的其余部分(此步骤通常是无操作,因为操作系统缓冲区通常至少是块大小),然后更改内存中的一个字节,然后将整个块写入设备:要更改一个字节,我们必须写入一个完整的块,通常是数千个字节。
这种早已为人所知的机制对于 SSD 来说具有特殊意义,因为它们
- 通常具有较大的块大小
- 只能承受有限数量的写入,比旋转磁盘少几个数量级。
如果 4K 块大小的 SSD 的使用模式是每个块更改 1 个字节,则写入的总字节数将是有效负载字节数的 4096 倍,即write amplification
4096 的倍数。这意味着,典型耐用性为 10 年的 SSD 将在不到一天的时间内超出该耐用性极限。
针对此问题的对策有很多种:
- 最重要的是:这种使用模式非常罕见
- 支持 SSD 的操作系统(和/或控制器)尝试以一种避免放大的方式安排写入。
- 许多现代 SSD 使用 DRAM 缓存来累积对同一块的小写入,并且仅在已满或尽可能晚时才将其写入闪存。超导体在断电时提供完成此操作的电力。
至于问题的第一部分:虽然旋转磁盘在物理层和逻辑层上都有读写操作,但闪存上的物理操作是erase
和program
。read
这意味着,逻辑写入被转换为program
对空(已擦除)块的写入。现代 SSD 控制器会保留已擦除块的清单,并使用这些块尽快满足逻辑写入。如果当前带宽需求或控制器负载很高,则可以将现在未使用的单元的擦除操作推迟到以后。因此,实际上使用不同的块只不过是一种性能调整机制,尽管它非常重要。