Netgate 即将发布 pfSense CE 2.8 和 pfSense plus 25.03 版本,新版本中通过引入全新的 if_pppoe 驱动程序,大幅提升了 PPPoE 的连接吞吐性能。
自 2013 年发布 pfSense CE 2.1.0 以来,pfSense 一直依赖 mpd5 与 netgraph 来处理 PPPoE WAN 连接。这套架构虽然成功地建立了 PPPoE 会话,但在千兆光纤逐渐普及的今天,底层架构的性能瓶颈已暴露无遗。当运营商开始提供高达 10Gbps 的 PPPoE 服务时,WAN 连接的性能就成了关键。在官方的博客文章中,详细剖析了 netgraph 无法满足高吞吐要求的原因,并阐述了新的 if_pppoe 驱动如何解决这些问题。
mpd5 与 netgraph 的局限
多链路 PPP 守护进程(mpd5)基于 netgraph 运行。netgraph 是一个模块化的 FreeBSD 内核框架,能够灵活实现桥接、PPP、GIF 隧道、NAT、Netflow 等多种网络功能,并可任意组合。但这种模块化是有代价的:netgraph 的设计需要不断验证模块之间的连接、管理引用计数以及处理锁机制。在 20 世纪 90 年代,DSL 连接仅数十兆比特,且都是单核 CPU,这些开销尚可接受。而如今,光纤将吞吐量推向千兆乃至万兆级别,多核 CPU 也已成为常态,netgraph 固有的效率问题就变成了瓶颈。
netgraph 的模块化架构虽然灵活,却牺牲了性能。每处理一个数据包,都要为维持任意的模块连接图而进行持续的验证与同步,这会引入延迟并严重限制可扩展性。在高吞吐环境下,这些开销足以拖垮 PPPoE 性能,因此必须采用全新的方法。
新驱动 if_pppoe
为解决这些弊病,Netgate 为 pfSense 引入了专用的 if_pppoe 驱动程序。它是专门针对 PPPoE 情景的简化实现。通过聚焦单一职责,if_pppoe 彻底消除了 netgraph 的模块化开销和单线程限制,从而在多核环境中带来了显著的性能飞跃。
if_pppoe 的主要特性:
- 多核优化:与 netgraph 不同,
if_pppoe能够高效利用多个 CPU 核心。它使用接收方缩放(RSS)根据协议、源/目的地址和端口号在内核之间分摊数据包处理。这样可确保单个 TCP 流始终固定在一个核心上,最大程度地减少乱序数据包,而其他核心则并发处理不同的流。 - 简化的架构:专注于 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,VF1,受信任 VF,内核命名空间 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 内核驱动并非默认选项,需要手动启用才能生效。进入 系统 > 高级选项 > 网络设置,勾选相应选项并重启防火墙后即可生效。

觉得内容不错?我要