路由器限制网络性能,但其 CPU 负载并非 100%

路由器限制网络性能,但其 CPU 负载并非 100%

我正在使用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。它将为你提供完整的千兆吞吐量。

相关内容