在上期专题中,我们提到了,NFV作为SDN的流派之一,以vBRAS等形式推进着运营商网络的重构。事实上,不仅限于在运营商领域,同时,在IDC中,基于网元虚拟化实现的vSwitch以及LB/防火墙等增值业务,也大行其道。这些NFV软件运行的平台,就是基于x86的多核处理器平台。
由于x86上运行的传统Linux的架构限制,x86多核一直无法实现高性能的数据转发,因此,英特尔牵头开发的DPDK(Data Plane Development Kit)已经成为了NFV的标配,各大互联网企业招聘网络业务开发、架构工程师时,也将熟悉DPDK写入了招聘要求之中。DPDK与容器、SD-WAN、边缘计算等概念成为了当下最火热的ICT技术。
但,大家不知道的是,早在2006年,国内已经开始了在多核处理器上进行类似DPDK的研究与开发。
2006年,多核处理器的江湖最炙手可热的辣子鸡炸子鸡是MIPS多核处理器。RMI(已被Broadcom兼并)和Cavium(已被Marvell兼并)之间爆发了激烈的多核处理器军备竞赛。而国内站在科技最前沿的H3C公司则敏锐地洞察到了未来多核通用与半通用处理器将成为网络设备主流处理器的趋势,利用多核处理器开发了一系列中高端路由器与安全产品。
SR6602就是H3C基于多核技术开发的路由器的代表作。它基于当时最先进的8核32硬件线程的处理器,处理器内部框图如下图所示:
可以看出,该处理器具有最高24Gbps的网络IO处理能力,可以外扩TCAM接口,内部有一个快速消息环网(Fast Messaging Network)把来自网络接口、安全加密算法引擎的数据包快速通知对应的CPU/线程,而各个CPU/线程也可以通过FMN互相通信。
H3C的工程师们在开发过程中发现,简单地将网络操作系统中软转发模块在多个CPU上运行,性能并没有线性提升。如原来1个线程上获得200kbps的转发能力时,28个线程的转发性能仅为1500kbps,大大低于产品规划时的预期。这是为什么呢?
原来,对于并行计算,有一个重要的定律——Amdahl加速比定律。
Amdahl加速比定律的内容是,完成复杂工作可获得的加速比是有限的,受限于这个工作中必须被串行执行的部分。也就是说,即使有少量的计算工作需要多个处理器串行执行,总体的性能也会大大下降。
实际上,在多核处理器并行处理数据包时,绝大多数情况下,每一个数据包是可以根据hash算法,负载分担到不同的处理器进行处理的。
但是,大家注意到红色线条框起的局部:
所有的处理器核心共用二级缓存,这样,一旦两个或多个处理器核心共享了一块缓存区域,会造成多个核心排队访问这块缓存区域。
处理器默认的缓存组织方式,是以缓存行(cache line)方式组织的。如MIPS的缓存行为32字节,而数据包缓存(MBuf)的大小为4KB,是32字节的128倍。这样,非常容易造成连续的MBuf使用冲突,在接受后一个数据包的时候,就把前一个数据包踢出了cacheline。
解决的办法也很简单。分配MBuf时,以4KB+32字节为单位。这样,能保证每两个MBuf之间,包头不会映射到同一条cacheline。
另外,多核实现路由器时,还有一个地方容易引发缓存冲突,大家知道是哪里吗?