通常这些MIPS架构的路由器CPU的主频,配套的内存等都大大小于主流的消费级X86 CPU,但为什么他们的网络吞吐量指标还远优于X86?

(这个文章从我的zhihu转回来的,稍微修改了下,然后我发现Mikrotik竟然暗改自己的跑分数据…)

有很多朋友都会好奇这个问题,家用小型路由器或者光猫,看CPU都很弱鸡,甚至可能都打不过现在手机SoC的主频,但是吞吐量却比某些x86的软路由要高?(特指4核Atom弱鸡)

MIPS真的是CPU快吗?

简单来讲,MIPS SoC 之所以比软路由快,是因为内部有专门的电路(ASIC)在里面。例如:

这是MikroTik (即ROS的厂商)的一款400CNY的路由器,它的SoC是联发科MT7621A. 是一个 32位双核 0.88GHz 的MIPS Soc.

Specifications如上图, 可以看到明确表明了SoC内部有Network Accelerator(网络加速器) 可以提供 2Gbps 性能的 IPv4/v6 路由, NAT 等功能的加速. 这部分就是ASIC实现的硬件路由功能。

那么,这个巴掌大的路由器的小包性能(64字节的数据包的每秒处理能力)如何呢?

MikroTik官方给出的数据是 601Kpps (64bytes).

没有对比就没有伤害,那么下面这个是同样MikroTik的一款万兆交换机。CRS317-1G-16S+RM, 这机器价格2000多CNY。比上面的路由器贵多了吧?

它的SoC是Marvell 98DX8216 . 是一个32位双核0.8GHz ARM. 乍一看跟上面的路由器的SoC性能没差多少.

但是, 重点来了, 但是, 他是个交换芯片,尽管它甚至也有路由部分的硬件实现. 性能就变成了这个样子.

毕竟是万兆交换机, 交换性能爆炸, 小包能力达到了239,583.3Kpps. 但是, 路由性能只有315pps, 直接打对折(甚至Marvell这个交换芯片其实是有路由加速设计的…) 这个数据连几百块的家用带wifi的路由器都拼不过(家用路由器一般小包性能也在600kpps以上).

那么x86就没戏了吗?

回到x86, x86实现同样是软实现, 最简单就是把 Linux 的 IPv4 forward 一开, 就能跨子网路由通信了. 但是性能惨不忍睹. 原因如同上面一样,这是软件实现。而且是未经优化的软件实现。

是的,一个IPv4包要forwarding, linux下要经过这么多的流程…

那么,想扔x86发挥他的性能该怎么办呢?

一般的优化思路是这样的:

  • DPDK, 思路是用户态网络栈, 直接减少数据进出内核所带来的开销. 同时搭配网卡的RDMA, CPU bypass 等特性, 进一步降低CPU消耗(其实原理还是利用硬件实现). 最后如果应用面比较窄, 还可以对网络栈做裁剪, 以达到更好的性能. 但我觉得对于路由意义不大, 因为路由本身可以完全在内核完成, 只要本机用户态不需要数据包, 就没必要. 放内核态跟放用户态没太大差别. 可能精简网络栈带来的提升会更高.

  • 显卡加速, 有那么几个显卡路由交换加速的项目, 但目前都不是特别流行. 但这也不算x86了.

问题的核心

路由这个场景其实很简单, 从编程的角度来讲, 就是修改二进制的IP数据包的包头过程. 那么, 如果在x86上能把这个过程变快, x86的路由性能肯定就会变好了.

好的, 那么我们可以得出最佳方案是这样的:

  • 可以利用AVX指令集, 网络栈部分的代码做优化. 这样可以达到更高的效率.
  • 多核心很明显更适合这种工作场景, 高主频反而没什么太大作用. 毕竟IP是封包化的, 并行处理效率:收益肯定更高. 所以果断上上百核心的EPYC完事。

(实际上一些大型x86软路由已经特别强了,千万PPS不是什么问题,主要归功于现在x86核心实在是太多了,真的太多了,比手指头+脚趾头都多…)

总结

在一级消费市场,用x86是软方案, 同样成本下肯定是打不过硬方案的. 而且功耗上也会输掉. (参考企业级路由器实现)

ASIC 本身就是专门为了加速特殊场景而诞生的. 这是它存在的意义. 而MIPS作为路由器SoC, 很聪明的一点就是集成了ASIC, 利用自己价格低, 针对特殊领域优化的优势, 占领了特殊领域的市场. (MIPS能焊在路由器的板子上就是因为它价格低, 试想一下, 买个路由器还要单独买个MIPS CPU插到路由器上, 是不是这个世界很可能就全都是x86软路由了…)

但话锋一转,轮到垃圾佬,形势立刻逆转,2000块获得64核心不是什么问题,而64核心足够挑战100G企业级路由器发包了,所以最终结论是,如果你带机量不是很大(几十个),那么用光猫还是自己弄的小软路由都没事,如果带机量特别巨大,那么x86软路由的优势可能就要凸显了。便宜!

8
message-square
21
  • naivekun
    4 months ago

    物理定律无法改变,网络数据包的每个bit都要依靠逻辑门的充放电和比较。MIPS或者ARM或者奇奇怪怪指令集SoC性能高是因为在“一定使用场景下”(无策略路由,高连接数,乱七八糟acl体操)或者说在大多数家用场景下用更低的能耗表现做到了可以接受的性能。就像NPU在手机里用极高的能耗解决了推理问题。至于实际性能?垃圾佬的矿渣2080ti或者3070随随便便薄纱一个数量级(但是功耗高两个数量级)

    举几个低功耗的典型

    1. 某三的MSR3610/ICG3000F使用Cavium CN71xx处理器,有mips核以及专用packet processor。官网号称9Mpps包转发,只配个NAT确实能做到这个性能,但是只要加一条策略路由(by source ip),0.5Mpps负载立马延迟飞上120ms+,卡的没法用
    2. MT7621/MT7981的NAT连接数有限,好像是1w还是多少,超过了就会拉稀
    3. IPQxxxx(6000,8000)等。4202年了NSS加速还不支持IPv6 NAT,经过一番debug才发现ipv6 nat改不了源ip

    这些东西只有看起来光鲜的包转发性能但是实际用起来多多少少都有问题。简而言之(爆论)卖那么贵,不如买个便宜e5省下的钱拿来交电费。你说包转发性能?延迟?接着往下看

    至于商用带L3的芯片(BCM、Marvell、功耗100W+以上的),才是真正的发挥ASIC优势,吊打靠linux kernel协议栈转发。我有一台BCM的L3机,甚至使用的是GDDR5内存,以及使用自研ASIC的juniper。而在这个性能与功耗级别上,DPDK based router也并非完全没有用武之地,对于中间状态复杂(防火墙、IPS),协议栈市场小(基站),DPDK带来的研发成本优势其实还是不小的,毕竟芯片造出来真有bug可就改不了了,某BCM长达几千页的errata也得捏着鼻子看

    最后,对于"最简单就是把 Linux 的 IPv4 forward 一开, 就能跨子网路由通信了. 但是性能惨不忍睹"我并非完全认同。我的k8s生产集群负载大致如图

    内网路由就是debian虚拟机通sriov vf卡,开了个ip_forward,并且开了NAT,日常300万连接,3mpps包转发

    CPU(Intel Xeon Platinum 8373C)占用就这一丢丢,一个核都不到,完全懒得动

    • karminski-牙医OPMA
      4 months ago

      实际上文中这个用MT7621A的 hEXs, 按照官方数据开25个规则,直接性能掉到十分之一…

      • naivekun
        4 months ago

        4202年了,立即升级7nm MT7981,运营商路由器只要几十块钱

    • karminski-牙医OPMA
      4 months ago

      8373C主频零头都能吊打的MIPS未免太不讲武德。我这篇文章写的时候大家还在用E5v2哈哈哈哈哈

    • naivekun
      4 months ago

      当然,延迟过了NAT也是0.5ms内的

    • AlphaAreaA
      4 months ago

      UDP无状态包转发好测。那有没有什么NAT性能基准?我看起夜级设备标NAT参数都只写最大支持连接数,但是不写带宽或延迟

      • naivekun
        4 months ago

        你的trex测试架咕了?

        • AlphaAreaA
          4 months ago

          不就是因为不知道怎么测NAT性能才咕的吗……

          卵漏油可以关了NAT测UDP双向打流(感觉可以横向比较Mikrotik的性能表)
          消费级路由器的NAT关不掉,端口转发硬跑UDP打流缺乏参考价值,带着NAT又不知道怎么测……

  • 525165
    3 months ago

    有个问题,为何多核心处理器更适合干软路由?

    • karminski-牙医OPMA
      3 months ago

      本质上每个包是天然可分割的,因此就天然适合多个处理单元进行处理(先不考虑TCP顺序问题)。

      类似快递分拣站,一个传送带就是一个RSS队列,一个分拣工人就是一个CPU核心。来了一卡车快递,全都倒在传送带上(RSS队列),这时候我们增加分拣工人(核心),单位时间处理的快递量就会增加。但是流水线过长会排队。试想一下一个大城市的快递只有一个传送带。那么可能这个传送带需要特别长,不然容纳不下这么多快递,这就造成了延迟会很大(卡车倒了一车,结果第二天才分拣完毕)所以增加传送带(RSS队列),就会显著降低延迟。

      • 525165
        3 months ago

        如果单核心处理能力强(类比分拣工人分拣速度快),那效果应该也不会差吧 另外,我只是猜测,对于多核心,是否有合适的机制可以让多个核心良好并行协同工作?也即是能真正发挥出多核心的优势。 如果无法发挥多核心优势,那么少核心+高主频是否是一种更好(效果更好)的选择?

        • karminski-牙医OPMA
          3 months ago

          假设单核心5GHz,那么4个2.5GHz怎么也比一个5GHz快了吧?默认就能发挥优势,3时代以后的kernel都很强了。早期2.6还有不如BSD的说法,现在kernel都6.12.6了。网络栈不像游戏。有的游戏没办法并行,所以才说单核性能,比如Unity开发的某些游戏(没错就是 rimworld)。

          上面绿猪说的其实很对了。现在新CPU随便开forward后已经巨强无比了。早期4核心8线程时代可能还左顾右盼点,现在动不动几十个核心,随便跑不带怕的。

  • cola整体网络
    4 months ago

    软路由基本上都是对单核要求比较高,支持超多RSS队列的网卡还是太贵了

    • karminski-牙医OPMA
      4 months ago

      我记得X520就有64个RSS,cx4有128个,足够用了

  • cola整体网络
    4 months ago

    然而我的卵漏油是1w多买的DELL R350 甚至只有6C/12T…… 羡慕2000块钱64C的7D12软路由

  • Proton
    4 months ago

    MIPS 我记得是 native big endian 处理网络 code 应该有优势(但不知道有多少

  • AlphaAreaA
    4 months ago

    网上测x86软路由的小包转发性能都还停留在minismb无脑发包上。这种包头完全一致的重复包测试连RSS都用不上,直接就干爆单核。

    实际上N100搭个X540把RSS拉满足够1Mpps小包转发了,起码先把RSS吃满再说DPDK

  • 苏大强
    3 months ago

    最近想给家里上个防火墙,华为的USG6000系列小黄鱼最便宜也得五百,企业级的东西还是有些贵

  • 朴素岩床
    3 months ago

    想把给家里老人用的 rb750gr3 换掉了但一直没想好换啥,看了貌似是 rb750gr3 继任者的 hEX E50UG,这俩性能好像都没差多少,但架构从 mips 换到 arm64。想在 mikrotik 家的路由器上用 zerotier 组网好像真就只能换了(目前是在内网另外拿了台机器跑 zt)