我正在使用PC 引擎 APU运行 FreeBSD 的设备作为 NAT 路由器。设置非常常见:一个 WAN 连接和一个 LAN 连接。
理论上,WAN 连接为 800/40 Mbit/s,LAN 连接为 1/1 Gbit/s。实际上,路由器通过千兆以太网连接到调制解调器 (WAN) 和 Netgear 交换机 (LAN)。
如果我将一台快速 PC 直接插入 WAN 连接(调制解调器),实际下载速度可以达到约 700 MBit/s。但如果路由器位于两者之间,性能会受到严重影响,下载速度永远不会超过 350 MBit/s。
这可以很容易地解释为路由器功能不够强大。
问题是,我试图看看发生了什么,当尝试最大化连接(实际测量的带宽为 350 MBit/s)时,路由器的 CPU 大约有 30% 的时间处于空闲状态。
我理解这意味着 CPU 不是瓶颈。但那又是什么呢?有没有办法更准确地诊断路由器实际上在做什么,以及为什么它只以一半的容量运行?
为了使我的问题更清楚,这里有一些额外的细节。
首先,我们来直观地看一下这个问题:
然后作为参考,输出top -S -C -H -P -s1 -ocpu
当路由器上的流量很少时:
last pid: 14077; load averages: 0.00, 0.00, 0.00 up 0+18:13:58 12:02:53
118 processes: 3 running, 98 sleeping, 17 waiting
CPU 0: 0.0% user, 0.0% nice, 0.8% system, 0.0% interrupt, 99.2% idle
CPU 1: 0.0% user, 0.0% nice, 0.8% system, 0.0% interrupt, 99.2% idle
Mem: 16M Active, 89M Inact, 130M Wired, 497M Buf, 3678M Free
Swap: 8192M Total, 8192M Free
PID USERNAME PRI NICE SIZE RES STATE C TIME CPU COMMAND
11 root 155 ki31 0K 32K CPU1 1 18.0H 100.00% idle{idle: cpu1}
11 root 155 ki31 0K 32K RUN 0 18.0H 100.00% idle{idle: cpu0}
14077 root 20 0 21996K 3120K CPU0 0 0:00 0.10% top
12 root -92 - 0K 272K WAIT 1 5:22 0.00% intr{irq259: re0
12 root -92 - 0K 272K WAIT 0 4:21 0.00% intr{irq260: re1
9 root -16 ki-1 0K 16K pollid 0 1:51 0.00% idlepoll
12 root -60 - 0K 272K WAIT 0 1:40 0.00% intr{swi4: clock
0 root -16 0 0K 160K swapin 1 0:37 0.00% kernel{swapper}
5 root -16 - 0K 16K pftm 0 0:31 0.00% pf purge
24147 root 20 0 12464K 2176K select 0 0:25 0.00% apinger
11846 root 52 20 17144K 2692K wait 1 0:12 0.00% sh
52774 root 20 0 28172K 18060K select 1 0:10 0.00% ntpd{ntpd}
15 root -16 - 0K 16K - 0 0:09 0.00% rand_harvestq
87531 dhcpd 20 0 24820K 13576K select 1 0:08 0.00% dhcpd
44974 unbound 20 0 47020K 19840K kqread 0 0:08 0.00% unbound{unbound}
20 root 16 - 0K 16K syncer 0 0:05 0.00% syncer
当我尝试最大化 WAN 连接时(在这种情况下只有 318 MBit/s):
last pid: 41402; load averages: 0.02, 0.01, 0.00 up 0+18:15:40 12:04:35
118 processes: 4 running, 98 sleeping, 16 waiting
CPU 0: 0.0% user, 0.0% nice, 0.7% system, 34.3% interrupt, 64.9% idle
CPU 1: 0.0% user, 0.0% nice, 0.0% system, 68.7% interrupt, 31.3% idle
Mem: 16M Active, 89M Inact, 130M Wired, 497M Buf, 3678M Free
Swap: 8192M Total, 8192M Free
PID USERNAME PRI NICE SIZE RES STATE C TIME CPU COMMAND
11 root 155 ki31 0K 32K CPU0 0 18.0H 82.86% idle{idle: cpu0}
11 root 155 ki31 0K 32K RUN 1 18.1H 69.87% idle{idle: cpu1}
12 root -92 - 0K 272K WAIT 1 5:27 32.86% intr{irq259: re0
12 root -92 - 0K 272K CPU0 0 4:23 17.19% intr{irq260: re1
14077 root 20 0 21996K 3232K CPU0 0 0:01 0.10% top
9 root -16 ki-1 0K 16K pollid 0 1:51 0.00% idlepoll
12 root -60 - 0K 272K WAIT 0 1:40 0.00% intr{swi4: clock
0 root -16 0 0K 160K swapin 0 0:37 0.00% kernel{swapper}
5 root -16 - 0K 16K pftm 1 0:31 0.00% pf purge
24147 root 20 0 12464K 2176K select 0 0:25 0.00% apinger
11846 root 52 20 17144K 2692K wait 0 0:12 0.00% sh
52774 root 20 0 28172K 18060K select 1 0:10 0.00% ntpd{ntpd}
15 root -16 - 0K 16K - 0 0:09 0.00% rand_harvestq
87531 dhcpd 20 0 24820K 13576K select 1 0:08 0.00% dhcpd
44974 unbound 20 0 47020K 19840K kqread 1 0:08 0.00% unbound{unbound}
20 root 16 - 0K 16K syncer 0 0:05 0.00% syncer
答案1
我开发了一块使用 Realtek RTL8211E phy 芯片的主板,我可以向你保证,它能够以千兆速度运行 :)(实际上是 10/100/1000)。这个 phy 芯片的唯一问题是如果它没有使用千兆接口(例如 RGMII)连接到 CPU。我在互联网上找不到你的路由器的 PCB 布局来检查它。
但是,就像我之前写的那样,这听起来更像是双工不匹配。
答案2
它可能与网卡以及它们与内核/CPU 之间的路径(包括中断处理)有关。您应该查看验证各种“卸载”设置(抱歉,我对 FreeBSD 不够熟悉,无法推荐合适的工具)。还要查找任何其他可以调整的网卡驱动程序特定设置,并尝试使用它们。
答案3
CPU 根本没有空闲,一个核心 68.7% 其他 34.3% 忙于处理中断,没有空闲。用户空间空闲,而不是内核。
不熟悉 openbsd,能否设置 cpu affinity,让一个核心处理 irq259,另一个核心处理 irq260。然后查看每个核心的繁忙程度。
答案4
这是一个相当老的话题,但无论如何我还是想贡献一份力量。你的情况中的瓶颈是 CPU。此 CPU 有 4 个核心,您可能正在最大化其中一个核心,并且 openBSD 大概使用单线程进行路由。
我已经在几种操作系统上对 APU 系统进行了吞吐量测试。BSD 和 Linux 之间的结果有所不同。
基于 BSD 的操作系统(OpenBSD、pfSense 等)在 APU 上的最大速度为 622Mbit/s,而基于 Linux 的系统(IPFire、DD-wrt 等)可轻松处理 1Gbit。
以下是有关所执行基准测试的更多详细信息:https://teklager.se/en/knowledge-base/apu2c0-ipfire-throughput-test-much-faster-pfsense/
以下是 BSD 的吞吐量测试:https://teklager.se/en/knowledge-base/apu2c0-pfsense-network-throughput-test/
如果你不打算使用 OpenBSD,可以尝试 IPFire。它将为你提供完整的千兆吞吐量。