Netgate即将发布pfSense CE 2.8和pfSense plus 25.03版本,在新版本中,通过引入新的if_pppoe驱动程序,大幅度提高了PPPoE的连接速度。
自2013年发布pfSense ce 2.1.0年以来,pfSense多年来一直依赖mpd5和netgraph来处理PPPoE WAN连接。虽然这种设置有助于建立与 PPPoE 服务的连接,但现在千兆网络的需求暴露了底层架构的局限性。随着运营商提供高达0Gbps的PPPoE服务,WAN连接的性能将会非常重要。在官方的这篇博客文章中,深入探讨了 Netgraph达不到要求的原因,并就新的if_pppoe 驱动如何解决这些问题介绍了实现期望的技术细节。
mpd5
多链路PPP守护进程(mpd5)利用Netgraph,这是一个模块化的FreeBSD内核框架,旨在灵活地实现网络功能。Netgraph的优势在于其多功能性——它支持桥接、PPP、GIF隧道、NAT、Netflow等各种操作,并且所有这些操作都可以在任意配置中进行组合。然而,这种模块化是有代价的。Netgraph的设计需要对模块连接进行大量的验证、管理引用计数器以及处理锁。在20世纪90年代,DSL连接的速度达到数十兆比特,并且采用单核CPU,这种开销是可以承受的。但随着光纤连接将吞吐量推向数千兆比特的范围,以及多核CPU成为常态,Netgraph固有的低效率成为了瓶颈。
存在的问题
Netgraph的模块化架构虽然灵活,但却牺牲了性能。为了支持模块间任意的连接图,每个数据包都需要持续验证和同步,这会导致延迟并限制可扩展性。在高吞吐量环境中,这种开销会严重影响 PPPoE 的性能,因此显然需要一种新的方法。
新的驱动
为了解决这些缺点,Netgate为pfSense引入了一个新的if_pppoe驱动程序。该驱动程序是专门针对PPPoE的简化实施。通过缩小范围,if_pppoe 消除了Netgraph 模块化的开销和单线程特性,从而实现了显著的性能提升,尤其是在多核环境中。
if_pppoe 的主要特点
- 多核优化:与Netgraph不同,if_pppoe旨在有效利用多个CPU内核。它使用接收方缩放 (RSS) 根据协议、源/目标地址和端口号在内核之间分配数据包。这可确保单个TCP流保留在一个核心上,从而最大限度地减少无序数据包,而其他核心则处理并发流。
- 简化的架构:通过只关注PPPoE,if_pppoe避免了支持任意网络功能的复杂性。确保更精简、更快速的实施。
- 并发数据包处理:该驱动程序允许跨多个CPU在接收和发送方向上同时处理数据包。
测试结果
为了对比新旧版本之前的区别,官方进行了对比测试。
PPPoE服务器使用运行Linux内核的Sapphire Rapids系统。
被测设备:Netgate 6100,L3 转发,pf 禁用,ix0/ix1 链路速度:10Gbps
流量生成器:Sapphire Rapids、Linux PPPoE 内核模式服务器
E810 NIC1、端口 0、VF1、可信 VF、内核命名空间 (ns1)、iperf3 客户端
E810 NIC2、端口 0、VF 1、受信任的 VF、Kennel 命名空间 (ns2)、iperf3 服务器
链接速度:100Gbps
测试持续时间:60 秒
下面是测试数据对比,可见提升幅度非常大。
PPPoE测试 | 最小下载 | 最小上传 | 最大下载 | 最大上传 |
mpd5 1 流 | 2.62 | 3.23 | 4.56 | 3.84 |
mpd5 4 流 | 5.01 | 3.71 | 6.66 | 4.15 |
if_pppoe 1 流 | 6.18 | 4.59 | 6.38 | 4.94 |
if_pppoe 4 流 | 8.18 | 7.96 | 9.01 | 8.24 |
如何使用
新版if_pppoe内核驱动并非默认选项,需要手动启用才能正常使用。转到系统>高级选项>网络设置,选中启用,并重启防火墙后才生效。