用户 space 桥接 - Linux 与 FreeBSD

User space bridging - Linux vs. FreeBSD

背景:

我正在努力将 parsing/manipulation 程序包从 FreeBSD 移植到 Linux(特别是 Debian - jessie)。该程序在两个物理接口之间实现双向桥接,同时在 TX 操作之前执行 parsing/manipulation。

在 FreeBSD 中,此应用程序使用 Pcap RX/TX。在 Linux 中,到目前为止,我已经使用 Pcap、PACKET_MMAP(使用 TPACKET_V2)和 Vanilla PF_RING.

进行了测试

测试结果:

使用相同的硬件和实验室环境,我从使用 iperf 执行的多项测试中观察到以下(近似)吞吐量结果:

想法和问题:

Debian 用户 space 速度对我来说似乎很荒谬。它们无法使用 - 我怀疑我遗漏了什么。是否有我需要启用的系统选项("go fast",哈哈)?

或者这就是 Linux 用户 space 桥接的情况?

编辑/更新

我一直怀疑存在影响 Debian 测试的管理限制。我正在搜索系统文档(某物/任何东西)但无济于事。关于什么可能限制这一点的任何想法?

晦涩的问题找到晦涩的答案...

经过大量研究,我发现 "problems" 和 Linux 在这种情况下实际上是优化的结果。显然,默认情况下,系统正在针对大的持续负载进行优化(因此 YMMV 具有以下 "fix")。

我通过使用 ethtool 调整我的两个桥接接口的优化解决了速度问题并发现与 FreeBSD 系统相同的吞吐量:

ethtool -K eth1 gso off gro off tso off ufo off lro off

在两个接口上进行上述操作后,PF_RING 和 PACKET_MMAP 达到了内核桥接速度(这是我的测试实验室的最大速度)并且 Pcap 测试结果约为 300Mb/s。