背景
最近发现一个比较坑爹的事情,之前家里联通宽带虽然免费提速到300mbps但一直速度最快跑到270mbps左右,其实是因为Netgear WNDR4300
在OpenWRT
下系统load基本接近1.00,CPU只能跑到这个性能了。所以目前的宽带接入速度已经超过了已有硬件的性能基准。
加上最近联通新上了1Gbps的接入,因此我们的500mbps接入计划再次提上日程~
这里要说明一点,WNDR4300并非虚标性能,虽然没有实际测试,但是应当NAT功能在原装系统下可以跑到近千兆。OpenWRT下,AR9344只能使用MIPS CPU进行基于linux netfilter的NAT功能,实际性能与硬件NAT相差比较大。另外还有一个差别大的地方就是基本上所有的非原厂调教的OpenWRT下,无线性能与原装系统相差会比较大。相比而言,内置的交换机因为是硬件级别支持,所以基本没有性能上的差别。
现有方案
现有的方案是200mbps方案,有线无线都可以跑到这个速度
- 物理接入: 联通EPON光纤接入, 签约带宽200mbps, 后自动提速到300mbps
- 光纤猫: 某宝二手TP-LINK EP-110,克隆了原装的光纤猫的logid
- NAT&防火墙&端口转发: 基于某宝二手Netgear WNDR4300 v1, 千兆路由器,刷入OpenWRT
- 网关主机: 某宝二手J1900无风扇迷你主机, 内置RTL8111网卡,网内机器IPv4与IPv6的网关
- 无线AP: 全新(因为买不到某宝二手)Unifi AP-AC LITE无线AP, 提供两个接入点,方便不同目的使用
实测访问外部网络有线与无线均为270mbps+下行,上行40mbps,家庭内部网络有线上下行990mbps+, 无线上下行600mbps+
方案升级分析
如果要升级到500mbps, 目前瓶颈在于NAT这一环,其余部分性能都超过500mbps的需求。基于MIPS CPU的OpenWRT路由器肯定在性能上是没法用了,因此性能更强的基于x86 CPU的多网口主机(至少两个口)是唯一选择。系统上我依旧选择使用OpenWRT,这样具有较好的配置延续性。
升级选购分析
目前手头有闲置的J1900无风扇迷你主机, 一个Intel J3455CPU的NUC。根据网上搜索的到的信息,单核性能太弱的CPU其实不太适合来当作千兆NAT的机器。某宝看了下双千兆外加J1900或J3455这个级别单核性能的迷你主机,基本上搞下来要700~800以上了,还是略贵啊。我们有没有什么便宜的方案能用上手头的闲置机器呢?结合前段时间给DELL 7070mff
外接显卡的经验,我想到了M.2 A/E
接口转PCI Express x1外接网卡方案。简单搜了下某宝,外接套件需要12v独立供电,价格20~40, 双口千兆网卡即使是Intel i350这样的也只要150~200,看起来价格上很实惠呢~
于是到这一步,选择使用J3455 NUC + M.2转PCIE外接网卡方案。
硬件实际搭建
两件事情,一个是用联通的沃宽APP先购买500mbps的提速包先行试用;另一个是上某宝买东东。大概过了两天,东西都到了,实际开始搭建。这里把转接套件提供的PCIE软排线从SD卡的孔那里引出来,12v供电使用LM2956HVS的模块,把机器电源接口处的19v引出来,调整输出到12v,整体用美纹纸固定到NUC上方,不美观但是实用。大概就是下面这样子
软件安装与测试
这里没有选择直接裸机安装OpenWRT的方案,这有些浪费,也不便于远程管理。因此选择了实际机器安装Debian10, 使用qemu kvm
虚拟化 + pcie passthrough在虚拟机运行OpenWRT。经过了一些参数优化和调整,实测有线600mbps+下行,上行60mbps+, CPU4核最高核占用80%左右,其他核占用50%~60%,基本跑满性能。
经过一段时间的测试和调整,实际遇到了一个很难解决的问题,就是Intel i350-AM2网卡会发生TX hang导致网卡重置,PPPoE重新拨号。实际调整和尝试解决非常消耗时间,我会另开一个文章做介绍。这里概括一下会导致i350 TX hang的要点:
- linux内置驱动可能存在缺陷: 尽量使用Intel官方驱动
- CPU不能及时处理中断: 应对方法是关闭CPU的节电, 设置全速运行并且内核添加nohz=off配置
- 外接PCIE传输不稳定: 增加软排线线屏蔽(贴上锡纸胶带),尽量多的塞入机器内,暴露在外的部分可靠固定不要悬空。另外关闭CPU节电也有帮助,因为CPU频率变化时,会产生高频噪声干扰
最后稳定性测试,此方案依然会偶尔出现Tx hang,因此无法通过。
路在何方
难道我只能去买个双口x86软路由了么? 经过仔细思考,结合查了下PPPoE的拨号流程 发现PPPoE其实不牵扯到日常的频繁二层广播,所以可以安全的插入到交换机上。因此另一个方案在我脑海浮现:单物理网口桥接到多个虚拟网卡方案。
Q: 为何要考虑光猫转出的接口是否存在频繁广播行为?
A: 因为我并没有使用带VLAN划分的管理交换机,都使用的是便宜的非管理交换机,如果把频繁广播行为的设备接入到内网二层,会导致网络性能大大下降。Q: 为何不换个非Intel的网卡试试?
A: 已经换了双口Realtek网卡测试,虽然不会TX hang但是pcie软排线还是会不定时的遭受干扰,导致整个宿主机无响应。。。(感觉还不如只是网卡hang掉。。。)
峰回路转
由于在光猫里我已经单独把上网的VLAN 3961给取消标签了,所以如果接入交换机,其实在网内交换机上连接的任何机器都可以正常拨号。因此NUC实际可以一口复用,在宿主机上把物理网卡加入网桥,虚拟机的virtro网卡一端加入宿主机网桥,另一端在OpenWRT内使用macvlan虚拟出多个网卡,分别用作PPPoE,内网LAN以及其他VLAN。
这样一来,这个NUC的物理网卡基本上就是跑对称流量了,实际测试依然是有线600mbps+下行,上行60mbps+, CPU4核最高核占用80%左右,其他核占用50%~60%,基本跑满性能。经过多天测试,运行稳定没有问题。
最终方案
最终方案确定,NAT主机采用宿主机单口桥接到OpenWRT虚拟机多虚拟网卡的方案。于是500mbps总体方案如下
- 物理接入: 联通EPON光纤接入, 签约带宽500mbps
- 光纤猫: 某宝二手TP-LINK EP-110,克隆了原装的光纤猫的logid
- NAT&防火墙&端口转发: 基于Intel nuc, J3455 CPU, 8G RAM, 64G SSD, 宿主机单口桥接到OpenWRT虚拟机,虚拟机内使用macvlan创建多个vth, 分别用于WAN区域和LAN区域
- 网关主机: 某宝二手J1900无风扇迷你主机, 内置RTL8111网卡,网内机器IPv4与IPv6的网关
- 无线AP: 全新(因为买不到某宝二手)Unifi AP-AC LITE无线AP, 提供两个接入点,方便不同目的使用
实测访问外网(Speedtest.net测速)有线600mbps+下行,上行60mbps+, 无线最快500mbps+下行,上行60mbps+,访问家庭内部网络有线上下行990mbps+, 无线上下行600mbps+
后记
这次改造中途折腾Intel i350网卡Tx hang的问题搞了三四天,真的是筋疲力尽。所以不愿意折腾的同学最好还是不要图便宜,老老实实花钱买软路由,用别人验证过的方案。不过中途倒是了解了不少关于PCIE以及网卡驱动,内核中断处理,电源管理,linux时钟等信息,还是很有收获的。
参考链接
- 基于i350的网卡调优
- 关闭NUC的 Native ACPI OS PCIe Support
- 更换自带的igb驱动5.4.0-k到Intel官方的最新稳定版igb-5.3.5.42
- 关闭网络启动 bootutil64 -ALL -FD
- 不支持硬件多队列的rtl8111网卡开启rx软队列
- RSS
- RPS
- RFS
- 禁用除了C0之外其他的状态
- 测试电源管理对时延敏感应用的影响
- 如何在VM内使用时钟
- RHEL6 虚拟化调优指南
- NOHZ=ON对内核计时器的影响
- linux kernel关于NO_HZ的文档
- 关闭Specture等安全选项
- IOMMU
- 如何配置iommu
- IOMMU Groups
- redhat的passthrough参考
- Arch的passthrough参考
- kernel module blacklist不生效问题: 需要更新initramfs 链接2
- libvirtd CPU需要配置为passthrouth模式