处理器如何处理每秒 10 吉比特或更高的数据速率?

网络工程 速度
2021-07-14 17:42:23

不知道问的地方对不对。这可能是一个非常愚蠢的问题。我假设某些处理器必须处理数据帧以进行交换/路由。现代处理器的速度只有几 GHz。他们如何处理速度快于操作速度的数据?

2个回答

你是完全正确的,如果我们必须每比特使用一个指令周期,那么 10Gbps 将是无法实现的。所以首先要注意的是,我们每条 CPU 指令处理一个字——64 位。

即便如此,我们可以为性能做的最糟糕的事情是让 CPU 访问数据包的所有字。因此,重点放在数据包的“零复制”处理上。其中一些技巧在于接口本身:它们具有 DMA(“直接内存访问”),以便以太网控制器芯片将数据复制到 RAM 中;它们计算校验和,以便 CPU 不必访问数据包中的所有字来执行此操作。其中一些是在数据结构设计中:我们小心地对齐数据包缓冲区,以便我们可以通过更改页表条目的所有权来移动它们。其中一些只是仔细编程以确保访问分组数据的次数最少,并且最好在接收应用程序之前完全不访问。

一旦我们完成了所有这些,下一个限制就是一次处理一个数据包的开销。因此,在以太网控制器和内核中都有一堆“分段卸载”功能,以便我们处理数据包组。我们甚至延迟从以太网控制器检索数据,以便这些组更大。

最后,我们有特殊情况的快捷方式,例如内核的 sendfile() 调用,它是使用最少工作量从磁盘到网络的快速路径。

我们甚至可以使用网络接口卡的硬件特性进行特殊情况路由(将数据包从一个接口转发到另一个接口),并将 PCI 总线视为卡之间的总线,而不是让 CPU 参与进来。这在通用操作系统中是做不到的,但是像英特尔这样的供应商提供了软件库来在他们的以太网控制器上实现这些功能。

完全摆脱 CPU,我们甚至可以构建专用路由器,所有转发任务都在硬件中进行。由于 PCI 总线将成为限制,因此它们运行多个并行总线;甚至多个并行总线到多个并行交叉开关组件。在市场的一端,一个基于 TCAM 的小型以太网交换机就是一个例子;在市场的另一端,瞻博网络 M40 将是一种规范设计。

典型的交换机将开始接收数据包,在 TCAM 中查找目标地址,将带有出口端口的标签附加到数据包,然后将仍然传入的数据包 DMA 到出口端口的控制器。请注意,如果输出端口拥塞,那么在这个简单的交换机上所能做的就是丢弃入口数据包。因此,当链接改变速度并且需要一些排队时,简单的开关不是一个好的选择。当然,存在更复杂的开关,您需要为此支付更多费用。

典型的路由器将接收一个数据包并将其保存在一个短队列中。将在静态 RAM 中查找目标 IP 地址,然后将数据包分解为单元以减少延迟,每个单元将发送到交叉开关到出口卡。该卡会将信元重新组合成一个数据包,并将该数据包从出口接口排队。出口接口上的排队可能很复杂。

今天,几乎所有的交换和大部分路由都是在硬件中处理的,因此处理器速度在例外情况下发挥作用。对于服务器之类的东西,处理器可能不够快。过去就是这种情况。当 1 Gbps 以太网刚出现时,PC 和服务器中使用的总线只能处理 400 Mbps。

当处理器速度不够快时,会发生流量下降的情况。无论如何,很多流量可能会被丢弃,因为如果处理得当,这就是拥塞的处理方式。RED(Random Early Detection)是一种用于随机丢弃队列中的数据包以防止它们填充和尾部丢弃数据包的方法。这有助于防止 TCP 同步。交换机上会出现大量丢包,其中一个速度的多个端口可能需要发送到另一个速度相同的单个端口。