我有一个最低限度的CentOS 6.3、64位充当带有4个NIC(1 Gbps)的网关,每个都绑定在一起以进行公共通信,而另一个则绑定用于私有,以执行NATing。它具有6 GB RAM和4个逻辑内核。在过去的两年中,我们一直在使用它,没有任何问题。
我对硬件路由器没有任何经验,但是我听说它们的RAM和CPU较少,并且使用闪存盘。与具有更多RAM和CPU的计算机相比,具有低硬件配置的设备如何表现更好(例如,处理更多的并发连接)?
除了使用不同方法来处理此问题的IOS之外,还有哪些限制因素?
我有一个最低限度的CentOS 6.3、64位充当带有4个NIC(1 Gbps)的网关,每个都绑定在一起以进行公共通信,而另一个则绑定用于私有,以执行NATing。它具有6 GB RAM和4个逻辑内核。在过去的两年中,我们一直在使用它,没有任何问题。
我对硬件路由器没有任何经验,但是我听说它们的RAM和CPU较少,并且使用闪存盘。与具有更多RAM和CPU的计算机相比,具有低硬件配置的设备如何表现更好(例如,处理更多的并发连接)?
除了使用不同方法来处理此问题的IOS之外,还有哪些限制因素?
Answers:
无需使用通用CPU和特定于任务的软件,您可以跳过该软件,仅使芯片直接处理任务。
高性能网络硬件使用ASIC而不是软件来完成计算量大(但在逻辑上相对简单)的任务,例如将IP地址与巨大的Internet路由表进行比较,检查CAM表以进行切换决策或根据ACL检查数据包。这对那些对时间敏感的操作的速度产生了巨大的差异,与通用CPU相比具有明显的优势。
most routers that do NAT use general purpose CPUs
是的,这是一个正确的声明,但是却不知道许多这样的设备将特定的操作转移到专用芯片上的事实(如我上面的完整回答所示)。不要以为NAT和连接跟踪(我同意,现代设备的ASIC中不会发生这种情况),而应该考虑路由表和交换分流。
高端专用路由器可以在CPU和RAM方面更快的情况下胜过PC,因为它可以在硬件中完成更多的路由选择。
同样的原因是价格为60美元的千兆以太网交换机可以胜过价格为2,000美元的PC,后者具有4个两端口GigE卡作为以太网交换机。交换机从头开始构建成为交换机。
“除了IOS”?
iOS几乎发挥了所有作用。CentOS是通用操作系统。它旨在使用多种不同的硬件配置,在各种情况下都具有足够的性能。另一方面,IOS进行了非常精细的调整,可以使用您在Cisco设备中发现的非常特殊的硬件类型,仅处理您希望从网络设备中获得的那种工作负载。
知道究竟是什么硬件的作品,你要编程的会带你在性能与兼容性方面很长的路要走。
软件和硬件都有话要说。我对通用服务器硬件上的英特尔和TP-Link NIC(其核心使用Realtek芯片)以及路由中的专用和通用软件进行了比较。
在硬件方面,如果板上的ASIC可以处理IP流量,则处理器负载可以更低,从而更快。我注意到两个板载的Intel NIC芯片直接通过DMA通信,绕过主CPU处理数据包转发。同时,Realtek芯片会在数据包到达时中断。
在软件方面,如果将软件设计为用于路由,则可以使其效率更高。我同时使用了pfSense + PF(一种经过修改的FreeBSD,旨在用作路由器)和通用的Ubuntu 12.04 + iptables作为路由软件,并且第一个显然可以更快地切换流量。(由于Linux 3.13内核中新增了nftable,Ubuntu 14.04现在几乎快了。)
但是,专用路由器确实有一个主要缺点:除了交换流量外,它不能执行任何其他操作,并且不能进行虚拟化。我当前的边缘路由器是运行Ubuntu 14.04的ESXi群集中的虚拟机,它还充当入侵检测系统和负载平衡器。
AFAIK,这是通用操作系统的开销;无论您的连接速度有多快,都在内核上下文中逐个数据包地处理数据包,从而增加了延迟并增加了系统负担。我相信在其他答案中已经比我能做的更好。
话虽这么说,但在这方面以及其他方面,有希望的新的“ ish”技术越来越受欢迎,并且具有更大的可行性,这些技术可能会在Linux系统中形成更强大的竞争对手。即InfiniBand
查看有关StackOverflow的以下问答: 如何实现TCP内核旁路
进一步阅读:
通常是由于linux中缺少现成的网络堆栈/设备配置。在几乎90%的情况下,CPU0处理您的网络流量,而其他闲置。如果您能解决此问题,那么与硬件路由器的区别将不会像您想象的那样激烈。您应该至少设置RSS或RPS(CPU之间基于驱动程序/堆栈的数据包处理分布)。
如果您真的在意linux路由器的性能并且有足够的时间,我建议您阅读packagecloud博客中的这篇文章(也有关于传输数据包的文章)。
如果您需要查看发行版并且认为观看while sleep 1; do cat $some_file_in_procfs; done
,CPU掩码评估和手动smp_affinity
编写很无聊,那么您可能会发现我的宠物项目netutils-linux非常有用。