为什么硬件路由器比具有更好规格(RAM和CPU)的Linux路由器性能更好?

我有一个最小的CentOS 6.3,64位作为网关与4 NIC(1 Gbps),每个绑定在一起公共交通和其他私人,执行NAT。 它有6 GB RAM和4个逻辑核心。 过去两年我们一直在使用这个,没有任何问题。

我没有硬件路由器的任何经验,但我听说他们有更less的内存和CPU和使用闪存盘。 具有较低硬件configuration的盒子如何比具有更多RAM和CPU的机器performance得更好(如处理更多的并发连接)?

除了IOS使用不同的方法来处理这个,限制因素是什么?

ASICs 。

不使用通用CPU和特定任务的软件,您可以跳过该软件,直接使硅处理任务。

高性能的networking硬件使用ASIC而不是软件来处理计算量大(但在逻辑上相对简单)的任务,例如将IP地址与巨大的互联网路由表进行比较,检查CAM表以检查交换决定,或者根据ACL检查分组。 这对时间敏感的操作速度产生巨大的差异,与通用CPU相比具有显着的优势。

一个高端的专用路由器可以超越具有更快的CPU和更多的RAM的PC,因为它可以在硬件中执行更多的路由。

同样的道理,一个60美元的千兆以太网交换机可以超过2000美元的个人电脑,而4个双端口千兆以太网交换机可以作为以太网交换机。 交换机是从地面build立起来的一个交换机。

“除了IOS”?

IOS使几乎所有的差异。 CentOS是一个通用的操作系统。 它被devise成在各种各样的场景下运行得非常好,使用大量不同的硬件configuration。 另一方面,IOS使用Cisco设备中非常具体的硬件types,可以非常精确地处理一些networking设备的工作负载。

完全知道你正在编程的硬件将在性能和兼容性方面有很长的路要走。

软件和硬件都有话要说。 我在通用服务器硬件上比较了英特尔和TP-Link网卡(使用Realtek芯片),以及在路由中使用专用软件和通用软件。

在硬件方面,如果板载ASIC可以做IPstream量的一些处理,则处理器负载可以更低,因此更快。 我注意到两个INtel网卡芯片直接通过DMA进行通信,绕过主CPU处理数据包转发; 同时Realtek芯片会在数据包到达时中断。

在软件方面,如果软件被devise用于路由,可以使其更高效。 我已经使用了pfSense + PF(一个修改后的FreeBSD用作路由器)和通用的Ubuntu 12.04 + iptables作为路由软件,第一个明显地将stream量切换得更快。 (Ubuntu 14.04现在几乎一样快,这要归功于Linux 3.13内核中新的nftables。)

然而,专用路由器有一个主要的缺点:除了交换stream量之外,它不能做很多事情,而且不能被虚拟化。 我目前的边缘路由器是运行Ubuntu 14.04的ESXi集群内部的一台虚拟机,它也可以作为入侵检测系统和负载均衡器。

AFAIK,这是通用操作系统的开销; 不pipe连接速度有多快,数据包都会在内核的上下文中以逐个数据包的方式处理,从而增加系统的延迟和压力。 我相信已经在其他答案中已经解释得比我能做得更好了。

话虽如此,有前途的新的“ish”技术越来越受欢迎和可行性,可能会在这个以及其他方面创造一个更强大的Linux系统的竞争对手; 即InfiniBand

看看下面的问答在StackOverflow: 如何TCP核心旁路实现

进一步阅读:

  • CCGrid '11:Infiniband和万兆以太网傻瓜版的教程
  • InfiniBand和Linux在LinuxJournal文章
  • 从Linux访问InfiniBand – 英特尔DeveloperZone
  • InfiniBand开源项目

这通常是因为在Linux中缺乏开箱即用的networking堆栈/设备configuration。 在将近90%的情况下,您的networkingstream量由CPU0处理,而其他处于空闲状态。 如果你将解决这个问题与硬件的差异,路由器不会像你想象的那么激烈。 您应该至less设置RSS或RPS(CPU之间基于驱动程序/堆栈的数据包处理分配)。

如果你真的关心你的linux路由器性能,并有足够的时间,我build议你阅读packagecloud博客 (也有关于传输数据包的文章)这篇文章。

如果你需要看看分配,你认为在while sleep 1; do cat $some_file_in_procfs; done while sleep 1; do cat $some_file_in_procfs; done while sleep 1; do cat $some_file_in_procfs; done CPU面具评估和手动smp_affinity写作是无聊的,你可能会发现我的宠物项目netutils-linux非常有用。