4、监控工具集介绍:ibdiagnet、ibstatus、ibstat、perfquery、saquery等工具的功能与用法

说实话,刚接触 InfiniBand 网络运维那会儿,我面对着一堆命令行工具,心里是有点懵的。每个工具名字都挺像,但干的活完全不一样。今天我就把这些常用的监控工具掰开揉碎了讲给你听。你想想看,要是连工具都认不全,出了问题怎么定位?

4.1 ibstatus —— 看一眼端口状态

这是我最常用的工具,没有之一。它简单到令人发指,但关键时刻特别管用。

# 查看所有 IB 端口状态
ibstatus

# 查看指定端口
ibstatus mlx5_0

输出大概长这样:

Infiniband device 'mlx5_0' port 1 status:
    default gid:     fe80:0000:0000:0000:ec0d:9a03:0023:4567
    base lid:        0x2
    sm lid:          0x1
    state:           4: ACTIVE
    phys state:      5: LinkUp
    rate:            100 Gb/sec (4X EDR)
    link_layer:      InfiniBand

我个人习惯,登录一台新机器后,第一件事就是跑 ibstatus。为什么?因为我要确认链路是不是真的起来了。你看那个 state: 4: ACTIVEphys state: 5: LinkUp,这两个必须同时出现才算正常。

小技巧: 如果看到 state 是 3(INIT)或者 2(DOWN),别慌。先检查一下线缆是不是松了,或者对端设备是不是关机了。我在项目中遇到过好几次,其实就是机房运维不小心踢到了光纤。

4.2 ibstat —— 比 ibstatus 更细一点

ibstatibstatus 名字很像,但侧重点不同。ibstat 会给出更底层的硬件信息,比如固件版本、硬件版本这些。

# 查看所有 IB 设备详细信息
ibstat

# 查看指定设备
ibstat mlx5_0

输出示例:

CA 'mlx5_0'
    CA type: MT4123
    Number of ports: 1
    Firmware version: 16.28.2006
    Hardware version: 0
    Node GUID: 0xec0d9a0300234567
    System image GUID: 0xec0d9a0300234567
    Port 1:
        State: Active
        Physical state: LinkUp
        Rate: 100
        Base lid: 2
        LMC: 0
        SM lid: 1
        Capability mask: 0x2651e84a
        Port GUID: 0xec0d9a0300234567
        Link layer: InfiniBand

你看,这里多了 Firmware versionHardware version。嗯,这里要注意,固件版本不一致有时候会导致莫名其妙的兼容性问题。我曾经排查过一个性能问题,折腾了两天,最后发现是两台机器的固件版本差了三个大版本。

避坑指南: 升级固件前,一定要用 ibstat 确认当前版本。我曾经手滑把固件刷错了,导致整台机器离线了半小时。从那以后,我每次升级前都会截图保存。

4.3 ibdiagnet —— 网络诊断的瑞士军刀

这个工具厉害了。如果说 ibstatus 是看单个端口,那 ibdiagnet 就是看整个网络拓扑。它能扫描整个 IB 子网,发现所有设备、链路,还能检查有没有配置错误。

# 基本用法,扫描整个网络
ibdiagnet

# 只检查链路错误
ibdiagnet -lw 4x -ls 100 -r 10

# 输出到指定目录
ibdiagnet -o /tmp/ib_diag

运行完后,它会生成一堆文件:

文件名 内容说明
ibdiagnet.fdbs 转发数据库,记录了数据包怎么走
ibdiagnet.links 所有链路的详细信息
ibdiagnet.nodes 所有节点的信息
ibdiagnet.log 诊断日志,重点关注 WARNING 和 ERROR

我个人觉得,ibdiagnet 最牛的地方是它能发现「隐形问题」。比如两条链路明明都显示 Active,但实际带宽只有一半。跑一遍 ibdiagnet,它会告诉你哪条链路的信号质量不行。

核心用法: 每次网络变更后,比如新加了一台机器或者换了线缆,我都会跑一遍 ibdiagnet。确保整个拓扑是健康的,没有出现环路或者孤立节点。

4.4 perfquery —— 性能计数器查询

这个工具是专门用来查性能计数器的。IB 网卡内部有很多硬件计数器,记录了发送/接收的包数量、错误数量、CRC 错误等等。

# 查询本地端口的所有计数器
perfquery

# 查询指定端口的计数器
perfquery -p 1 mlx5_0

# 查询远程端口的计数器(需要知道 LID)
perfquery -l 0x2

输出示例:

# Port counters: (lid 2, port 1)
SymbolErrorCounter: 0
LinkErrorRecoveryCounter: 0
LinkDownedCounter: 0
PortRcvErrors: 0
PortRcvRemotePhysicalErrors: 0
PortRcvSwitchRelayErrors: 0
PortXmitDiscards: 0
PortXmitConstraintErrors: 0
PortRcvConstraintErrors: 0
LocalLinkIntegrityErrors: 0
ExcessiveBufferOverrunErrors: 0
VL15Dropped: 0
PortXmitData: 1234567890
PortRcvData: 987654321
PortXmitPkts: 1234567
PortRcvPkts: 987654
PortXmitWait: 0

你想想看,这些计数器就是网卡的「体检报告」。如果 SymbolErrorCounter 一直在涨,说明链路信号质量有问题。如果 PortRcvErrors 在涨,可能是对端网卡有问题或者线缆坏了。

实战经验: 我一般会写个脚本,每隔 5 分钟跑一次 perfquery,把关键计数器记录下来。一旦发现某个计数器持续增长,就说明有问题了。比等到业务报障再排查要主动得多。

4.5 saquery —— 子网管理器查询

这个工具是用来跟子网管理器(SM)对话的。SM 是整个 IB 网络的大脑,它知道所有设备的位置和路由信息。saquery 就是用来查这些信息的。

# 查询所有节点
saquery

# 查询所有链路
saquery -l

# 查询指定 GUID 的节点
saquery -g 0xec0d9a0300234567

# 查询所有多播组
saquery -m

输出示例(查询节点):

# SA query: NodeRecord
# 1 node(s) found
NodeRecord:
    EndPort: LID 2, port 1
    NodeGUID: 0xec0d9a0300234567
    PortGUID: 0xec0d9a0300234567
    NodeType: 1 (Channel Adapter)
    NumPorts: 1
    ClassPortInfo: ...

说白了,saquery 就是让你看看 SM 眼里这个网络长什么样。如果 SM 没发现某台机器,那这台机器在网络上就是「隐身」的。

注意: 如果 saquery 查不到某台机器,但 ibstatus 显示端口是 Active,那问题大概率出在 SM 配置上。我曾经遇到过,新加的机器自己能看到端口起来了,但 SM 没把它加进路由表,结果谁也访问不了它。

4.6 工具选择指南

这么多工具,到底什么时候用哪个?我给你总结一下:

场景 推荐工具 原因
快速检查本机端口 ibstatus 简单直接,一眼看出状态
查看硬件详细信息 ibstat 固件版本、硬件版本都有
全网拓扑诊断 ibdiagnet 能发现隐藏问题
排查链路质量 perfquery 硬件计数器,数据说话
查询 SM 信息 saquery 看 SM 怎么看待网络
我的习惯: 日常巡检用 ibstatus + perfquery 就够了。每周做一次 ibdiagnet 全面扫描。遇到故障时,先用 ibstatus 确认本机,再用 saquery 确认 SM 视角,最后用 perfquery 查计数器。这套流程帮我解决过不少疑难杂症。

好了,这些工具你挨个试一遍,基本就能应付日常的 IB 网络监控了。记住,工具是死的,人是活的。关键是要理解每个工具能告诉你什么信息,以及这些信息背后意味着什么。


公众号:蓝海资料掘金营,微信deep3321