Proxmox 和 FreeNAS 之间的 Brocade 200e:所有端口都显示 online,却仍有 Buffer I/O error 和 isp0: Receive Error
我维护一套小型虚拟化环境:两个 Proxmox 6 节点和一个跑 FreeNAS 11.2 的存储目标。之前 HBA 都是直连到存储目标的,跑了好几个月没有出过一次错。后来在中间加了一台二手的 Brocade 200e,为了不用交叉拉线,结果问题就开始了。
- 两个 Proxmox 6 节点,HBA 是 QLogic QLE2462 和 QLE2432
- FreeNAS 11.2 存储目标
- Brocade 200e 交换机,Fabric OS 6.1.0a
- SFP 和 LC 跳线是库存里的旧货,没有任何标识
节点上的日志:
Buffer I/O error on dev dm-5
之后设备不断重置。存储目标那边是命令超时(CTIO7),大约每分钟一次:
isp0: Receive Error
之后存储目标会同时和两个发起端断开,只有重启节点才能恢复。
已经做过的:
- 恢复直连——完全没有报错,说明 HBA、硬盘和存储目标本身都没问题
switchshow显示三个端口都是 online,分区(zoning)很简单,只有一个 zone- 换过跳线,重启过交换机
应该在交换机本身上查什么?switchshow 里的 online 显然在骗我,但该用什么去验证,我还没搞清楚。
Comments 4
你其实已经自己找到答案了:不断增长的 crc_err 和 enc_out,说明链路上的帧在损坏,往上一层就变成了固件超时、设备重置和
isp0: Receive Error。节点上的内核和存储目标都没有问题,它们只是如实反映了自己收到的东西。你已经做的这些,可以这样解读:
sfpshow里那两个端口的接收功率明显偏低——这是把对称的链路互相比较,而不是拿脑子里的「正常值」去套。第三个干净的端口正好是你的基准剩下要做的不多了。跑一下
fabriclog -s,能看到端口是怎么被反复拉起放下的,即使这时候 switchshow 显示的还是 online。然后把可疑端口上的 SFP 和 LC 跳线一起换掉,别只换一个。我遇到过类似的情况就是这样解决的:换掉两个问题端口的模块和跳线,之后在负载下跑了一整天,porterrshow 保持为零,光纤网络也没有再崩溃过。道理很简单:直连的话链路上只有两个连接头,经过交换机就变成了四个,还多了两个模块。一个功率临界的 SFP 或者一根有灰尘的跳线,在直连时还能撑住,换成这条更长的链路就撑不住了。所以 switchshow 里的 online 不是诊断结论,只是「登录成功」这一个事实而已。
switchshow 说明的只有一件事:端口看到了光,并且成功登录到了光纤网络。它对信号质量一无所知,所以在这种情况下相信它是没有意义的。
对三个端口都执行一次
portstatsclear,跑一段负载,然后看porterrshow——重点关注 crc_err 和 enc_out,看它们是不是在增长,具体是哪几个端口在增长。同时对每个端口跑一下sfpshow:接收功率和电压,把各端口之间做个对比会很有用。另外贴一下存储目标断开的那一刻,FreeNAS 那边sysctl dev.isp.0给出的内容。清零了计数器,加了负载,看了结果。情况是这样:两个端口的 crc_err 和 enc_out 成批增长,而且正好和节点上冒出 Buffer I/O error 的时间点吻合,第三个端口一直是零。
同样长度的跳线,这两个端口的
sfpshow接收功率明显比旁边那个端口低。断开的那一刻,sysctl dev.isp.0显示 HBA 在重新初始化,也就是说它是在对中断做出反应,而不是它自己制造了中断。看起来这是物理层的问题,跟 Proxmox 和存储目标都没关系。类似的坑不只出现在 FC 上,所以计数器无论如何都值得看一看。之前遇到过一套组合:Intel X520-2 配 10Gtek 850 nm 的 SR 模块,对端是 Brocade FastIron CX 648S-PoE 配 FCX-2XG 模块和 Brocade 自家的 XFP,中间是五米光纤。
服务器这边正常协商到 10GbE 并能发送,但完全收不到东西,交换机上那个端口一直显示 Up,速率是 None。查过
show media,两端的波长和传输距离也核对过,还试过关闭端口上的中继协商——都没结果,XFP 上的速率也没法固定住。同一根光纤接在 SFP+ 端口上,跑千兆就毫无问题。教训和你这里一模一样:端口显示 Up,不代表帧真的能到对端。