概括:
如何测量 SSD 的耐久性以及写入放大的影响是什么?
细节
我有一块英特尔 SSD Pro 2500 系列 480 GB 硬盘。最近我收到一条通知,说我的硬盘出现故障。我很惊讶,因为它才不到 2 年。我使用英特尔 SSD 实用程序检查了 SMART 状态,并看到了屏幕截图中显示的结果。
有几件事很突出:
E8 可用保留空间不足。这可能就是我收到磁盘故障通知的原因。
主机总写入量约为 8.9 TB。这个数字很大,但也不是不合理的。
NAND 总写入量约为 202 TB。这要多得多,而且我认为它接近驱动器的耐久性。
我看了看驾驶手册规格说明如下:
最低使用寿命/耐久性等级
在典型的客户端工作负载(每天高达 20 GB 的主机写入量)下,SSD 的使用寿命至少为五年。
根据我的计算,这意味着驱动器支持 20 GB * 365 天/年 * 5 年 =36.5TB 的写入量。
因此,我的 8.9 TB 主机写入远低于 36.5 TB 的阈值,但 202 TB 的 NAND 写入远高于该阈值。
我的第一个问题是:驱动器耐久性数据是基于主机写入还是 NAND 写入?
我认为这是 NAND 写入,因为这是驱动器实际正在做的事情,但如果有人有更具体的答案,那将会很有用。
我的第二个问题是:Windows 客户端工作负载的写入放大的合理值是多少?我的 22.7 倍写入放大是否过高?如果过高,我该如何降低它?
我检查了 trim 是否已启用并且我认为是:
C:\WINDOWS\system32>fsutil behavior query DisableDeleteNotify
NTFS DisableDeleteNotify = 0
我找到了一个白皮书这表明这是正常的写入放大水平:
许多消费级 SSD 的写入放大系数在 15 到 20 之间。
但我也看到其他表明写入放大应该更接近 1 的东西。所以这就是我在这里询问的原因,看看是否有人有有用的见解。
附录:BitLocker 问题
在写这个问题的过程中,我发现了一个我的驾驶体验.评论部分内容如下:
TRIM 问题没有改变。同样,除非您使用软件加密,否则这不是问题,因为否则总会有可压缩数据,但考虑到 Pro 2500 中的 Opal 和 eDrive 支持,如果计划使用软件加密,我不明白为什么有人会选择 Pro 2500。
我不知道具体是什么TRIM 问题是但我的驱动器确实启用了 Bitlocker 加密(这是 IT 政策的一部分)。我搜索如何检查驱动器是否使用内置加密并且我的驱动器似乎没有使用硬件加密。运行命令manage-bde.exe -status c:
显示:
C:\WINDOWS\system32>manage-bde.exe -status c:
BitLocker Drive Encryption: Configuration Tool version 10.0.14393
Copyright (C) 2013 Microsoft Corporation. All rights reserved.
Volume C: [Windows]
[OS Volume]
Size: 445.05 GB
BitLocker Version: 2.0
Conversion Status: Fully Encrypted
Percentage Encrypted: 100.0%
Encryption Method: AES 256
Protection Status: Protection On
Lock Status: Unlocked
Identification Field: Unknown
Key Protectors:
TPM And PIN
Numerical Password
我现在猜测 Sandforce 控制器无法很好地处理不可压缩的加密数据。不过如果有人能更详细地回答我的问题,我将不胜感激。
答案1
在 Anandtech SSD 评论中,有一部分标题为耐力等级:如何计算其中,给出了以下计算:
因此,当您看到“主机写入”时,这是指操作系统发送的内容,而不是必须完成才能完成的实际 NAND 写入。
驱动器耐久性数据是基于主机写入还是 NAND 写入?
在这种情况下,主机写入。由于手册上说:
“在典型客户工作负载下,SSD 至少可以使用五年,最高可达 20 GB主机写入每天。”[强调]
没有任何歧义 - 该语句指的是主机写入,而不是 NAND 写入。请注意,这是一个模糊的语句,因为它说的是“典型”之类的话。在这种情况下,我们不知道真正的最大 NAND 写入值是多少,因为手册中没有说明。
Tom's Hardware 文章英特尔澄清 600p SSD 耐久性限制,但 TBW 评级可能会产生误导文章说,您无法根据每日驱动器写入次数/写入的 TB 数安全地估计驱动器何时会报废,而应仅依赖介质磨损指示器 (MWI) 值。这是有道理的,因为它是根据您的写入符合特定模型而得出的估计值。文章还指出,只要您有备用单元(但看起来您的备用单元已经所剩无几),驱动器就可以在 MWI 达到其最终值后继续工作。
Windows 客户端工作负载的写入放大的合理值是多少?我的 22.7 倍写入放大是否过高?如果过高,我该如何降低它?
一个英特尔员工在英特尔论坛上发帖称,写入放大因子 (WAF) 为 1 - 4 是“正常”值但它可能高达 10。22.7 的 WAF 可能高于平均值,但最终该值将高度依赖于具体情况,正如您所指出的,由于加密,SSD 不会看到太多可压缩数据。
AMicrosoft 理解 SSD 耐久性博客文章表示造成放大的原因有很多种:
修复作业会产生额外的 IO;数据重复数据删除会产生额外的 IO;文件系统和许多其他组件通过持久保存其元数据和日志结构会产生额外的 IO;等等。事实上,驱动器本身会从垃圾收集等内部活动产生写入放大!
归根结底,除非您要更改数据工作负载(通过使其连续且高度可压缩),否则减少 WAF 的选项是有限的。假设分区之类的东西排列整齐,您唯一能做的就是手动过度配置,通过安全擦除清空整个 SSD(这本身会导致 SSD 磨损),然后确保您创建的所有分区不会覆盖 SSD 的整个大小(从而创建人为备用)。从英特尔固态硬盘在服务器存储应用中的应用论文:
重要提示:SSD 必须是全新的、刚从盒子里取出的,或者在调整可用容量之前必须立即使用 ATA SECURITY ERASE UNIT 命令进行擦除。
- (推荐)创建仅占用所需可用容量的分区,剩余容量不使用。
其他参考资料:
答案2
对于大多数消费者工作负载,写入放大通常不超过 2 倍。22.7 倍的写入放大远高于正常值,表明存在问题。不幸的是,该问题出在 SSD 的控制器上。
您看到的异常高的写入放大是由于基于 SandForce 的 SSD 上的全盘加密与固件版本为 5.0.1 和 5.0.2 的 SandForce SF-2281 上的 TRIM 实现错误造成的。
全盘加密与 SandForce 控制器使用的数据压缩技术交互效果不佳
SandForce SSD 控制器以依靠数据压缩(品牌为 DuraWrite)来提高 SSD 耐用性而闻名。简而言之,SandForce 控制器在将传入数据写入 NAND 之前对其进行压缩,并在读取数据时对其进行解压缩。由于用户数据通常可压缩,因此支持实时数据压缩的控制器可以向 NAND 写入比实际发送到驱动器的数据更少的数据。因此,在适当的工作负载下,基于 SandForce 的驱动器能够实现写入放大系数小于一。
然而,加密数据无法有效压缩,因此这种方法行不通。这种对压缩的依赖意味着,当面对不可压缩的数据时,SandForce 控制器的性能会降低,并且无法从 DuraWrite 功能中获得耐久性优势。
TRIM 在 SandForce SF-2281 固件版本 5.0.1 和 5.0.2 上无法正常工作
NAND 闪存的一个关键限制是,虽然它可以以较小的尺寸写入页面,现有数据无法就地重写,而必须先擦除,这只能整体进行块几十页。写入也必须分散,以防止驱动器的任何单个区域过早磨损(磨损均衡)。此外,驱动器必须假设之前写入驱动器的所有数据仍然有效,直到操作系统通过 TRIM 命令告知它其他情况。因此,对于操作系统来说似乎远未满的 SSD 可能内部已接近满。如果驱动器在内部已满时获得大量小随机写入,则更有可能看到高写入放大;本质上,当您实际尝试将小块和小块信息写入驱动器时,驱动器必须擦除整个块并重写大量现有数据。
不幸的是,英特尔 SSD Pro 2500(以及当时许多其他 SSD)中使用的 SF-2281 控制器固件存在缺陷,导致 TRIM 无法正常工作。因此,控制器无法正确执行垃圾收集,需要反复重写之前写入驱动器的数据,即使这些数据不再有效。虽然 BitLocker 确实支持 TRIM,但它在此驱动器上实际上毫无用处。因此,驱动器实际上表现得好像它总是完全满的,导致非常高的写入放大。
我能做什么呢?
鉴于该驱动器的 SMART 状态,您应尽快更换它。现代 SSD 通常具有功能齐全的 TRIM,不会出现此问题。据我所知,Intel SSD Pro 2500 从未收到过解决此问题的固件更新。
可以通过过度配置来缓解此问题,这样实际使用的磁盘区域就少于整个磁盘区域。不幸的是,由于 TRIM 不起作用,简单地缩小系统分区不会有帮助,因为无法修剪释放的区域以告诉驱动器它可以用作备用区域。您需要使用安全擦除命令擦除整个驱动器,对驱动器进行适当分区,然后绝不使用未分区/未格式化的空间来存储任何实际数据。事实上,这已经在Anon 的回答:
重要提示:SSD 必须是全新的、刚从盒子里取出的,或者在调整可用容量之前必须立即使用 ATA SECURITY ERASE UNIT 命令进行擦除。
- (推荐)创建仅占用所需可用容量的分区,剩余容量不使用。