前言:想要写出一篇引人入胜的文章?我们特意为您整理了嵌入式平台高并发低时延性能提升设计范文,希望能给你带来灵感和参考,敬请阅读。
摘要:一般嵌入式平台的处理能力不及服务器,对于高并发低时延处理,通常采用select接收报文后,再使用多线程进行后续处理的机制实现,这种设计对于高并发网络数据的实时处理有一定的局限性。本文对软硬件架构进行设计,提出了一种epoll并发接收、内存池队列流转及业务异步处理机制,实现对高并发网络数据的低时延处理,能够大幅提升处理性能。
关键词;高并发;低时延;epoll;内存池队列;异步处理
对于系统来说,高吞吐量关系到系统单位时间内能够服务的用户数量,是系统服务性能指标的一个重要体现,特别是对用户数量规模巨大的系统,必然会出现大量用户并发请求处理的情况,如何保障系统能够快速响应所有用户的业务请求是需要解决的重点。本文以某嵌入式平台处理大量用户高并发数据请求为基础,对高并发低时延处理进行了性能提升设计。
1硬件架构设计
该嵌入式平台主要由主控单元和计算引擎等功能模块组成,以调用方式对系统发送的大量用户数据(UDP)进行计算处理。主控单元直接与外部传输线路关联,完成外部网络线路接入、协议解析、数据提取、计算引擎调度、协议封装、数据发送等功能。主控单元对外提供千兆以太网接口,对内通过业务转发总线与计算引擎关联,调用计算引擎进行数据计算。计算引擎主要由国产FPGA组成,用于实现业务数据的高速计算处理。内部集成高速算法模块,通过标准业务传输总线,与主控单元接口,实现数据的高速交互。
2软件架构设计
通常的select接收报文+多线程处理机制的局限性如下:一方面,select对能够支持的socket数量是有一定限制的,默认最大值为1024,且当select拥有一个很大的socket集合时,select每次调用都会线性扫描全部的集合,导致效率呈现线性下降;另一方面,大量业务线程的创建、维护及线程之间的调度,使得Linux系统开销太大,无法应对长时间的高并发数据处理。因此需要优化软件架构,提升高并发低时延处理性能。
2.1epoll并发接收
为实现高并发网络数据的接入,软件采用epoll并发接收机制进行处理。对epoll而言,最大支持的并发数上限为最大可以打开文件的数目,这个数字一般远大于2048。并发处理对带宽和时延指标的影响较大,分析如下:(1)并发对带宽指标的影响多通道并发对性能几乎没有影响,因为对接收程序而言,大量数据包来自一个通道,还是来自N个通道(每个通道各几个数据包),几乎没有本质区别。(2)并发对时延指标的影响并发对时延指标的影响巨大。对于单通道收发,所有数据包来自一个通道,嵌入式平台连续从单通道中接收数据进行处理并依次向外应答。对于多通道收发,如图2所示,如果把所有进入嵌入式平台的报文看作来自一个通路,则和单通道没有区别。但假设有多个通道(以3个通道为例)都以高速模式向嵌入式平台发送数据。嵌入式平台接收时,必然按数据发送的先后顺序,先接收到3个通道各自的“包1”进行处理,再继续接收到3个通道的“包2”。很明显,第一个通道“包2”的应答理论上一定在第3个通道“包1”的应答之后。而时延是按照每个通道单独计算的,因此当前通道的报文会被其他通道先到的报文抢占嵌入式平台的运算资源,导致排队,进而时延加大。而且随着通道数的增加,时延会进一步恶化。epoll的并发接收机制能够很好地解决该问题。
2.2内存池队列处理模型
内存池作用:接收突发的高速数据报文(≥10000包/秒),确保不丢包。由于数据包在处理过程中,计算处理一般比较耗时,如果采用接收一包,处理一包,应答一包的机制,将会导致后续未能及时接收的报文大量丢包(内核只能缓存一定数量的报文)。可以通过内存池对突发的高速数据报文进行缓存,如图3所示,使用单链表构造一个内存池链表结构,每个内存单元包含一个预先分配好的能够接收最大报文长度的内存地址(按业务数据报文长度,一般2K-4K)。结合内存池链表,设计一种基于该链表的内存池队列处理模型,如图4所示,数据报文在嵌入式平台内部的流转处理过程如下:(1)软件启动时,创建一个空闲内存池链表(简称空闲链表),用于接收网络上的高速数据报文,初始内存单元个数为N(一般根据2G内存空间,至少设置1万个内存单元,可以更大);另外创建一个任务内存池链表(简称任务链表),初始内存单元个数为0;(2)当epoll检测到高速数据报文到来时,先从空闲链表中申请一个空闲的内存单元;(3)申请到空闲内存单元后,将数据报文接收到该内存单元,并将该内存单元插入到任务链表中;(4)业务线程检测到有任务需要处理时,从任务链表中取出一个待处理的内存单元,进行协议解析、调用计算引擎进行计算处理等操作;(5)处理完毕后,一方面将应答报文通过网络发送出去,另一方面将该内存单元回收到空闲链表中,以便继续使用。分析:(1)整个软件生命周期中,只会在初始化时分配N个内存单元;(2)N个内存单元在空闲链表和任务链表中来回流转,均为指针操作,不会增加数据拷贝等开销。(3)只要网络上瞬间的突发报文数不超过N,就不会造成丢包。一般至少将N设置为系统每秒最大数据报文数量的2倍及以上。
2.3异步处理模型
为了避免应用程序处于空闲等待状态,同时确保FPGA始终处于满负荷计算状态,必须采用异步处理模型提高处理效率。异步处理模型如图5所示,设计如下:(1)FPGA设计接收缓存队列,允许最多缓存M包。M值根据最大包长确定,队列越长,性能越强;(2)在FPGA可用缓存队列包数不为空的前提下,持续向FPGA发送待计算的报文(通过协议字段能够知道FPGA现在的可用缓存队列包数是多少);(3)FPGA调用接口提供异步调用模式,当FPGA处理完毕将计算结果返回应用程序后,应用程序自动调用回调函数,在回调函数中,将计算结果按照协议要求进行封装后发送至网络,并回收内存单元到空闲链表;(4)通过异步处理模型,保证FPGA始终在不停地计算缓存队列中的待处理报文,提高嵌入式平台整体的处理性能;
3结语
对于网络数据高并发低时延的处理性能提升,一直是我们不断追求突破的关键技术点。本文设计了一种高并发低时延处理机制,通过epoll并发接收网络上的高吞吐量数据,使用内存池对突发的高速数据报文进行缓存,采用队列处理模型完成数据报文在嵌入式平台内部的高效流转,辅以异步处理模型提高报文处理效率,达到了性能提升的目的。
参考文献:
[2]崔滨,万旺根,余小清,楼顺天.基于EPOLL机制的LINUX网络游戏服务器实现方法[J].微计算机信息,2006,7(3):64-66.
作者:夏安祥 王育红 罗健 单位:中国电子科技集团公司第三十研究所