一次诡异的链路断开排查
上周三凌晨两点,生产环境告警:某台存储节点的RDMA链路频繁断开重连。我登录上去,ibstat看到端口状态在ACTIVE和DOWN之间反复横跳,dmesg里全是“ib0: link down”和“ib0: link up”交替出现。最头疼的是,业务进程里ibv_poll_cq返回的错误码是IBV_WC_WR_FLUSH_ERR,但应用层日志里完全看不出触发原因。
这种间歇性故障最恶心——你盯着它的时候它正常,你一转身它就崩。常规手段:ibv_devinfo看设备状态、ibv_rc_pingpong测连通性、甚至抓包看InfiniBand的MAD报文,都只能看到结果,看不到事件触发的瞬间上下文。
后来我想到一个被很多人忽略的工具:ibv_asyncwatch。这玩意儿能实时捕获RDMA设备上报的异步事件,包括端口状态变化、设备错误、内存注册失败等。那次排查,正是靠它抓到了“端口物理层信号丢失”事件,最终定位到是光纤收发器接触不良。
ibv_asyncwatch是什么
简单说,ibv_asyncwatch是libibverbs提供的一个命令行