我使用运行FreeBSD的PC引擎APU设备作为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的输出
当路由器上的stream量很less时:
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
而当我尝试最大化广域网连接(在这种情况下只有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
我开发了一个使用Realtek RTL8211E phy芯片的电路板,我可以向你保证,它能够以千兆的速度运行:)(实际上是10/100/1000)。 这个phy芯片唯一的问题是,如果它没有使用千兆位接口连接到CPU(例如RGMII)。 我无法find您的路由器在互联网上的PCB布局来检查它。
但是,就像我之前写的那样,听起来更像是一个双工不匹配。
这可能与网卡及其与内核/ CPU之间的path(包括中断处理)有关。 你应该看看validation各种“卸载”设置(对不起,我不熟悉FreeBSDbuild议正确的工具)。 还要查找可以调整的任何其他网卡驱动程序特定的设置,并尝试使用它们。
cpu根本不空闲,一个内核68.7%,另外34.3%的繁忙处理中断不空闲。 用户空间不是内核。
不熟悉openbsd,你可以设置cpu的亲和力,使一个核心进程irq259和其他irq260。 然后看看每个核心是多么忙碌。
经过一段时间的速度testing之后,顶级的“平均负载”如何呢? 它是否达到1?
如果不是CPU,可能是某些较低层次的问题? 我build议检查ethtool或mii-tool是否在两种情况下显示1000FD(有和没有路由器在中间)。 也许你的路由器板强制一些链接设置,也许你有一个双工不匹配的问题?
你能在你的路由器上运行“iperf -s”来检查你的客户端和路由器之间的连接吗?
问候
考虑到CPU不是100%的使用,这个问题成为系统中的其他限制性能的因素。
我敢打赌,以太网芯片没有果汁。 根据问题中的链接,您的主板使用Realtek RTL8111E芯片。 我对这个芯片并没有什么特别的了解,但是我知道并不是所有的以太网卡/芯片都是相同的。 一些简单的使用Google表明Realtek不是一个特别受人尊敬的品牌。
在几年前的testing中,我发现英特尔的“服务器”PCIE卡可以很容易地以线速运行,即使所有的卸载function都被禁用了,但是英特尔的“客户端”PCIE卡却不能。 服务器卡是$ 120,客户卡$ 30。 去搞清楚。
有一件事可能有助于吞吐量,但可能会影响延迟,看看是否启用了中断合并(linux术语 – 不知道如何在freeBSD上configuration)。