Scanner为什么会在相同的配置下会有不一样的结果

“Event_CpuBoard5V_LowerVoltage”: {
“EventKeyId”: “CpuBoard.LowerVoltage”,
“Condition”: “<=/Scanner_vid.Value |> expr(($1 == 4 || $1 == 0)? 3.0 : 4.5)”,
“Hysteresis”: 0.2,
“LedFaultCode”: “b01”,
“Reading”: “<=/Scanner_5v.Value |> expr(($1 / 20) > 255 ? 5 : (($1 / 20) * 3.3 * 2 * 20 / 4096))”,
@Default”: {
“Reading”: 5,
“Condition”: 3
},
“OperatorId”: 2,
“DescArg1”: “#/Event_CpuBoard5V_LowerVoltage.Reading |> string.format(‘%0.3f’, $1)”,
“DescArg2”: “<=/Scanner_vid.Value |> string.format(‘%0.2fV’, $1)”,
“DescArg3”: “BCU${Slot}_V_VCC_5V0_3V3_RESVAA”,
“DescArg4”: “#/Event_CpuBoard5V_LowerVoltage.Condition |> string.format(‘%0.2f’, $1)”,
“DescArg5”: “${Slot}”,
“Component”: “#/Component_CpuBoard”,
“AdditionalInfo”: “3”
},
“Cont_vid”: {
“Num”: 3,
“DefaultValue”: 0
},
“ThresholdSensor_5v”: {
“AssertMask”: 516,
“DeassertMask”: 516,
“ReadingMask”: 4626,
“M”: 5,
“RBExp”: 224,
“UpperCritical”: “<=/Scanner_vid.Value |> expr(($1 == 4)? 72 : 110)”,
“LowerCritical”: “<=/Scanner_vid.Value |> expr(($1 == 4)? 60 : 90)”,
@Default”: {
“UpperCritical”: 110,
“LowerCritical”: 60,
“Reading”: 100,
“ReadingStatus”: 2
},
“PositiveHysteresis”: 3,
“NegativeHysteresis”: 3,
“EntityId”: “<=/Entity_MainBoard.Id”,
“EntityInstance”: “<=/Entity_MainBoard.Instance”,
“Initialization”: 127,
“Capabilities”: 232,
“SensorType”: 2,
“ReadingType”: 1,
“BaseUnit”: 4,
“NominalReading”: “<=/Scanner_vid.Value |> expr(($1 == 4)? 66 : 100)”,
“MaximumReading”: 255,
“Reading”: “<=/Scanner_5v.Value;<=/Scanner_PowerGood.Value;<=/Scanner_vid.Value |> expr(($2 == 0) ? (($3 == 4)? 66 : 100) : ((($1 / 30) > 255 || $1 == 0) ? (($3 == 4)? 66 : 100) : ($1 / 30)))”,
“ReadingStatus”: “<=/Scanner_5v.Status;<=/Scanner_5v.Value;<=/Scanner_PowerGood.Value;<=/ThresholdSensor_5v.UpperCritical;<=/ThresholdSensor_5v.LowerCritical |> expr((($1 == 0) && (($2 / 30) > 255 || $2 == 0) && ($3 == 1)) ? 2 : (($4 - $5 > 40) ? 2 : $1))”,
“SensorNumber”: 255
}

然后,获取的scanner 不一样,导致一个版本告警一个版本没有告警

一个不告警的版本获取是如下:

% lsprop Scanner_vid_010101
bmc.kepler.Object.Properties
ClassName=“Scanner”
ObjectIdentifier=[1,“1”,“1”,“010101”]
ObjectName=“Scanner_vid_010101”
bmc.kepler.Scanner
Status=0
Value=4
bmc.kepler.Scanner.Aggregate
AggregateOffset=0
AggregateStatus=true

另一个版本告警的就是因为值为0 ,不是4

~ ~ $ mdbctl lsprop Scanner_vid_010101
bmc.kepler.Object.Properties
ClassName=“Scanner”
ObjectIdentifier=[1,“1”,“1”,“010101”]
ObjectName=“Scanner_vid_010101”
TraceSamplingRate=0
bmc.kepler.Scanner
Status=0
Value=0
bmc.kepler.Scanner.Aggregate
AggregateOffset=0
AggregateStatus=true
Private
Chip=“Smc_CpuBrdSMC_010101”
Debounce=“Cont_vid_010101”
FailureDebounceCount=10
Mask=255
NominalValue=0
Offset=201574656
Period=10000
ScanEnabled=1
Size=1
SuccessDebounceCount=10
Type=0

~ ~ $

这个是什么问题,怎么排查定位吗

答案内容由AI生成,仅供参考:

Scanner在相同配置下出现不同结果的原因分析与排查方法

问题概述

用户报告在相同配置下,Scanner_vid_010101在不同版本中返回不同的值(一个版本返回4,另一个版本返回0),导致一个版本触发告警而另一个未触发。这种现象影响了Event_CpuBoard5V_LowerVoltage事件和ThresholdSensor_5v传感器的判断逻辑,因为这些配置依赖于Scanner_vid.Value的值。

根本原因分析

1. Scanner读取值不一致的原因

根据知识库文档,BMC获取每个Scanner信息时都需要消耗一条SMC命令字,频繁的SMC访问会降低总线效率 [文档5]。这可能导致:

  • Scanner读取的稳定性受SMC总线负载影响
  • 在高负载情况下可能出现读取异常或失败
  • 不同版本的固件可能对SMC总线访问的优化策略不同

2. Scanner值为0的可能原因

尽管Scanner的Status=0表明读取状态正常,但Value=0仍可能由以下原因导致:

  • 硬件信号问题:实际硬件返回的值就是0
  • SMC命令执行异常:虽然状态显示正常,但SMC命令未能正确获取数据
  • 缓存或同步问题:不同版本的BMC可能存在资源树数据同步机制差异

3. Scanner配置关键属性

从调试信息可见,Scanner_vid_010101的关键配置包括:

  • Chip: “Smc_CpuBrdSMC_010101”(SMC芯片)
  • Offset: 201574656(SMC命令字)
  • Size: 1(读取1字节)
  • Mask: 255(全掩码)
  • Period: 10000(扫描周期10秒)
  • ScanEnabled: 1(扫描启用)
  • Debounce: “Cont_vid_010101”(防抖策略为持续一致型)

排查定位方法

1. 验证硬件信号与SMC通信

# 检查Scanner属性是否正确
mdbctl lsprop Scanner_vid_010101

# 验证SMC芯片是否存在且可访问
mdbctl ls /Smc_CpuBrdSMC_010101

2. 检查防抖策略影响

根据文档,大量误告警问题与SR中配置的告警防抖策略密切相关 [文档5]。需要确认:

  • 查看Cont_vid_010101防抖对象配置
  • 确认防抖参数(Num=3, DefaultValue=0)是否合理
  • 检查是否因防抖机制导致真实变化被过滤

3. 验证表达式计算逻辑

检查依赖Scanner_vid.Value的两个关键表达式:

对于Event条件判断:

<=/Scanner_vid.Value |> expr(($1 == 4 || $1 == 0)? 3.0 : 4.5)

Value=4时,返回3.0;Value=0时也返回3.0。

对于ThresholdSensor读数计算:

expr((($2 == 0) ? (($3 == 4)? 66 : 100) : ((($1 / 30) > 255 || $1 == 0) ? (($3 == 4)? 66 : 100) : ($1 / 30)))

其中 $3Scanner_vid.Value

4. 检查SMC访问问题

参照[文档7]的V3硬件访问错误排查指南:

  1. 确认SR配置正确性

    • 核对Offset地址是否指向正确的SMC命令字
    • 检查Chip属性中的SMC路径是否正确
  2. 排查MCU实现的SMC问题

    # 检查SMC路径是否可访问
    busctl --user call bmc.kepler.hwproxy {smc_path} bmc.kepler.Chip.BlockIO Read ...
    
  3. 检查是否有总线冲突

    • 查看同一SMC上的其他Scanner访问情况
    • 分析是否有大量Scanner轮询导致总线拥塞

5. 增加诊断日志

参考[文档7],建议:

  • 添加SMC访问失败的日志记录
  • 记录每次Scanner读取的原始返回值
  • 监控Smc_CpuBrdSMC_010101的整体健康状态

解决建议

  1. 优先排查硬件与SMC通信

    • 确认SMC固件版本一致性
    • 验证MCU/SMD实现的SMC功能是否正常
    • 检查是否有物理连接问题
  2. 优化Scanner配置

    • 评估Period=10000是否过长,导致监测不及时
    • 检查ScanEnabled条件是否合理
    • 审查Debounce策略是否适合此应用场景
  3. 增强容错处理

    // 建议修改Reading表达式增加健壮性
    "Reading": "<=/Scanner_5v.Value;<=/Scanner_PowerGood.Value;<=/Scanner_vid.Value |> expr(($2 == 0) ? 100 : (($3 >= 0 && $3 <= 5) ? (($1 / 30) > 255 ? 100 : ($1 / 30)) : 100))"
    
  4. 进行版本差异分析

    • 对比两个版本的完整SR配置差异
    • 分析BMC固件中hwproxy组件的变更
    • 检查底层驱动或SDK是否有更新

通过以上步骤系统性排查,应能定位出导致Scanner_vid_010101值不一致的根本原因,并解决由此引发的告警异常问题。