一个网卡多通道没打开导致的诡异故障

背景

某公有云 VPC 环境下的云主机,发现之间有一个非常诡异的问题,就是从 A 到 B ping 不通,但是只要从 B ping 一下 A,发现 B ping A 只要一通,原来的从 A ping 到 B 又都马上通了。

现象

听包也能明显说明这一点:只要有包从 B 到 A,那么从 A 到 B 马上就通,否则,从 A 到 B,也许永远都不会通!

原因

最终发现是因为在 B 上的网卡的多队列支持没有打开,

1
ethtool -l eth0;

显示网络设备 eth0 的 Combined 预设的是 4,但是当前设置的却只是 1。

1
ethtool -L eth0 combined 4;

之后呢,问题解决。接着发现最直接的原因是因为我们禁掉了一个公有云这边自己搞得一个自启动的服务,那个服务里会去调整网卡的多队列支持。而且为什么要这么一个服务呢,我猜想是因为这个网卡的队列数其实是 libvirtd 虚拟出来的,这个应该是可以跟虚拟机购买的 CPU 核数相适应的,所以一旦服务器升级 CPU,这个多队列的数目马上就会不一样,所以在启动过程中放一个自动调整的步骤,是非常好的策略。

需要注意的是:执行这条命令时最好在控制台登录操作,或者从另外的网卡连上去做操作。因为这个操作会导致被操作的网络设备闪断一下(类似于先 ifdown 再 ifup)