论文部分内容阅读
利用通用多核平台构建高速软件路由器是当前的一个研究热点,研究发现基于Linux的网络子系统是影响软件路由器性能的一个重要瓶颈。我们分析了Linux网络子系统的开销分布以及PacketShader和Netmap两个软件路由器的转发结构和存在的问题,设计并实现了一个基于通用多核处理器的零拷贝IP包转发系统MapRouter。实验结果表明:对于包长为64、128、512、594、1024、1280、1518字节的数据报,MapRouter的IP转发速率都可以达到10Gbps.
MapRouter的零拷贝转发架构由基于内核态的无锁零拷贝高性能网络输入输出子系统、高效的包缓存回收与重复利用子系统和快速的包分发引擎等三部分构成。其中,网络输入输出系统采用零拷贝、包缓存预分配、批处理、旁路内核协议栈等优化措施,对于各种包长的数据包,网络输入输出系统接收或发送包的平均时间开销小于58个处理器时钟周期。另外,网络输入输出系统充分利用CPU片内高速缓存优化方法,保证不同包长的包的输入输出性能均保持稳定。网络输入输出系统以小于单核7.5%处理器利用率开销达到包长大于512字节的数据包10Gbps的接收性能。
基于流水线并行模式的IP转发系统使得输入端口接收的数据包被分发到多个目的端口。数据包在输入端口被分配包缓冲区,在输出端口完成发送后,包缓冲区被释放。输出端口在将数据包成功发送后应将包缓冲区归还给输入端口。因此带来目的端口之间以及目的端口与输入端口之间同步的问题,我们使用快速的包分发引擎和高效的包缓存回收与重复利用系统解决端口之间的同步问题。包分发引擎将输入端口和目的端口之间一对多的同步问题分解成多个一对一的同步问题,包缓存重复利用系统将目的端口和输入端口之间多对一的同步问题也分解成多个一对一的同步问题,然后都采用并发无锁的先进先出队列解决一对一的同步问题。包分发和包缓存循环利用系统都使用无锁的数据结构实现同步,具有很好的可扩展性。端口数在2至8之间变化,分发系统和包缓存回收与重复利用系统的性能基本与端口数无关,并且可以保证各个端口的性能维持在10Gbps以上的速率。
MapRouter消除了PacketShader转发过程中的数据包拷贝,解决了Netmap多端口间的零拷贝转发带来的包缓冲区管理问题。另外,MapRouter的包缓存的回收与重复利用完全在内核中实现,对用户保持透明,在实现高性能的同时,不对系统带来安全隐患。最后,MapRouter在实现端口10Gbps的转发速率的同时,并且CPU的利用率较低。