硬盘预估寿命问题的个人分析和建议

问题背景

最近有很多开发者都遇到了硬盘预估寿命不显示的问题,例如
【问题求助】关于硬盘预估寿命功能,系统运行48小时后web界面硬盘预估寿命显示-- - 交流互助区 - openUBMC 论坛
厂商为YANGTZE MEMORY(长江存储)的硬盘无参数“预估寿命”,其他厂商的都有该参数 - 交流互助区 - openUBMC 论坛
1712 Nvme盘获取不到预估寿命天数 - 交流互助区 / 鲲鹏专区 - openUBMC 论坛
RAID卡下SSD盘预估寿命信息有时候显示为–,有时候不显示该属性 - Hardware SIG - openUBMC 论坛
社区的答复总结如下:
1、EstimatedRemainingLifespan 为0XFFFFFFFF时,表示不支持不支持计算该盘的动态预估寿命,web上不显示该字段
2、EstimatedRemainingLifespan 为0XFFFFFFFE时,表示支持计算该盘的动态预估寿命,但还没达到计算条件,比如一天才会计算一次。
3、当上电时间小于1个月(720h)时判定为"新盘",新盘可24h内显示预估寿命;否则判定为"老盘",需要剩余磨损率变化2次。
但个人分析相关日志和代码后,认为预估寿命的计算逻辑还是有问题的,以下是分析过程和几个可供参考的建议

问题分析

算法逻辑推测

结合日志和社区答复,我们可以推测硬盘预估寿命的大致算法逻辑如下:
1、metric_analyzer 通过rpc接口给在位硬盘预估寿命默认赋初值4294967294也就是0XFFFFFFFE,代表计算中
2、对于新盘写放大WAF接近1,可能使用的是24小时的Data Units Written(已写入数据单元)和硬盘厂家给出的TBW(总写入数据量)两个参数计算得到预估寿命
3、对于老盘WAF变大,可能改用累计通电时间和剩余磨损率的变化量比值计算得到预估寿命,由于剩余磨损率是以1%为最小单位的,所以算法要求变化两次。举个例子,剩余磨损率显示98%,可能是98.99%,也可能是98.01%,所以使用变化两次之间通电时间变化量和磨损率变化量可以避免这种精度误差的影响。
可以看到不管是新盘还是老盘关键计算参数(已写入数据单元和累计通电时间)都来自于硬盘SMART信息,所以对于获取不到SMART信息的SSD盘应该是无法计算预估寿命的

问题一:获取不到SMART信息的盘预估寿命会一直显示"–"

2026-03-10 07:12:07.904962 storage NOTICE: rpc_service_subhealth.lua(191): start get drives estimatedlifespan diag info
2026-03-10 07:12:08.096301 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk15 estimatedremaininglifespan:4294967294
2026-03-10 07:12:08.102610 metric_analyzer NOTICE: diagnose.lua(969): Disk15 set EstimatedRemainingLifespan 4294967294 successfully
2026-03-10 07:12:08.133613 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk2 estimatedremaininglifespan:4294967294
2026-03-10 07:12:08.137966 metric_analyzer NOTICE: diagnose.lua(969): Disk2 set EstimatedRemainingLifespan 4294967294 successfully
2026-03-10 07:12:08.151949 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk3 estimatedremaininglifespan:4294967294
2026-03-10 07:12:08.166686 metric_analyzer NOTICE: diagnose.lua(969): Disk3 set EstimatedRemainingLifespan 4294967294 successfully
2026-03-10 07:12:08.185928 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk12 estimatedremaininglifespan:4294967294
2026-03-10 07:12:08.192933 metric_analyzer NOTICE: diagnose.lua(969): Disk12 set EstimatedRemainingLifespan 4294967294 successfully
2026-03-10 07:12:08.207315 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk13 estimatedremaininglifespan:4294967294
2026-03-10 07:12:08.211220 metric_analyzer NOTICE: diagnose.lua(969): Disk13 set EstimatedRemainingLifespan 4294967294 successfully
2026-03-10 07:12:08.247407 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk14 estimatedremaininglifespan:4294967294
2026-03-10 07:12:08.262510 metric_analyzer NOTICE: diagnose.lua(969): Disk14 set EstimatedRemainingLifespan 4294967294 successfully
2026-03-10 07:12:08.281782 metric_analyzer NOTICE: diagnose.lua(969): Disk1 set EstimatedRemainingLifespan 4294967294 successfully
2026-03-10 07:12:08.278430 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk1 estimatedremaininglifespan:4294967294
2026-03-10 07:12:08.309721 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk0 estimatedremaininglifespan:4294967294
2026-03-10 07:12:08.323740 metric_analyzer NOTICE: diagnose.lua(969): Disk0 set EstimatedRemainingLifespan 4294967294 successfully
……
2026-03-10 07:42:08.359838 storage NOTICE: rpc_service_subhealth.lua(191): start get drives estimatedlifespan diag info
2026-03-10 07:42:08.544199 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk20 estimatedremaininglifespan:4294967294
2026-03-10 07:42:08.560990 metric_analyzer NOTICE: diagnose.lua(969): Disk20 set EstimatedRemainingLifespan 4294967294 successfully
……
2026-03-10 10:12:09.953798 metric_analyzer NOTICE: lifespan_diagnose.lua(82): Disk15 calculate estimated lifespan firstly
2026-03-10 10:12:09.982869 metric_analyzer NOTICE: lifespan_diagnose.lua(82): Disk3 calculate estimated lifespan firstly
2026-03-10 10:12:10.022472 metric_analyzer NOTICE: lifespan_diagnose.lua(82): Disk1 calculate estimated lifespan firstly
2026-03-10 10:12:10.067265 metric_analyzer NOTICE: lifespan_diagnose.lua(82): Disk13 calculate estimated lifespan firstly
2026-03-10 10:12:10.105793 metric_analyzer NOTICE: lifespan_diagnose.lua(82): Disk0 calculate estimated lifespan firstly
2026-03-10 10:12:10.131491 metric_analyzer NOTICE: lifespan_diagnose.lua(82): Disk2 calculate estimated lifespan firstly
2026-03-10 10:12:10.167324 metric_analyzer NOTICE: lifespan_diagnose.lua(82): Disk14 calculate estimated lifespan firstly
2026-03-10 10:12:10.201438 metric_analyzer NOTICE: lifespan_diagnose.lua(82): Disk12 calculate estimated lifespan firstly
2026-03-10 10:12:10.225156 metric_analyzer ERROR: vendor_diagnose.lua(75): power_on_hours[4294967295] of Disk20 is invalid
2026-03-10 10:12:10.227024 metric_analyzer ERROR: lifespan_diagnose.lua(127): process disk info failed, hw_define:0
2026-03-10 10:12:10.260849 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk15 estimatedremaininglifespan:1823
2026-03-10 10:12:10.265787 metric_analyzer NOTICE: diagnose.lua(969): Disk15 set EstimatedRemainingLifespan 1823 successfully
2026-03-10 10:12:10.292693 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk2 estimatedremaininglifespan:1825
2026-03-10 10:12:10.308565 metric_analyzer NOTICE: diagnose.lua(969): Disk2 set EstimatedRemainingLifespan 1825 successfully
2026-03-10 10:12:10.321275 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk3 estimatedremaininglifespan:1825
2026-03-10 10:12:10.325611 metric_analyzer NOTICE: diagnose.lua(969): Disk3 set EstimatedRemainingLifespan 1825 successfully
2026-03-10 10:12:10.365453 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk12 estimatedremaininglifespan:1825
2026-03-10 10:12:10.380598 metric_analyzer NOTICE: diagnose.lua(969): Disk12 set EstimatedRemainingLifespan 1825 successfully
2026-03-10 10:12:10.393726 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk13 estimatedremaininglifespan:1825
2026-03-10 10:12:10.414442 metric_analyzer NOTICE: diagnose.lua(969): Disk13 set EstimatedRemainingLifespan 1825 successfully
2026-03-10 10:12:10.437848 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk14 estimatedremaininglifespan:1825
2026-03-10 10:12:10.441556 metric_analyzer NOTICE: diagnose.lua(969): Disk14 set EstimatedRemainingLifespan 1825 successfully
2026-03-10 10:12:10.453741 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk1 estimatedremaininglifespan:1825
2026-03-10 10:12:10.467423 metric_analyzer NOTICE: diagnose.lua(969): Disk1 set EstimatedRemainingLifespan 1825 successfully
2026-03-10 10:12:10.481029 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk0 estimatedremaininglifespan:1823
2026-03-10 10:12:10.494996 metric_analyzer NOTICE: diagnose.lua(969): Disk0 set EstimatedRemainingLifespan 1823 successfully

对于这块ES3000 V7的NVMe盘,从用户指南来看并不具备直接获取SMART信息的能力,在不安装iBMA的情况下,理论上无法计算预估寿命,应该赋值0XFFFFFFFF,但实际赋值0XFFFFFFFE。metric_analyzer 后续发现该盘的power_on_hours为0XFFFFFFFF,又直接跳过了没有处理,导致预估寿命一直为0XFFFFFFFE,且该属性为下电持久化。

问题二:获取不到SMART信息的盘插拔后预估寿命又变成不显示

  1456  2026-03-09 18:36:12.689786 storage NOTICE: nvme_object.lua(1290): support nvme mi over mctp, Slot: 6, support: 1
  1457: 2026-03-09 18:36:12.695137 storage NOTICE: nvme_mi_mctp.lua(137): DeviceName: Disk6, DevBus: 39, DevDevice: 0, DevFunction: 0, nvme position: 010103090701
  1458  2026-03-09 18:36:12.697590 storage NOTICE: nvme_mi_mctp.lua(70): get nvme phy_addr: 39
  1459  2026-03-09 18:36:12.707150 storage NOTICE: init.lua(164): endpoint for phyaddr: 39, msg_type: 4 exist, no need to wait for new endpoint creation
  1460: 2026-03-09 18:36:12.708877 storage NOTICE: nvme_mi_mctp.lua(180): creat disk6 endpoint successfully
  1461  2026-03-09 18:36:12.715184 storage NOTICE: nvme_object.lua(1290): support nvme mi over mctp, Slot: 7, support: 1
  1468: 2026-03-09 18:36:12.761512 storage NOTICE: nvme_mi_command.lua(187): get Disk6 controller id:0 successfully
  1472: 2026-03-09 18:36:12.856630 storage NOTICE: nvme_object.lua(1173): Disk6 not support uuid by id_ctrl err:false
  1476: 2026-03-09 18:36:12.898951 storage NOTICE: nvme_object.lua(1207): Disk6 not support hw defined smart log without uuid index
  1640  2026-03-09 18:48:50.643107 storage NOTICE: rpc_service_subhealth.lua(191): start get drives estimatedlifespan diag info
  1641: 2026-03-09 18:48:50.721624 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk6 estimatedremaininglifespan:4294967294
  1642: 2026-03-09 18:48:50.724905 metric_analyzer NOTICE: diagnose.lua(969): Disk6 set EstimatedRemainingLifespan 4294967294 successfully
  1643  2026-03-09 18:48:50.733784 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk5 estimatedremaininglifespan:4294967294

  4724  2026-03-09 23:27:27.650941 storage ERROR: tasks.lua(78): task [Drive.update_nvme_by_mctp.Drive_8_01010309] error: ...e/lualib/nvme/nvme_mi_protocol/nvme_mi_admin_command.lua:173: attempt to perform arithmetic on field 'data_units_read_h' (a nil value)
  4725: 2026-03-09 23:28:03.720153 metric_analyzer NOTICE: lifespan_diagnose.lua(66): Rest db lfsp disk data of Disk6
  4726: 2026-03-09 23:28:03.722664 metric_analyzer NOTICE: diagnose.lua(1568): Disk6 is not present or changed, clear db
  4745: 2026-03-09 23:28:03.865686 storage NOTICE: pd_identify_service.lua(128): Disk6 del
  4746: 2026-03-09 23:28:03.869342 storage NOTICE: drive_object.lua(614): Disk6 is_nvme turn false
  4756  2026-03-09 23:28:04.005062 thermal_mgmt NOTICE: object_manage.lua(252): remove objects completely, path: /bmc/kepler/ObjectGroup/010103090701
  4757: 2026-03-09 23:28:04.025769 storage NOTICE: rpc_service_subhealth.lua(252): set drive:Disk6 estimatedremaininglifespan:4294967295
  4758: 2026-03-09 23:28:04.059143 metric_analyzer NOTICE: diagnose.lua(969): Disk6 set EstimatedRemainingLifespan 4294967295 successfully
  4853  2026-03-09 23:28:32.152155 storage NOTICE: drive_object.lua(620): Start update NVME info, id:6 identify_pd:false.
  4854: 2026-03-09 23:28:32.153126 storage NOTICE: drive_object.lua(621): Disk6 is_nvme turn true
  4855  2026-03-09 23:28:32.154253 thermal_mgmt WARNING: dev_object_manage.lua(163): cannot find adapter, object_name: CoolingRequirement_1_60_010103090701

  4885  2026-03-09 23:28:33.360360 storage NOTICE: nvme_object.lua(272): NVMe6 load nvme-mi
  4886: 2026-03-09 23:28:33.750804 storage NOTICE: nvme_object.lua(494): get disk6 NVMe MI 1.0
  4887: 2026-03-09 23:28:33.878589 storage NOTICE: nvme_object.lua(494): get disk6 NVMe MI 1.0
  4888  2026-03-09 23:28:37.153377 storage NOTICE: tasks.lua(72): task [Drive.update_nvme_by_mctp.Drive_7_01010309] start

  4891  2026-03-09 23:28:37.464766 storage NOTICE: nvme_object.lua(1290): support nvme mi over mctp, Slot: 6, support: 1
  4892: 2026-03-09 23:28:37.471883 storage NOTICE: nvme_mi_mctp.lua(137): DeviceName: Disk6, DevBus: 39, DevDevice: 0, DevFunction: 0, nvme position: 010103090701
  4893  2026-03-09 23:28:37.475477 storage NOTICE: nvme_mi_mctp.lua(70): get nvme phy_addr: 39
  4894  2026-03-09 23:28:37.485537 storage NOTICE: init.lua(164): endpoint for phyaddr: 39, msg_type: 4 exist, no need to wait for new endpoint creation
  4895: 2026-03-09 23:28:37.487690 storage NOTICE: nvme_mi_mctp.lua(180): creat disk6 endpoint successfully
  4896  2026-03-09 23:28:52.493425 mctpd ERROR: mctp_engine.lua(376): [System1]mctp_engine: request timeout
  4897: 2026-03-09 23:28:53.523331 storage NOTICE: nvme_mi_command.lua(187): get Disk6 controller id:0 successfully
  4898: 2026-03-09 23:28:53.585557 storage NOTICE: nvme_object.lua(1173): Disk6 not support uuid by id_ctrl err:false
  4899: 2026-03-09 23:28:53.625102 storage NOTICE: nvme_object.lua(1207): Disk6 not support hw defined smart log without uuid index
  4900  2026-03-09 23:28:53.655012 storage ERROR: app_preloader.lua(215): ...ps/storage/lualib/nvme/nvme_mi_protocol/nvme_mi_mctp.lua:75: app(storage/service/main) count(1) pcall failed(...e/lualib/nvme/nvme_mi_protocol/nvme_mi_admin_command.lua:173: attempt to perform arithmetic on field 'data_units_read_h' (a nil value))

从日志来看,拔出前metric_analyzer赋初值0XFFFFFFFE,拔出后重置数据库赋值0XFFFFFFFF,再次插入后没有赋值(补充:这里是因为metric_analyzer有扫描周期),这就导致插拔前后显示不一致

总结和建议

从分析来看,能不能显示预估寿命与盘的类型和厂商没有必然联系,只要能获取SMART信息似乎就可以在一定条件下完成计算

建议一

对于power_on_hours为0XFFFFFFFF或者data_units_written为空的情况,应该给EstimatedRemainingLifespan赋值0XFFFFFFFF而不是0XFFFFFFFE

建议二

对于剩余磨损率已经非100%的盘(例如≤95%)能否使用公式
image
快速得到预估寿命,后续磨损率变化两次后再进行修正,这种情况下两种算法的误差应该不大
@yelmh_kno07

华为的人后续有联系你么?

这个问题这么久了还存在,一直没修复。使用者角度,一张盘热插拔前后一个字段莫名其妙飞了就是会觉得很困惑阿

额,他们觉得设计如此,建议给客户解释一下就行 :sweat_smile:

你是怎么和客户解释的

“这个字段本来就是没有值的–,热插拔后概率性直接不显示是正常的”

这样?我是客户我会觉得好夸张噢

我们只是测试有疑问,在rackmount加了一个逻辑:上电时间拿不到的情况直接屏蔽预估寿命,可以部分规避

建议二是个思路方向,据我了解,每个厂商这个计算公式都存在一些差异,并且对于每一步计算的精度保留都有严格要求,这块如果做估计要做成基于厂商+型号的计算通用配置化的方式。这部分可以收集部分厂商的计算方法,在hardware sig报个议题,大家讨论下