一种面向云架构的高性能网络接口实现技术
0概述
本文引用地址:http://www.amcfsurvey.com/article/270287.htm在传统的电信IT产品中,高性能网络接口一般采用特殊的硬件模块来实现,比如网络处理器、ASIC、FPGA等等。这些特殊硬件模块一般会采用特殊的架构和指令集对网络数据收发过程进行优化以达到更好的性能。然而,这也相应使得开发和维护这些模块的成本非常的昂贵,同时还有一个无法解决的问题是基于这些特殊硬件模块实现的网络接口不能移植到云中,因为它们跟硬件的耦合度太高了。摩尔定律的出现,使得通用处理器的性能得到了极大的提升,这也为基于通用处理器实现高性能网络接口提供了可能,同时也为移植到云中提供了前提条件。
图1 网络接口实现的发展趋势
本文对基于通用X86架构处理器和Linux下的传统网络接口实现模式进行了分析,同时针对其不足提出了一种高性能网络接口实现方案-HPNI.
1传统网络接口实现分析
传统网络接口实现如图2所示,Linux下传统网络接口处理流程一般包含以下几个步骤:
图2 传统网络接口实现
(1)系统启动之后,内核中的驱动程序进行相应的资源分配以及网卡寄存器配置,比如分配数据包缓冲区,使能DMA传输通道等等;
(2)网卡初始化完成以后,当网卡从网络收到数据包的时候,会将数据包通过DMA方式传送到内核中的数据包缓冲区中,并生成相应的数据包描述符存放在环形队列里面;
(3)网卡触发硬中断通知内核,内核在中断处理程序中产生相应软中断给应用程序收包任务;
(4)应用程序收包任务通过系统调用收取数据包,数据包也将从内核空间拷贝到用户空间;
(5)收包任务通过共享队列把数据包传递给处理任务;
(6)处理任务通过共享队列把处理好的数据包传递给发包任务;
(7)发包任务通过系统调用把数据包传递给内核,通过采用一次内存拷贝实现;
(8)驱动程序根据存放在环形队列里面的数据包描述符启动相应的DMA传输任务;
(9)数据包传输完成后,网卡触发中断通知内核做相应处理。
下面先对传统网络接口的性能关键点进行分析。
1.1中断和系统调用
Linux下传统网络接口实现的一个关键因素是中断技术,网卡通过中断与内核保持同步。但中断处理会引入很大的性能损失,因为当CPU处理中断的时候,它必须储存和恢复自己的状态,进行上下文切换以及在进入和退出中断处理程序的时候可能引入缓存(cache)操作。在进行大流量数据包处理的时候,由于CPU被频繁地中断,由此带来的性能损失会非常严重。
当使用Linux系统提供的标准socket接口来实现网络通信时,会触发大量的系统调用,当应用程序通过socket系统调用进行网络通信时,需要经历从用户态到内核态的切换以及其反向过程,在切换过程当中需要进行上下文的保存,比如对相关寄存器进行堆栈压栈操作,保存当前指令指针等等。这些操作都会消耗系统资源,当处理高速的数据流量时,随着系统调用数量的急剧增加而导致系统资源的大量消耗。
1.2内存相关性能问题
1.2.1内存拷贝
在使用标准套接字进行数据包收发时,数据在应用程序和内核之间进行传递必须通过内存拷贝来完成,原因在于用户空间的内存和内核空间的内存是处在物理内存不同的位置上。内存拷贝是一个非常消耗资源的过程,当需要收发的数据包流量很大时,这种开销将会极大地影响系统的性能。
评论