带外执行 chassis status,低概率出现 Close Session failed

问题描述

如图所示,执行长时间 BMC 重启,之后带外通过 ipmitool chassis status 查询信息,偶现多一条 Close Session command failed 的打印,500 次出现一次

这条打印是 ipmitool 打的,在此命令失败时产生

在相关时间段,app.log 有这种打印:

日志已传递

环境信息

930 基线

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

:white_check_mark: 结论

项目 内容
问题性质 非功能性缺陷,属 低概率通信异常
影响范围 仅影响会话关闭阶段,不影响主命令执行结果
根本原因 BMC 重启初期,NC SI 不稳定 + RMCP+ 服务负载高,导致 Close Session 请求无响应
解决方向 客户端容错 + BMC 服务初始化顺序优化 + 网络链路稳定性提升
点击此处查看详细分析解答

关于带外执行 chassis status 偶现 “Close Session command failed” 问题的分析


:magnifying_glass_tilted_left: 问题描述

在长时间 BMC 重启测试场景下,通过带外方式使用 ipmitool chassis status 查询系统状态时,低概率(约 500 次出现 1 次)出现打印 Close Session command failed

尽管命令整体返回码为 rc: 0(表示执行成功),但标准输出中多出一条错误提示:

Close Session command failed

该问题出现在如下环境中:

  • 测试命令:ipmitool -H <BMC_IP> -I lanplus -p 623 -U <user> -P <pass> -C 17 chassis status
  • 环境基线:930 基线
  • 出现时机:BMC 刚完成重启后的压力或长稳测试阶段
  • 日志特征:app.log 中同期出现多个 rmccplus_protocol.c: rc = -3 错误记录

:pushpin: 根本原因分析

根据提供的上下文、代码片段和日志信息,可以确定该问题是 IPMI 会话关闭阶段在特定时序下发生的网络通信异常,属于典型的“边缘竞争条件”问题。

1. 错误来源定位:ipmitool 的会话关闭逻辑

从提供的 C 代码片段可以看出,Close Session command failed 是由 ipmitool 自身的 ipmi_close_session_cmd() 函数打印的:

if (!rsp) {
    lprintf(LOG_ERR, "Close Session command failed");
    return -1;
}

这表明:

  • ipmitool 在执行完 chassis status 命令后,尝试主动发送 Close Session(NetFn=App, Cmd=0x3c)指令来优雅关闭 RMCP+ 会话
  • 但由于某种原因,BMC 未及时响应此 Close Session 请求rsp == NULL),导致客户端超时并打印该错误。

:warning: 注意:该错误不影响主命令执行结果,因为 chassis status 已成功完成并获取了完整输出,只是会话关闭失败。


2. BMC 侧的异常日志佐证

相关时间段内 BMC 的 app.log 出现大量如下错误:

2026-01-16 16:53:32.317374 om ERROR: rmccplus_protocol.c(482): rc = -3
2026-01-16 16:53:43.349610 om ERROR: rmccplus_protocol.c(482): rc = -3
...

:white_check_mark: 分析:

  • rmccplus_protocol.c 是处理 RMCP+ 安全会话协议的核心模块。
  • rc = -3 通常代表 “资源不可用” 或 “会话状态异常”,可能包括以下情况:
    • BMC 正处于高负载或 GC 阶段,无法及时处理新的会话请求/关闭。
    • 网络底层(如 NCSI)出现瞬时中断(见下文)。
    • 会话状态机混乱,无法匹配合法会话 ID。

这些日志与 Close Session command failed 在时间上高度重合,说明 BMC 当前正面临 会话管理服务不稳定 的问题。


3. 网络底层异常:NC SI 接口问题

日志中还出现:

2026-01-16 16:52:51.210033 network adapter ERROR: ncsi.package.lua(134): ncsi cmd ctrl select package

:white_check_mark: 说明:

  • NCSI(Network Controller Sideband Interface)是用于带外管理通道的关键协议。
  • 此错误表示 BMC 正在切换或丢失与主板网卡的带外通信链路
  • 在 BMC 重启初期,NC SI 链路尚未完全稳定,可能导致 IPMI 报文丢包或响应延迟

:right_arrow:直接解释了为何 Close Session 命令无响应:消息根本没有到达 BMC 或被丢弃。


:stopwatch: 问题触发时机分析(为何低概率?)

该问题仅在 “长时间 BMC 重启” 后偶发,原因如下:

阶段 状态 影响
BMC 刚重启完成 系统服务正在初始化 IPMI 服务虽可用,但部分模块(如 NCSI、RMCP+ 状态机)未完全就绪
系统高负载 日志显示 start collect garbage Lua 虚拟机 GC 占用 CPU,可能导致协议栈响应延迟
并发会话多 长时间测试中频繁创建/销毁会话 可能超出 BMC 带外会话最大并发能力(文档提及为 5~15)
网络链路不稳定 NCSI 错误 导致 RMCP+ 消息丢失

:white_check_mark: 综上所述,Close Session failed 是多个异常因素叠加的结果 —— 属于时序敏感型偶发问题


:hammer_and_wrench: 解决方案建议

:white_check_mark: 1. 增加 ipmitool 的会话关闭容错能力(客户端优化)

当前 ipmitool 对会话关闭失败过于敏感。建议:

  • 不将 Close Session failed 视为致命错误,尤其是当主命令成功时。
  • 增加 -f(force)选项或静默关闭模式,允许跳过会话关闭步骤(适用于脚本场景)。
  • 升级到更高版本 ipmitool(如 1.8.18+),已知新版对异常会话处理更健壮。

:white_check_mark: 2. BMC 侧优化建议

优化点 说明
延迟开放 IPMI 外部接口 在所有服务(NC SI、RMCP+、会话管理)完全启动前,拒绝外部连接请求
增加会话管理队列深度 提升瞬时并发处理能力,避免因会话堆积导致关闭失败
优化 NCSI 初始化流程 确保带外网络通道在 IPMI 服务启用前已稳定建立
改进日志可追溯性 rmccplus_protocol.c 中增加会话 ID 和错误上下文,便于定位 rc=-3 具体原因

:white_check_mark: 3. 测试脚本规避策略

在自动化测试中可采取以下方式减少误报:

# 使用 --failbootless 忽略非关键错误,仅关注 exit code
ipmitool -H <ip> -I lanplus -U <u> -P <p> -C 17 chassis status || true

# 或捕获输出并过滤非关键错误行
output=$(ipmitool ... chassis status 2>&1)
echo "$output" | grep -v "Close Session command failed"

:white_check_mark: 结论

项目 内容
问题性质 非功能性缺陷,属 低概率通信异常
影响范围 仅影响会话关闭阶段,不影响主命令执行结果
根本原因 BMC 重启初期,NC SI 不稳定 + RMCP+ 服务负载高,导致 Close Session 请求无响应
解决方向 客户端容错 + BMC 服务初始化顺序优化 + 网络链路稳定性提升

:paperclip: 参考依据

  1. ipmitool 源码逻辑ipmi_close_session_cmd() 在无响应时打印 “Close Session command failed”。
  2. BMC 日志rmccplus_protocol.c: rc = -3 表明 RMCP+ 协议层异常。
  3. NC SI 错误日志ncsi cmd ctrl select package 表明带外网络链路未稳。
  4. 知识库文档 ID 3:指出“带外命令最大支持 5 ~ 15 个会话并发”,超限将被拦截。

建议将此问题归类为 “非阻塞性偶发通信异常”,优先级中等,可在后续版本中通过服务初始化优化解决。

这条打印是 ipmitool 打的,在此命令失败时产生 列出的代码是ipmitool 工具 客户端的代码吗?

是的,列出的代码是工具的代码

能贴一下详细的一键收集日志吗?当前的app日志看可能是网络问题

close session command failed - 20260116165730.tar.gz.txt (8.9 MB)

收到日志,正在分析

用例中发送ipmi命令的时间点是什么呢?是重启过程中就一直发送吗?

没有,是 BMC 起来之后,脚本会例行进行各种信息查询校验,包括各种板卡、属性什么的,chassis status 是其中一个查询项

问题还在进一步分析中