关于 PVE 主机网口不断掉线问题的处理
使用一台旧笔记本搭了个 PVE,然后里面装了 openwrt / windows10 / freebsd / 黑群晖等一堆乱七八糟的东西。某天在里面倒腾数据,估计也就几十个 GB 吧,刚开始还没啥事,后面慢慢发现从外网 rdp 进去的 windows10 时不时就断开一下。以为是网络问题,没有在意。但后面越来越频繁,几乎每几分钟就这么来一下。
然后就开始了冗长的排查过程……
1、开始以为是公网不稳定,但发现 er-x 没有断网的情况。adsl 公网 IP 也没有换。所以应该不是接入网络的问题;
2、查 er-x 的日志,发现有如下内容:
Link Status Changed - Port2 Link Down Link Status Changed - Port2 Link UP
每次从 Down 到 UP 都是 3 秒的样子。是不是 er-x 有问题呀?就重启了下它,问题没有解决。Port2 端口有问题?把上面的线换到 Port3,日志变成了 Port3 Down&UP 了。擦。Port2 的接入设备问题。
3、Port2 接入的正是装了 pve 的那台旧笔记本。在管理界面没看到什么异常,于是 ssh 进去看下系统日志。日志中也不断出现类似:Detected Hardware Unit Hang 以及
vmbr0: port 1(enp0s25) entered disabled state e1000e 0000:00:19.0 enp0s25: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx vmbr0: port 1(enp0s25) entered blocking state vmbr0: port 1(enp0s25) entered forwarding state
等的提示。
啥情况……这网口为啥不断的禁用又启用的。
4、去网上搜了下,没啥头绪。有人说可能是内网有环路。考虑到 openwrt 开了旁路由,然后在 er-x 和 openwrt 里面加了很多指定的 Static host name,是不是有冲突啥的,就关掉一些服务,把网络结构搞简单些。然后再试,仍然没有改善。
5、这 pve 网络中断的问题比较奇怪,有一阵子不停出现,有一阵子半天不会。解决问题都想了不少办法。
6、最终仍然定位是 PVE 自身的问题。又 Google 查了下。貌似也有人出现类似问题,大部分人都提到 TCP checksum offload 这个。并建议关掉 checksum offload,反正也折腾这么久了,就试试吧。先在 pve 里面安装 ethtool 工具,然后再运行
ethtool -K enp0s25 tx off rx off
然后再仔细观察,从外网不断 tcping windows10 的 rdp 端口,然后再 tail -f er-x 和 pve 的系统日志。过了大半个小时,貌似问题解决了。没有再出现网络中断的问题了。看来确实是这个问题了。
那么就再把这个命令加入网络启动项中去吧:
more /etc/network/if-up.d/ethtool_co
#!/bin/sh ethtool -K enp0s25 tx off rx off
为 /etc/network/if-up.d/ethtool_co 加上可执行权限。
至此,问题终于解决了……
再展开一下,根据查询得到的资料,这个问题与 PVE 虚拟机中的网卡选型很有关系。如果使用 Virtio 虚拟化,就可能会有问题。改为 E1000 的话,就好一些。
但带来的问题是:因为 Virtio 是半虚拟化,E1000 是全虚拟化。所以从 Virtio 改为 E1000 会带来 CPU 占用率增加的问题。但也好过网络时不时断一下了。就先这么着吧。