在以太网中,一般所说的接口带宽,1Gbit/s、10Gbit/s、40Gbit/s等,代表以太网接口线路上所能承载的最高传输比特率。
实际上,不可能每个比特都传输有效数据。以太网每个帧之间会有帧间距(Inter-Packet Gap, IPG),默认帧间距大小为 12 字节。每个帧还有 7 个子节的前导(Preamble),和 1 个字节的帧首定界符(Start Frame Delimiter, SFD)。
所以,通常意义上的满速带宽能跑有效数据的吞吐可以由如下公式得到理论帧转发率:
而这个最大理论帧转发率的倒数表示了线速情况下先后两个包到达的时间间隔。
按照这个公式,将不同包长按照特定速率计算可以得到一个以太帧转发率。按照最短包长 64B 计算,在 10Gbit/s 带宽下,其帧转发率约为 14.88 Mpps,帧间隔约 67.20 ns。若包长 1024B,则在 10Gbit/s 带宽下,其帧转发率约为 1.20 Mpps,帧间隔约 835.20 ns。
如果我们把处理一个数据包的整个生命周期看做是工厂的生产流水线,那么就要保证在这个流水线上,不能有任何一级流水处理的延迟超过此时间间隔。
假设 CPU 的主频率是 2GHz,要达到理论最大转发能力,对于 64B 和 1024B 包长分别允许消耗 33 和 417 个时钟周期。在存储转发模型下,报文收发以及查表都需要访存。而从处理器角度,一次 L3 cache 命中需要大约 40 个时钟周期;如果没命中,一个内存读需要 140 个指令周期,大概 70ns。显然,小包处理时延对于通用 CPU 系统架构的挑战是巨大的。
DPDK 通过一系列软件优化方法(大页利用,cache 对齐,线程绑定,NUMA 感知,内存通道交叉访问,无锁化数据结构,预取,SIMD指令利用等)利用 Intel Architecture 硬件特性,提供完整的底层开发支持库。使得单核三层转发可以轻松的突破小包 30Mpps。随着 CPU 封装的核数越来越多,支持的 PCIe 通道数越来越多,整系统的三层转发吞吐在 2 路 CPU 的 Xeon E5-2658 v3 上可以达到 300Mpps。
硬件及软件平台的配置或者参数对性能的影响可能是巨大的,DPDK 本身就是为了充分的挖掘硬件的潜能和减少不必要的运算。本质上讲,硬件系统决定了包处理的可能的最好性能;软件平台的配置正确与否决定了能不能达到或者接近硬件能提供的最好的包处理性能。
无需多言,CPU 的频率对性能有直接的线性影响;其次,不同的 CPU 所支持的指令集可能会不一样,新一代的 CPU 架构可能会带来一些更优的指令集,能够显著地改善或者提高某些方面的性能。内存控制器及内存条本身以及内存条的物理布局,同样对包处理性能有很大的影响。而 PCIe(Peripheral Component Interconnect Express)接口是高速以太网卡进出系统的通道,所以 PCIe 的接口直接决定了数据进出通道的大小。最后,对包处理性能影响最大的当然还是网卡本身。网卡焊接的以太处理芯片以及网卡的 PCIe 接口规格和槽宽度,决定了理论极限。