某嵌入式平台高并发低时延性能提升设计

2021-04-24 13:05
网络安全技术与应用 2021年4期
关键词:链表空闲队列

(中国电子科技集团公司第三十研究所 四川 610041)

对于系统来说,高吞吐量关系到系统单位时间内能够服务的用户数量,是系统服务性能指标的一个重要体现,特别是对用户数量规模巨大的系统,必然会出现大量用户并发请求处理的情况,如何保障系统能够快速响应所有用户的业务请求是需要解决的重点。本文以某嵌入式平台处理大量用户高并发数据请求为基础,对高并发低时延处理进行了性能提升设计。

1 硬件架构设计

图1 硬件架构图

该嵌入式平台主要由主控单元和计算引擎等功能模块组成,以调用方式对系统发送的大量用户数据(UDP)进行计算处理。

主控单元直接与外部传输线路关联,完成外部网络线路接入、协议解析、数据提取、计算引擎调度、协议封装、数据发送等功能。主控单元对外提供千兆以太网接口,对内通过业务转发总线与计算引擎关联,调用计算引擎进行数据计算。

计算引擎主要由国产FPGA 组成,用于实现业务数据的高速计算处理。内部集成高速算法模块,通过标准业务传输总线,与主控单元接口,实现数据的高速交互。

2 软件架构设计

通常的select 接收报文+多线程处理机制的局限性如下:一方面,select 对能够支持的socket 数量是有一定限制的,默认最大值为1024,且当select 拥有一个很大的socket 集合时,select 每次调用都会线性扫描全部的集合,导致效率呈现线性下降;另一方面,大量业务线程的创建、维护及线程之间的调度,使得Linux 系统开销太大,无法应对长时间的高并发数据处理。因此需要优化软件架构,提升高并发低时延处理性能。

2.1 epoll 并发接收

为实现高并发网络数据的接入,软件采用epoll 并发接收机制进行处理。对epoll 而言,最大支持的并发数上限为最大可以打开文件的数目,这个数字一般远大于2048。

并发处理对带宽和时延指标的影响较大,分析如下:

(1)并发对带宽指标的影响

多通道并发对性能几乎没有影响,因为对接收程序而言,大量数据包来自一个通道,还是来自N 个通道(每个通道各几个数据包),几乎没有本质区别。

(2)并发对时延指标的影响

并发对时延指标的影响巨大。对于单通道收发,所有数据包来自一个通道,嵌入式平台连续从单通道中接收数据进行处理并依次向外应答。

对于多通道收发,如图2 所示,如果把所有进入嵌入式平台的报文看作来自一个通路,则和单通道没有区别。但假设有多个通道(以3 个通道为例)都以高速模式向嵌入式平台发送数据。嵌入式平台接收时,必然按数据发送的先后顺序,先接收到3 个通道各自的“包1”进行处理,再继续接收到3 个通道的“包2”。很明显,第一个通道“包2”的应答理论上一定在第3 个通道“包1”的应答之后。而时延是按照每个通道单独计算的,因此当前通道的报文会被其他通道先到的报文抢占嵌入式平台的运算资源,导致排队,进而时延加大。而且随着通道数的增加,时延会进一步恶化。epoll 的并发接收机制能够很好地解决该问题。

图2 多通道收发

2.2 内存池队列处理模型

内存池作用:接收突发的高速数据报文(≥10000 包/秒),确保不丢包。

由于数据包在处理过程中,计算处理一般比较耗时,如果采用接收一包,处理一包,应答一包的机制,将会导致后续未能及时接收的报文大量丢包(内核只能缓存一定数量的报文)。可以通过内存池对突发的高速数据报文进行缓存,如图3 所示,使用单链表构造一个内存池链表结构,每个内存单元包含一个预先分配好的能够接收最大报文长度的内存地址(按业务数据报文长度,一般2K-4K)。

图3 内存池链表

结合内存池链表,设计一种基于该链表的内存池队列处理模型,如图4 所示,数据报文在嵌入式平台内部的流转处理过程如下:

(1)软件启动时,创建一个空闲内存池链表(简称空闲链表),用于接收网络上的高速数据报文,初始内存单元个数为N(一般根据2G 内存空间,至少设置1 万个内存单元,可以更大);另外创建一个任务内存池链表(简称任务链表),初始内存单元个数为0;

(2)当epoll 检测到高速数据报文到来时,先从空闲链表中申请一个空闲的内存单元;

(3)申请到空闲内存单元后,将数据报文接收到该内存单元,并将该内存单元插入到任务链表中;

(4)业务线程检测到有任务需要处理时,从任务链表中取出一个待处理的内存单元,进行协议解析、调用计算引擎进行计算处理等操作;

(5)处理完毕后,一方面将应答报文通过网络发送出去,另一方面将该内存单元回收到空闲链表中,以便继续使用。

分析:

(1)整个软件生命周期中,只会在初始化时分配N个内存单元;

(2)N 个内存单元在空闲链表和任务链表中来回流转,均为指针操作,不会增加数据拷贝等开销。

(3)只要网络上瞬间的突发报文数不超过N,就不会造成丢包。一般至少将N 设置为系统每秒最大数据报文数量的2 倍及以上。

图4 内存池队列处理模型

2.3 异步处理模型

图5 异步处理模型

为了避免应用程序处于空闲等待状态,同时确保FPGA 始终处于满负荷计算状态,必须采用异步处理模型提高处理效率。异步处理模型如图5 所示,设计如下:

(1)FPGA 设计接收缓存队列,允许最多缓存M 包。M 值根据最大包长确定,队列越长,性能越强;

(2)在FPGA 可用缓存队列包数不为空的前提下,持续向FPGA发送待计算的报文(通过协议字段能够知道FPGA 现在的可用缓存队列包数是多少);

(3)FPGA 调用接口提供异步调用模式,当FPGA 处理完毕将计算结果返回应用程序后,应用程序自动调用回调函数,在回调函数中,将计算结果按照协议要求进行封装后发送至网络,并回收内存单元到空闲链表;

(4)通过异步处理模型,保证FPGA 始终在不停地计算缓存队列中的待处理报文,提高嵌入式平台整体的处理性能;

3 结语

对于网络数据高并发低时延的处理性能提升,一直是我们不断追求突破的关键技术点。本文设计了一种高并发低时延处理机制,通过epoll 并发接收网络上的高吞吐量数据,使用内存池对突发的高速数据报文进行缓存,采用队列处理模型完成数据报文在嵌入式平台内部的高效流转,辅以异步处理模型提高报文处理效率,达到了性能提升的目的。

猜你喜欢
链表空闲队列
队列里的小秘密
基于多队列切换的SDN拥塞控制*
“鸟”字谜
基于二进制链表的粗糙集属性约简
跟麦咭学编程
西湾村采风
在队列里
彪悍的“宠”生,不需要解释
丰田加速驶入自动驾驶队列
基于MTF规则的非阻塞自组织链表