1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| `磨损均衡`: 实现的核心办法、类似虚拟内存、添加一个间接层`FTL`, 像通过一个页表映射虚拟内存和物理页 一样、在FLT里存放了逻辑块地址(Logic Block Address, LBA)到物理块地址(Physical Block Address, PBA)的映射.
操作系统所有对SSD的读写请求、都要经过FLT、FTL里又有逻辑块对应的物理块、这样FTL可以记录每个物理块 被擦写的次数. 若一个物理块被擦写较多、FTL就将它挪到一个擦写少的物理块上,逻辑块不动、操作系统无感.
`TRIM`指令支持 操作系统不关心底层硬件是什么、在SSD的使用上也会带来一个问题: 操作系统的逻辑层和SSD的逻辑层里的块状态是不匹配的.
在操作系统里删除一个文件、其实并没有真正在物理层操作删除、只在文件系统里把对应的inode元信息清理掉, 这个inode还可以继续使用, 写入新的数据, 在物理层面对应的存储空间、在操作系统里被标示可写入. 所以: 日常文件删除、只是操作系统层面的逻辑删除、不小心误删文件时、还可以通过恢复软件、恢复出来, 想彻底删除数据、需要使用文件粉碎功能.
这个删除的逻辑在机械硬盘上可行、后续的写入可直接覆写该位置. 但在SSD上不行.
eg. 在操作系统里删除一个刚下载的文件 a.txt, 在操作系统里、对应的inode里、就没有文件的元信息, 但 SSD的逻辑块层面、并不知道这个事情, a.txt 依然占用了空间、对应的物理页、也是被占用的. 此时: 若要对SSD进行垃圾回收、a.txt 对应的物理页、让要被搬运到其它Block中去、只有当操作系统再 在刚才的inode写入数据时、才会知道原来的数据已无用, 才会标记删除这种现象导致, 为了磨损均衡、 可能搬运了很多已删除的数据、导致很多不必要的数据读写和擦除, 损耗SSD性能.
为了解决这个问题、现在的操作系统和SSD的主控芯片都支持`TRIM`命令、可在文件删除时、让操作系统通知 SSD, 标记对应逻辑块为已删除.
`写入放大`: TRIM 命令的发明,也反应了一个使用 SSD 硬盘的问题,那就是,SSD 硬盘容易越用越慢. SSD存储空间被越占越多时、每次数据写入可能都没有足够空间, 不得不进行垃圾回收、合并块里的页、 然后擦除一些页. 此时, 从操作系统层看、可能只是写入4k或者4M的数据、通过FTL后、可能要搬运8MB、16MB甚至更多的数据
`实际的闪存写入的数据量 / 系统通过 FTL 写入的数据量 = 写入放大` 写入放大越多、SSD的性能也就越差. 解决写入放大、需要在后台定时进行垃圾回收.在磁盘较闲时、把搬运数据、擦除数据、留出空白的工作做完. 实际数据写入时、就不会有这么多的性能损耗了.
|