我目前对持久存储软件感兴趣,这种软件对异常程序终止(例如断电)具有一定程度的鲁棒性。在我遇到仅附加数据库的原理之前,我天真地实现了自己的这样的存储库,它在两个不同的文件之间交替保存和加载,这些文件以计数器开始,uint8
以确定两个文件中哪个是最近保存的,并以 SHA-256 哈希和结束,以验证文件是否确实已成功写入:如果其中一个在加载时损坏,另一个应该没问题,并且具有最新的未损坏状态,因为我在写入后关闭文件之前进行了同步。
然后我想知道,当我删除并重新创建或只是重复打开和截断相同的两个文件时,物理存储介质上会发生什么?我执行的部分操作是否会绕过磨损均衡,从而加速存储介质的磨损,特别是如果它是 SSD?
答案1
典型(但不是唯一可能)的情况是,您的操作系统无法直接访问构成 SSD 的 NAND - 它位于控制器后面,也可能位于为经典盘式硬盘(SATA)设计的 HCI 后面,或位于 USB 或 SDIO/eMMC 等总线协议后面。
SATA 和 NVMe 都使用 LBA 来寻址存储。您的操作系统可以要求设备读取或写入一个或多个 LBA - 一个 LBA 包含 512 或 4096 个字节。
SSD 的情况没有改变,只是增加了一个额外的命令 - TRIM - 这意味着操作系统可以告诉设备它不再使用某些 LBA。这是 SSD 在 I/O 级别上向操作系统公开的唯一真正新事物。NVMe 具有其他功能,但它们都与拆分设备(命名空间)或更快地处理请求(队列等)有关
您的操作系统负责接收基于文件的请求,例如服务 API(如打开/读取/写入/关闭系统调用),并通过适当的内核级代码将它们转换为存储命令链。如果驱动器报告它支持 TRIM 命令,则所有现代操作系统在删除文件时也会发出 TRIM 命令。
然后我想知道,当我删除并重新创建或只是重复打开和截断相同的两个文件时,物理存储介质上会发生什么?我执行的部分操作是否会绕过磨损均衡,从而加速存储介质的磨损,特别是如果它是 SSD?
除非您对 SSD 固件以及它如何精确响应命令有所了解,否则您无法 100% 确定。\
但要明白以下情况通常适用于基于 NAND 的 SSD:
当数据写入已擦除闪存时,I/O 速度最快。
NAND 被分成多个擦除块,每个擦除块又包含页面。页面可以写入,但擦除只能在整个擦除块上进行。
檔除很慢。
因此,SSD 固件必须执行的任务是尝试保留尽可能多的“已擦除”擦除块。此外,页面和擦除块通常不是 512 或 4096 字节 - 512 是大多数操作系统几十年来预期/假设的 LBA 大小。因此,SSD 保留一个映射表 - LBA 到“物理块地址”或 PBA。
写入任何 LBA 都很可能实际上导致写入新的或不同的 PBA(因为除非空间不足,否则它会优先写入新擦除的页面),然后 SSD 会更新其 LBA 到 PBA 表。当写入的 LBA 过多,并且 SSD 无法保持打开的擦除块时,SSD 就会开始变慢。
当您删除文件并且您的操作系统发出 TRIM 命令时,SSD 可以将 PBA 从其 LBA 取消映射到 PBA 表,并搜索其 NAND 以查找可以聚集并通过擦除来准备新数据的擦除块。
这个故事的寓意是:SSD 内部执行大量工作,但这些工作都不会暴露给您的操作系统,SSD 固件会处理所有工作。您无法对所有这些工作采取任何措施,除非确保您的操作系统发出 TRIM 命令,或者如果操作系统支持,则手动发出这些命令(Linux 有blkdiscard
)。
因此,任何对 SSD 的写入都会影响其磨损均衡,但是如何或者多少除了您正在写入的数据量之外,并不容易预测或与您正在写入的内容相关联。
大多数操作系统文件 API(例如截断或打开)都会影响存储在磁盘上的目录以及文件数据。因此,实际上您在那里执行的任何操作都会导致写入 SSD。