如何获取内存温度问题

当前版本:2509

当前加载920s的BCU:14100513_00000001020302071127.sr

web界面内存信息如下:

详细信息中没有温度,mdbctl lsprop Memory_1_010101查询结果如下:

bmc.kepler.Inventory.Hardware
  AssetName="CpuBoard1DIMM000"
  AssetTag="N/A"
  AssetType="Memory"
  FirmwareVersion="N/A"
  ManufactureDate="N/A"
  Manufacturer="Hynix"
  Model="N/A"
  PCBVersion="N/A"
  PartNumber="CXMQ3A8MA1GS6-CG1"
  SerialNumber="00000000"
  Slot="DIMM000"
  UUID=""
bmc.kepler.Object.Properties
  ClassName="Memory"
  ObjectIdentifier=[1,"1","1","010101"]
  ObjectName="Memory_1_010101"
  TraceSamplingRate=0
bmc.kepler.Systems.HBM
  DRAMTemperatureCelsius=0
  LogicTemperatureCelsius=0
bmc.kepler.Systems.Memory
  AllowedSpeedsMHz=3200
  BOM="N/A"
  BaseModuleType="UDIMM"
  CapacityMiB=32768
  ChannelId=0
  ChipBitWidth="x4"
  CpuId=0
  DataWidthBits=72
~ ~ $ mdbctl lsprop Memory_1_010101
bmc.kepler.Inventory.Hardware
  AssetName="CpuBoard1DIMM000"
  AssetTag="N/A"
  AssetType="Memory"
  FirmwareVersion="N/A"
  ManufactureDate="N/A"
  Manufacturer="Hynix"
  Model="N/A"
  PCBVersion="N/A"
  PartNumber="CXMQ3A8MA1GS6-CG1"
  SerialNumber="00000000"
  Slot="DIMM000"
  UUID=""
bmc.kepler.Object.Properties
  ClassName="Memory"
  ObjectIdentifier=[1,"1","1","010101"]
  ObjectName="Memory_1_010101"
  TraceSamplingRate=0
bmc.kepler.Systems.HBM
  DRAMTemperatureCelsius=0
  LogicTemperatureCelsius=0
bmc.kepler.Systems.Memory
  AllowedSpeedsMHz=3200
  BOM="N/A"
  BaseModuleType="UDIMM"
  CapacityMiB=32768
  ChannelId=0
  ChipBitWidth="x4"
  CpuId=0
  DataWidthBits=72
  DeviceLocator="DIMM000"
  DiagnosticFault=0
  DimmId=0
  DimmName="DIMM000"
  DimmNum=1
  ErrorCorrection="MultiBitECC"
  FirmwareRevision=""
  Health=0
  LogicalChannelId=3
  Manufacturer="Hynix"
  ManufacturerID="Unknown"
  ManufacturingDate="1945"
  ManufacturingLocation="0"
  MemoryDeviceType="DDR4"
  MemorySubsystemControllerManufacturerID="0"
  MemorySubsystemControllerProductID="0"
  MemoryType="Synchronous| Unbuffered (Unregistered)"
  MinVoltageMillivolt=1200
  Name="Memory000"
  NodeId=0
  OperatingSpeedMhz=2933
  OriginalPartNumber="CXMQ3A8MA1GS6-CG1"
  PartNumber="CXMQ3A8MA1GS6-CG1"
  Position="CpuBoard1"
  PredictiveFault=0
  Presence=1
  RankCount=1
  SerialNumber="00000000"
  SilkText="DIMM000"
  SystemId=1
  Technology=""
  TemperatureCelsius=32768

TemperatureCelsius=32768 应该是无效数值

Q:现在需要在web界面显示温度,效果如下:

应该如何操作呢

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

总结建议

根本原因:BMC未能正确获取或解析DIMM温度,导致TemperatureCelsius=32768,前端无有效数据可供展示。

推荐行动:

  1. 升级BMC至 OpenUBMC 25.12 或 SP1 版本
    • 更高版本修复了多项传感器显示问题(如#6中CPU/内存无法显示问题)
  2. 替换或更新SR配置文件
    • 确保SR文件中正确定义了ThresholdSensor_Mem1Temp等温度传感器
  3. 验证IPMI传感器读数正确
    • 若IPMI无读数,说明底层未成功采集,Web无法显示
  4. 修改Web前端模板
    • 增加字段“内存温度”并绑定 TemperatureCelsius 属性
  5. 联系硬件团队确认DIMM是否支持温度上报
    • 某些消费级DDR4模组不支持温度传感器,仅服务器级RDIMM/LRDIMM支持

完成以上步骤后,即可在Web界面成功显示内存温度信息。

点击此处查看详细分析解答

如何在Web界面显示内存温度

根据您提供的信息,目标是在BMC Web界面中正确显示内存温度。当前问题在于虽然系统中存在温度传感器,但Web界面未显示温度,且TemperatureCelsius=32768为无效值。以下是完整的解决方案:

当前问题分析

  1. 温度数据异常

    • mdbctl lsprop Memory_1_010101 查询结果显示 TemperatureCelsius=32768,这是典型的无效或未初始化数值(通常表示传感器读取失败或硬件不支持)。
    • bmc.kepler.Systems.HBM.DRAMTemperatureCelsius=0LogicTemperatureCelsius=0 也为异常值,表明HBM温度监测可能未启用或不适用。
  2. Web界面缺失温度字段
    当前Web展示模板中缺少“内存温度”字段,需确认前端是否支持该属性渲染。

  3. 传感器配置状态
    需确认底层传感器是否已正确配置并正常采集数据。


解决方案步骤

1. 确认底层传感器是否可用

使用IPMI或Redfish接口检查内存温度传感器是否存在及状态:

# 使用ipmitool查看传感器列表
ipmitool sdr list | grep -i dimm
# 或查找特定DIMM温度
ipmitool sdr type "Temperature" | grep DIMM000

# 查看具体传感器读数
ipmitool sensor get "DIMM000_Temp"

若返回na或无输出,表示传感器未注册或驱动未加载。


2. 检查传感器定义文件(SR文件)

您的系统加载了 14100513_00000001020302071127.sr 文件,需检查其中是否包含以下内容:

查找内存温度传感器定义:

"ThresholdSensor_Mem1Temp": {
    "EntityId": "<=/Entity_DIMM000.Id>",
    "EntityInstance": "<=/Entity_DIMM000.Instance>",
    "SensorName": "DIMM000_Temp",
    "Reading": "<=/Memory_1.TemperatureCelsius |> expr($1 > 255 ? 128 : $1)",
    "IsValid": "<=/Memory_1.Presence |> expr($1 == 1 ? true : false)",
    ...
}

同时确认对应实体:

"Entity_DIMM000": {
    "Id": 176,
    "Instance": 0
}

如果 sr 文件中没有类似 ThresholdSensor_Mem1Temp 定义,则说明该温度传感器未配置,需添加或替换合适的SR配置包以支持DDR4内存温度监控。


3. 验证SNMP MIB中的内存温度信息

从文档片段可知,SNMP接口可通过 memoryDescriptionTable 获取内存信息,包括温度相关字段。

观察您提供的表格(memoryDescriptionTable)中存在以下字段:

  • memoryMediumTemperature → 当前值为 unconwn(拼写错误)
  • memoryControllerTemperature → 当前值为 unconwn

:white_check_mark: 这说明系统尝试获取内存温度,但底层未能返回有效数据。

建议:

  • 升级BIOS/BMC固件以修复可能存在的传感器驱动缺陷。
  • 排查IPMB通信是否正常(BMC通过IPMB总线与CPU/内存控制器通信),因IPMB故障会导致传感器读取失败。

4. 修复 TemperatureCelsius 异常值

当前值 32768 超出合理范围(通常为0~100℃),这通常是由于:

  • 传感器未实现,返回默认最大值;
  • 小端字节序解析错误(如读取为 0x8000);
  • BMC未接收到真实传感器数据。

解决方法:

  • 确保BMC正确接收来自CPU内存控制器的温度数据。
  • 检查BMC代码(如 cpu_object.lua)是否正确解析来自CPU的DIMM温度。

示例脚本逻辑应包括:

-- cpu_object.lua 示例逻辑
if presence == 1 then
    temp = get_dimm_temperature(dimm_id)
    if temp < 0 or temp > 150 then
        temp = nil -- 标记无效
    end
else
    temp = nil
end

5. Web前端显示配置

要使Web界面显示“内存温度”,需要满足两个条件:

(1)后端属性存在且有效

确保 bmc.kepler.Systems.Memory.TemperatureCelsius 返回合理值(例如30),而非32768。

(2)Web模板支持温度字段渲染

检查Web前端代码中内存详情页的模板是否包含如下逻辑:

<div class="item">
  <span class="label">内存温度</span>
  <span class="value">{{ memory.Temp }} ℃</span>
</div>

若无,则需在Web UI中增加对该字段的支持。


推荐操作流程

步骤 操作 目的
1 执行 ipmitool sdr list | grep DIMM 确认是否存在DIMM温度传感器
2 检查SR文件中是否定义 ThresholdSensor_Mem*Temp 确保传感器已配置
3 使用 ipmitool sensor get "DIMM000_Temp" 查看读数 验证传感器能否正常读取
4 升级BMC到 OpenUBMC 25.12 LTS 或更高版本 修复已知传感器问题(见搜索结果中多个温度修复记录)
5 检查BIOS是否上报DIMM温度至BMC 确保固件协同工作
6 修改Web前端模板,添加“内存温度”字段 实现可视化显示
7 测试热插拔、重启后温度是否持续可读 验证稳定性

参考依据与支持项

:white_check_mark: 支持Web显示内存温度的系统能力:

  • KG实体ThresholdSensor_Mem1Temp, DIMM170_Temp, Memory_20 等表明系统支持多DIMM温度监控。
  • KG关系Memory Object 提供传感器基础,Scanner_MemoryTemp 负责读取,架构完备。
  • Redfish支持Oem/openUBMC/FanSpeedCustom/MemoryTargetTemperatureCelsius 表明系统具备内存温控闭环能力。

:white_check_mark: 已知修复案例(来自搜索结果)

  • Issue #2:GPU卡温度传感器异常已修复 → 说明BMC具备修复类似问题的能力
  • Issue #4:NVMe盘温度显示负数问题已修复 → 显示层数据处理机制存在
  • Issue #10:多传感器概率显示为-- → 与当前问题高度相关,建议升级到2512版本解决

总结建议

根本原因:BMC未能正确获取或解析DIMM温度,导致TemperatureCelsius=32768,前端无有效数据可供展示。

推荐行动:

  1. 升级BMC至 OpenUBMC 25.12 或 SP1 版本
    • 更高版本修复了多项传感器显示问题(如#6中CPU/内存无法显示问题)
  2. 替换或更新SR配置文件
    • 确保SR文件中正确定义了ThresholdSensor_Mem1Temp等温度传感器
  3. 验证IPMI传感器读数正确
    • 若IPMI无读数,说明底层未成功采集,Web无法显示
  4. 修改Web前端模板
    • 增加字段“内存温度”并绑定 TemperatureCelsius 属性
  5. 联系硬件团队确认DIMM是否支持温度上报
    • 某些消费级DDR4模组不支持温度传感器,仅服务器级RDIMM/LRDIMM支持

完成以上步骤后,即可在Web界面成功显示内存温度信息。

内存温度是通过ipmb通道向imu获取的,排查思路有
1、查看是否上电
2、检查其他通过imu获取的信息是否有正确获取到,可能有用的资料: docs/docs/zh/development/faq/hardware-代码预览-docs:基于 Node.js 的社区文档中心项目 - AtomGit | GitCode

非常感谢,我看看

您好!我现在查看内存温度是可以识别到的

但是界面依然不显示温度

以下是我的改动:组件webui

Memory.lua为后端上传的参数,其中定义了TemperatureCelsius

Memory.interface = mdb.register_interface('bmc.kepler.Systems.Memory', {
    SystemId = {'y', nil, true, nil},
    Name = {'s', nil, true, nil},
    DimmName = {'s', nil, true, nil},
    Presence = {'y', nil, true, nil},
    CpuId = {'y', nil, true, nil},
    NodeId = {'y', nil, true, nil},
    ChannelId = {'y', nil, true, nil},
    LogicalChannelId = {'y', nil, true, nil},
    DimmId = {'y', nil, true, nil},
    AllowedSpeedsMHz = {'u', {['emitsChangedSignal'] = 'true'}, true, nil},
    BaseModuleType = {'s', nil, true, nil},
    CapacityMiB = {'u', nil, true, nil},
    DataWidthBits = {'u', nil, true, nil},
    FirmwareRevision = {'s', nil, true, nil},
    Manufacturer = {'s', nil, true, nil},
    DramManufacturer = {'s', {['emitsChangedSignal'] = 'false'}, true, nil},
    MemoryDeviceType = {'s', nil, true, nil},
    MemorySubsystemControllerManufacturerID = {'s', nil, true, nil},
    MemorySubsystemControllerProductID = {'s', nil, true, nil},
    MemoryType = {'s', nil, true, nil},
    OperatingSpeedMhz = {'u', nil, true, nil},
    PartNumber = {'s', nil, true, nil},
    OriginalPartNumber = {'s', nil, true, nil},
    RankCount = {'u', nil, true, nil},
    SerialNumber = {'s', nil, true, nil},
    MinVoltageMillivolt = {'u', nil, true, nil},
    Position = {'s', nil, true, nil},
    DiagnosticFault = {'y', nil, false, 0},
    PredictiveFault = {'y', nil, true, 0},
    DeviceLocator = {'s', nil, true, nil},
    Health = {'y', nil, true, nil},
    DimmNum = {'y', nil, true, nil},
    BOM = {'s', nil, true, nil},
    ManufacturerID = {'s', nil, true, nil},
    ManufacturingDate = {'s', nil, true, nil},
    ManufacturingLocation = {'s', {['emitsChangedSignal'] = 'true'}, true, nil},
    ChipBitWidth = {'s', nil, true, nil},

    TemperatureCelsius = {'d', {['emitsChangedSignal'] = 'true'}, true, nil},   //此处

    SilkText = {'s', {['emitsChangedSignal'] = 'false'}, true, nil},
    ErrorCorrection = {'s', {['emitsChangedSignal'] = 'false'}, true, nil},
    Technology = {'s', {['emitsChangedSignal'] = 'false'}, true, nil}
}, {}, {})

在product.datatype.ts中添加参数temperature

export interface IMemory {
  allowedSpeedsMHz: string;
  bomNumber: string;
  capacityMiB: string;
  dataWidthBits: string;
  deviceLocator: string;
  deviceType: string;
  manufacturer: string;
  minVoltageMillivolt: string;
  operatingSpeedMHz: string;
  partNumber: string;
  position: string;
  rankCount: string;
  serialNumber: string;
  typeDetail: string;

  temperature?: string;        //此处

  aepInfo?: IAEPInfo;
  extendTitleArr?: IExtendTitle[];
  url?: string;
  expandFlag?: string;
  expandShow?: boolean;
}

Memory.vue中绑定,更改如下:

function parseMemoryInfoInit(data: any): IMemory {
  const capacityMiB = initMemory(data.General.CapacityMiB, 'MB');
  const operatingSpeedMHz = initMemory(data.General.OperatingSpeedMHz, 'MT/s');
  const allowedSpeedsMHz = initMemory(data.General.AllowedSpeedsMHz, 'MT/s');
  const minVoltageMillivolt = initMemory(data.General.MinVoltageMillivolt, 'mV');
  const dataWidthBits = initMemory(data.General.DataWidthBits, 'bit');
  const rankCount = initMemory(data.General.RankCount, 'rank');
  const deviceType = data.General.DeviceType || DEFAULT_DATA.noDataStr;
  const manufacturer = data.General.Manufacturer || DEFAULT_DATA.noDataStr;
  const position = data.General.Position || DEFAULT_DATA.noDataStr;
  const partNumber =
    data.General.PartNumber !== '' && data.General.PartNumber !== null && data.General.PartNumber !== undefined
      ? data.General.PartNumber
      : DEFAULT_DATA.noDataStr;
  const serialNumber =
    data.General.SerialNumber !== '' &&data.General.SerialNumber !== null && data.General.SerialNumber !== undefined
      ? data.General.SerialNumber
      : DEFAULT_DATA.noDataStr;
  const typeDetail = data.General.TypeDetail || DEFAULT_DATA.noDataStr;
  const url = `${UI_REST_SYSTEM_MEMORY}/${data.General.Position}${data.General.DeviceLocator}`;
  const expandFlag = `${data.General.Position}${data.General.DeviceLocator}`;
  const expandShow = false;
  return {
    allowedSpeedsMHz,
    bomNumber: data.General.BomNumber,
    capacityMiB,
    dataWidthBits,
    deviceLocator: data.General.DeviceLocator,
    deviceType,
    manufacturer,
    minVoltageMillivolt,
    operatingSpeedMHz,
    partNumber,
    position,
    rankCount,
    serialNumber,
    typeDetail,
    url,
    expandFlag,
    expandShow,

    temperature: data.TemperatureCelsius || DEFAULT_DATA.noDataStr,   //此处

  };
}

temperature也与界面中的“温度”绑定

  {
     label: 'MEMORY_TEMPERATURE',
     content: 'temperature',
     hide: false,
  },


"MEMORY_TEMPERATURE": "温度",

但是现在界面依然没有温度的具体数值

现在应该如何排查呢

您好还有一个问题

mdbctl lsprop Memory_1_010101能查询到温度结果,是否说明我的vpd已经配置好了内存温度?然后通过bios传到BMC再在前端显示?

先看看文档,你对于获取链路的理解有点问题

您好!看了一下文档,内存的动态信息温度,是通过IMU,用IPMI命令实时读取的,和CPU共用命令通道。

看了一下Memory类,只提供了对HBM类型内存温度的属性配置。

我想要对DIMM内存的温度进行动态获取,是不是需要配置Sensor类,配置后温度数据传递到哪里了呢,实在是没有思路 :smiling_face_with_tear:

内存温度也支持获取吧,你这个温度不是获取到了吗?你需要查看一下rackmount是否有相关信息展示的接口