0. 背景
话说最近有折腾内网设备,升级了新的硬件设备(关于硬件配置参见B站的这个视频)。
这里单说网络的部分。
内网这次换掉了原来的TPLINK 2.5G五口交换机,改为2.5G 8口带SFP端口的交换机,本意是为了插猫棒然后下掉光猫精简设备数量。结果折腾了一番后,发现宽带是EPON的,折腾意义不大还挺贵,后来就放弃用猫棒的想法了。
主机用的是基于RTL8125芯片的PCI-Ex1网卡,这个网卡很常见,不管是小黄鱼还是马云家还是拼夕夕上都是差不多四五十一张,这次买了三张准备升级内网。
系统装的是CentOS9,装系统挂载硬盘什么的一路顺利,以为就装好了,然后拔掉了显卡扔到角落里当服务器去了。
为什么要拔掉显卡呢?
服务器要啥显卡,显卡不用电的吗。哦对了这精粤X99 D4主板很傻缺,不知道哪里的毛病,感觉BIOS有bug,主板上的六个SATA口不能用,插上了就要显卡,否则不能启动,卡D6。不用主板上的SATA口就可以不插显卡启动。奇怪的逻辑,但这不重要,反正我扩展板上的SATA口多,不用就是了。
重要的是试了试感觉没啥异常,就这么着了。
然后……
1. 嗯?
第二天,我发现主机掉线了。
奇怪了啊,咋就掉线了,死机了?
看了看主机,似乎状态正常,没有异常。由于拔掉了显卡,没有办法接显示器,看不到现在的状态。
想了想要不干脆重启吧。
于是按了复位键。
一会儿后DHCP里看到了机器上线,SSH进去后看到一切正常。
然后发现一个奇怪的问题。这台机器每次重启后系统时间都是从2023年2月7日开始计算的。似乎没有记录时间?……但BIOS设置似乎又会保存,奇怪的问题。
2. 嗯?双??
第二天,机器又掉线了。
……奇怪の??
给机器插上键盘,发现硬盘灯亮了下。
所以说系统应该没死机。
于是键盘上盲敲登录账号密码和reboot。
硬盘灯一通狂闪,应该是重启了。过了一会儿,果然上线了。
然后我觉得这个问题好奇怪啊?
SSH进去后ip a
看了一下网络状态,没啥问题啊。看到DHCP释放时间大概是11个小时,猜测了一下,难道是DHCP分配的IP地址到期后没有获得新的地址导致掉线了?
等了十二个小时后,果然机器又掉线了。
这次乖乖地插上显卡和终端设备,方便操作系统,然后重启。
3. 叒??
重启后开始往服务器上拷贝数据库文件,恢复数据库。
发现有问题,SFTP拷贝到20%后就会卡住然后断掉。
以为临时的网络问题,准备SSH里看状态,这时候发现原来连着的SSH终端也掉线了。
跑去控制台那边看,果然没死机,但屏幕上有这样一堆日志:
Feb 27 09:30:49 E5L kernel: NETDEV WATCHDOG: enp8s0 (r8169): transmit queue 0 timed out
Feb 27 09:30:49 E5L kernel: WARNING: CPU: 22 PID: 0 at net/sched/sch_generic.c:525 dev_watchdog+0x1f9/0x200
Feb 27 09:30:49 E5L kernel: Modules linked in: veth(E) xt_nat(E) xt_conntrack(E) xt_MASQUERADE(E) nf_conntrack_netlink(E) xt_addrtype(E) nft_compat(E) br_netfilter(E) bridge(E) stp(E) llc(E) nf_conntrack_netbios_ns(E) nf_conntrack_broadcast(E) nft_fib_inet(E) nft_fib_ipv4(E) nft_fib_ipv6(E) nft_fib(E) nft_reject_inet(E) nf_reject_ipv4(E) nf_reject_ipv6(E) nft_reject(E) nft_ct(E) nft_chain_nat(E) nf_nat(E) nf_conntrack(E) nf_defrag_ipv6(E) nf_defrag_ipv4(E) rfkill(E) overlay(E) ip_set(E) nf_tables(E) nfnetlink(E) intel_rapl_msr(E) intel_rapl_common(E) intel_uncore_frequency(E) intel_uncore_frequency_common(E) x86_pkg_temp_thermal(E) intel_powerclamp(E) coretemp(E) snd_hda_codec_realtek(E) kvm_intel(E) snd_hda_codec_generic(E) ledtrig_audio(E) snd_hda_intel(E) snd_intel_dspcfg(E) snd_hda_codec(E) kvm(E) snd_hda_core(E) snd_hwdep(E) irqbypass(E) snd_pcm(E) rapl(E) vfat(E) intel_cstate(E) iTCO_wdt(E) intel_pmc_bxt(E) fat(E) iTCO_vendor_support(E) gpio_ich(E) snd_timer(E) intel_uncore(E) snd(E) i2c_i801(E)
Feb 27 09:30:49 E5L kernel: pcspkr(E) mxm_wmi(E) lpc_ich(E) i2c_smbus(E) soundcore(E) drm(E) xfs(E) libcrc32c(E) sd_mod(E) sg(E) ahci(E) libahci(E) nvme(E) crct10dif_pclmul(E) crc32_pclmul(E) crc32c_intel(E) polyval_clmulni(E) libata(E) polyval_generic(E) nvme_core(E) r8169(E) ghash_clmulni_intel(E) serio_raw(E) realtek(E) t10_pi(E) wmi(E) fuse(E)
Feb 27 09:30:49 E5L kernel: CPU: 22 PID: 0 Comm: swapper/22 Tainted: G E 6.2.10-1.el9.elrepo.x86_64 #1
Feb 27 09:30:49 E5L kernel: Hardware name: JGINYUE X99 TITANIUM D4/X99 TITANIUM D4, BIOS 5.11 12/06/2022
Feb 27 09:30:49 E5L kernel: RIP: 0010:dev_watchdog+0x1f9/0x200
Feb 27 09:30:49 E5L kernel: Code: 00 e9 40 ff ff ff 48 89 ef c6 05 f7 39 64 01 01 e8 ec d1 f8 ff 44 89 e9 48 89 ee 48 c7 c7 b0 f8 76 88 48 89 c2 e8 d7 25 63 ff <0f> 0b e9 22 ff ff ff 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90
Feb 27 09:30:49 E5L kernel: RSP: 0018:ffffb0b4c0594ea8 EFLAGS: 00010282
Feb 27 09:30:49 E5L kernel: RAX: 0000000000000000 RBX: ffffa00c42494488 RCX: 0000000000000000
Feb 27 09:30:49 E5L kernel: RDX: 0000000000000104 RSI: ffffffff886d644d RDI: 00000000ffffffff
Feb 27 09:30:49 E5L kernel: RBP: ffffa00c42494000 R08: 0000000000000000 R09: 00000000ffff7fff
Feb 27 09:30:49 E5L kernel: R10: ffffb0b4c0594d50 R11: ffffffff891e5908 R12: ffffa00c424943dc
Feb 27 09:30:49 E5L kernel: R13: 0000000000000000 R14: ffffffff87ce6950 R15: ffffb0b4c0594f00
Feb 27 09:30:49 E5L kernel: FS: 0000000000000000(0000) GS:ffffa01b7fd80000(0000) knlGS:0000000000000000
Feb 27 09:30:49 E5L kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
Feb 27 09:30:49 E5L kernel: CR2: 00007f6a6ad4f6e8 CR3: 0000000bdf810003 CR4: 00000000003706e0
Feb 27 09:30:49 E5L kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
Feb 27 09:30:49 E5L kernel: DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
Feb 27 09:30:49 E5L kernel: Call Trace:
Feb 27 09:30:49 E5L kernel: <IRQ>
Feb 27 09:30:49 E5L kernel: ? __pfx_dev_watchdog+0x10/0x10
Feb 27 09:30:49 E5L kernel: call_timer_fn+0x27/0x130
Feb 27 09:30:49 E5L kernel: __run_timers.part.0+0x1ee/0x280
Feb 27 09:30:49 E5L kernel: ? tick_sched_timer+0x71/0x90
Feb 27 09:30:49 E5L kernel: ? _raw_spin_lock_irq+0x19/0x40
Feb 27 09:30:49 E5L kernel: ? __hrtimer_run_queues+0x121/0x2b0
Feb 27 09:30:49 E5L kernel: ? __pfx_read_tsc+0x10/0x10
Feb 27 09:30:49 E5L kernel: run_timer_softirq+0x31/0x70
Feb 27 09:30:49 E5L kernel: __do_softirq+0xf0/0x2ee
Feb 27 09:30:49 E5L kernel: __irq_exit_rcu+0xdb/0x120
Feb 27 09:30:49 E5L kernel: sysvec_apic_timer_interrupt+0xa2/0xd0
Feb 27 09:30:49 E5L kernel: </IRQ>
Feb 27 09:30:49 E5L kernel: <TASK>
Feb 27 09:30:49 E5L kernel: asm_sysvec_apic_timer_interrupt+0x16/0x20
Feb 27 09:30:49 E5L kernel: RIP: 0010:cpuidle_enter_state+0xde/0x410
Feb 27 09:30:49 E5L kernel: Code: 00 00 31 ff e8 f3 4f 7b ff 45 84 ff 74 16 9c 58 0f 1f 40 00 f6 c4 02 0f 85 11 03 00 00 31 ff e8 f8 55 83 ff fb 0f 1f 44 00 00 <45> 85 f6 0f 88 6e 01 00 00 49 63 d6 4c 2b 2c 24 48 8d 04 52 48 8d
Feb 27 09:30:49 E5L kernel: RSP: 0018:ffffb0b4c019be80 EFLAGS: 00000246
Feb 27 09:30:49 E5L kernel: RAX: ffffa01b7fd80000 RBX: ffffd0b4bfb802e8 RCX: 000000000000001f
Feb 27 09:30:49 E5L kernel: RDX: 0000000000000016 RSI: ffffffff886d644d RDI: ffffffff886b1695
Feb 27 09:30:49 E5L kernel: RBP: 0000000000000003 R08: 000004f51ebe7699 R09: 0000000000000018
Feb 27 09:30:49 E5L kernel: R10: 00000000002d747f R11: 00000000001404a9 R12: ffffffff892ae0c0
Feb 27 09:30:49 E5L kernel: R13: 000004f51ebe7699 R14: 0000000000000003 R15: 0000000000000000
Feb 27 09:30:49 E5L kernel: cpuidle_enter+0x29/0x40
Feb 27 09:30:49 E5L kernel: cpuidle_idle_call+0x140/0x1d0
Feb 27 09:30:49 E5L kernel: do_idle+0x7e/0xe0
Feb 27 09:30:49 E5L kernel: cpu_startup_entry+0x19/0x20
Feb 27 09:30:49 E5L kernel: start_secondary+0x112/0x130
Feb 27 09:30:49 E5L kernel: secondary_startup_64_no_verify+0xe5/0xeb
Feb 27 09:30:49 E5L kernel: </TASK>
Feb 27 09:30:49 E5L kernel: ---[ end trace 0000000000000000 ]---
看堆栈信息是网卡的发送队列停止工作了。
之前有遇到过内核导致的网络问题(网桥),所以遇到这个问题的第一时间就想到是不是内核有bug。
用“r8169 transmit queue 0 timed out”做关键字检索,果然在kernel上检索到了几个相关的bug报告,最近的一个是三月份的,影响到的是6.2的内核,而6.1正常。看记录相关的修复应该在6.3里包含了,而我用的正好是6.2.10
这个版本。虽说看讨论这个bug仅和特定的架构(LoongArch)有关,但鉴于堆栈信息完全一致,我还是决定升级试试。
升级到6.3.2后,想着下一次断要十个小时后,我就决定暂时先放着,继续恢复数据库。
上次用SFTP出错了,那这次我换Samba。
结果samba也不太对劲,虽然勉强能拷,但时不时卡住,且速度很慢,才三四十M/S,我这可是2.5G的内网呵。
查了一圈网卡状态和网络状态以及交换机,感觉没啥问题。
于是我决定掏出iperf3
来测试一下网络吞吐。
结果iperf3开始测三秒后,速度掉到了0。
这……
然后主机就掉线了。
4. 内核我就问你背不背这个锅?
有之前的issue做底子,我猜测还是内核的问题。
考虑到6.3是不是真包含了这个patch抑或者这个patch是不是真修复了我不好判断,于是我决定试试6.1版本的内核。
从repo的archive里找到了6.1的内核,手动装上,跑iperf3,涛声依旧。
我陷入了沉思。
所以没准6系列的内核不太行?那我换centos自带的5.14内核吧。
切换到5.14后,还是不行,一跑iperf3就挂。
难道是这网卡和centos不太兼容?
于是想了想,转身拼夕夕上下单了I226的2.5G网卡。
但这网卡到货估计还得两三天。在这之前还能干嘛呢。
查了查记录,这8125芯片的驱动linux内核支持需要从5.10开始,在这之前需要自己编译驱动。
但我试了5.14还不对……
难道是centos里的驱动不太对?我看到有人说Ubuntu里的r8169驱动是他们自己改过的,会不会更好点?
但我现在还能做啥呢?
5. Windows的没问题啊?
想到了另外一台机器,完全同样的硬件配置,装的是win10系统,但是没有这个掉线的问题。
iperf3测速能到1.6Gbits/sec
。
虽说1.6G离我的内网2.5G似乎还有点距离……但起码人家不断啊?
不过话说回来这咋才1.6G啊??
反复调了很多配置后,我发现被人误导了。之前不知道看的哪篇文章,禁用了系统的tcp autotuning功能,导致速度最高只能到1.6G。
使用命令行 netsh interface tcp set global autotuninglevel=normal
修改配置后,速度恢复到了2.3-2.4G/S。
这个选项的状态可以使用 netsh interface tcp show global
这条命令来确认。
6. 嗨……回到原来的问题上来
按理说这么稳定复现且明显的bug,以linux kernel的使用量,绝不会没人发现,对吧?
所以我猜测是否还有兼容性问题?比如这个精粤x99主板是魔改的芯片组,这个网卡是否和这个芯片组以及搭配的centos不太兼容?如果这样说的话,那只能换Windows系统了啊,Windows表现正常啊。
想到这里,我拎出来备用还没上线的另一块同款网卡,重新找了一台迷你主机,测试了起来。
装上了同样的CentOS9系统,进行测试。
虽说速度不达标吧(大概才1.4G/S),但起码不断呀。
这个测试不断,那就说明系统和网卡没问题啊。那说明我的猜测问题不大?
主板,系统,网卡,三个不兼容。那咋办,拆机器前我想了想,要不换个系统?试试Ubuntu?
用Ubuntu的光盘启动了Live系统,apt-get安装了iperf3测试一下,发现虽然控制台没有报错,但其实也会断。
然后我就陷入了沉思。
你说……有没有可能是网卡有问题?……
7. ?。。。
我拆下来网卡,和测试的另一块同款网卡对比了一下,完全一模一样。
换上测试的网卡,测试了一下,速度瞬间恢复到了2.3G/S左右,而且也不断了。
这……??
网卡坏了????
8. 其实也没坏
把这块换下来的网卡换到之前测试的迷你主机上测试了一圈,除了速度慢点(但和之前测试的差不多)外,似乎也没啥问题,并不会断。
所以,我这是见鬼了吗。
对了你说为什么2.5G的网卡跑速度只有1.5G左右?这说来话长……咱下次再说。