1. XenForo 1.5.14 中文版——支持中文搜索!现已发布!查看详情
  2. Xenforo 爱好者讨论群:215909318 XenForo专区

都说固态硬盘寿命短,那么有谁把使用寿命用完了吗?

本帖由 漂亮的石头2022-02-02 发布。版面名称:知乎日报

  1. 漂亮的石头

    漂亮的石头 版主 管理成员

    注册:
    2012-02-10
    帖子:
    486,020
    赞:
    46
    [​IMG] 北极,请勿付费咨询 阅读原文

    我的工作是做操作系统存储驱动相关的东西,包括文件系统、存储驱动、USB 都接触过,把盘写坏了的事情还是遇到过不少次的。

    如果把写坏的盘做一个汇总,可以总结以下几个特点:

    1. 基本上都是不出名的小厂的盘,大厂尤其是 Intel 的盘在压力测试下也没出过问题,Intel 的盘不仅耐用,并且掉电丢数据的情况也很少。

    2. 新产品更容易坏,比如 NVMe 刚出来的时候,各种杂牌子的盘很多,坏的也多,但过了一段时间以后,NVMe 的稳定性比第一批盘要好。这个规则也适用于 SATA-SSD(以下简称 SSD),但是因为 SSD 已经比较成熟了,所以 SSD 的问题相对于 NVMe 来说要少一些。

    3. 操作系统上层操作很难写坏一个盘,因为盘自身带缓存,解决方法是发送硬件的 flush(SYNC)命令,并且不要使用 TRIM 命令。

    早年(大概 8 年前)SSD 刚开始普及的时候,杂牌子的 SSD 比较多,国外客户更是什么样的盘都有,寄过来一些故障盘,发现在持续烤机一段时间(大概一个月)以后,性能开始下降,文件系统(RTOS 上的)性能从 200MB/s 左右下降到不到 100MB/s,这个时候盘已经快要坏了,大版本 release 测试的时候发现性能有下降,会用不同的盘测一下,如果是某个特定的盘的问题,那么就会把这个盘从测试环境里取出来,不再继续使用。这些盘年代久远,印象不太深刻。

    我印象深刻的是两年前我写坏过一个 NVMe 盘,盘不是我买的,但是因为我们文件系统的性能距离官方数据有一定差距,并且想研究一下 TRIM(DISCARD)的影响,我就拿过来研究了一下(顺便说一下,有几个回答里有人提到过这个品牌,这个品牌名声一般)。为了避免硬件缓存的影响,我每次测试之前,会全盘写一遍 0x55,再写一遍 0xAA,每写一段就发一个 SYNC 命令,这样能迫使硬件缓存完全失效,并且会完全消耗一次 PE 次数。写完一遍 55/AA 之后,再进行后续性能测试(以每次 256KB 的数据块写 2GB 的内容)。

    这个 NVMe 盘(PCI-E)裸写的速度大概是 700-800MB/s,在我反复擦写 0x55/0xAA 大概 5 次左右的时候,盘的写速度突然掉到 200MB/s,之后一直就保持在这个速度上了。

    基本上可以认为这个盘已经坏了。

    评论有人说 SSD 跟 NVMe 是一种东西,不应该这么比,我回答里的 SSD 特指 SATA-SSD,二者的主控并不一样,NVMe 刚流行的那两年,因为主控问题导致 NVMe 挂掉的盘很多,第一批 NVMe 的主控技术并不好。主控对闪存的性能和寿命影响是很大的。


    所以,要问固态盘快要坏了的时候是什么现象,那么首先可能遇到的是掉速问题,频繁擦写(尤其是写一轮 55/AA)可能会导致固态盘的负载均衡算法失灵;也可能会零碎的丢失一些数据,但考虑到盘本身很大,如果不是像 Chia 那样 P 盘的话,未必能发现异常的数据块。

    正常使用,尤其是用大厂的盘,一般不会有什么问题,我手头的 Intel SSD 730 Series 240GB,是 2014 年买的,作为系统盘使用至今没有任何问题。但另外一块 SanDisk 的 1T SSD,用了不到 4 年,已经有好几块坏快了(但还能用)。但是大厂的东西,贵是真的贵,一分钱一分货,十分钱两分货


    写废盘的测试流程(注:绕过文件系统,直接操作驱动):

    1. 申请 256KB 的固定缓存;

    2. 缓存填充 0x55,从第一个扇区写到最后一个扇区;

    2.1. 每写完 1G,发送一次硬件 Flush 命令(NVMe:Flush Cmd 0x00,SATA:ATA_CMD_FLUSH 0xE7/0xEA)

    3. 缓存填充 0xAA,从第一个扇区写到最后一个扇区;

    3.1. 每写完 1G,发送一次硬件 Flush 命令(同上)

    4. 准备 1-2GB 的内存,按偏移量对 0x100 求余填充数据

    5. 计时,写入数据,计算性能

    6. 计时,读取数据,计算性能,校验

    7. 发送 Flush 命令,并重复 4-6 步骤多次(>5)求平均数

    阅读原文
     
正在加载...