基于多引擎并发的密码服务软件架构*

2022-11-04 02:23马占飞李克见史国振
北京电子科技学院学报 2022年1期
关键词:队列线程引擎

马占飞 李克见 史国振

1.内蒙古科技大学包头师范学院,包头市 014030

2.内蒙古科技大学,包头市 014010

3.北京电子科技学院,北京市 100700

0 引言

随着我国电子政务内网及安全应用系统的逐步推广和部署,安全应用系统面临着高并发、高吞吐率的性能需求。 国内有很多学者针对密码硬件模块采用并行处理机制[1,2]性能优化,而对于整个应用系统的性能瓶颈往往体现在软件方面,密码服务软件是为安全应用系统提供密码服务不可少的密码处理模块,负责接受和处理上层安全应用系统的密码服务软件的随机性、多样性的调用请求,为安全应用系统提供数据的机密性、完整性和不可篡改性保护。 密码服务软件的数据处理架构性能直接影响着安全应用系统在多用户下并发响应速率,对数据包的响应效率要求较高。

单引擎的密码服务架构的密码处理模块已经不能满足上层安全应用系统的多用户、高并发性能需求,是限制安全应用系统在多用户场景下数据处理性能的关键因素之一。

从密码服务提供者角度分析,影响密码服务性能的有三个方面,一是密码应用接口通信性能;二是密码服务软件的数据处理架构性能;三是密码算法的性能。 其中密码服务软件的数据处理架构性能是最易也是提升空间较大的关键方面,是本文研究的主要内容,本文重点分析密码服务软件面临安全应用系统高性能需求环境下,如何提供多线程并发[3,4]的密码服务,引入多包处理机制和无锁队列[5,6]技术进行优化,提出多引擎机制的软件架构,利用共享锁处理机制和无锁队列技术进行性能研究对比,优化密码服务软件的数据包处理性能,从而更好地满足上层安全应用系统对密码服务的性能需求。

本文组织架构如下:第1 节介绍密码服务方软件架构;第2 节介绍高性能队列,无锁队列技术;第3 节描述了提议的方案设计和已完成工作,包括多引擎架构设计、多包处理机制和引擎可配置;第4 节描述实验及测试结论;第5 节本文总结了相关工作和未来的改进方向。 前两节属于本文的预备知识,之后章节为本文的新工作内容。

1 单引擎密码服务架构

单引擎密码服务由算法初始化、应用容器初始化、任务接受、任务处理等模块组成。 密码服务软件的软件架构如图1 所示。

图1 单引擎密码服务架构框图

算法初始化主要配置和初始化密码算法库操作。 密码服务软件为上层安全应用系统提供伪随机数、对称加密、非对称加密、摘要运算、消息认证码运算、签名验签运算等密码服务。 具体的密码运算提供由算法库来实现,密码算法库实现方式可分为软实现和硬实现,软实现指软件编程实现的密码算法组件,常见的开源算法库有OpenSSL、Crypto++、MbedTLS 等,硬实现指调用一些加密硬件部件或加密芯片进行运算,常见的硬件部件有USBKEY 加密钥匙、PCIE 密码卡、服务器密码机等。

应用容器初始化负责对应用策略相关配置和初始化操作,应用容器是为安全应用系统提供密码服务软件的最小单元,安全应用系统通过打开应用容器使用容器内所配置的算法和密钥,密码服务软件支持多应用容器配置,每个应用容器的算法和密钥是按容器分割,不同的应用容器配用的算法、应用密钥不同。 密码服务软件可按照应用场景不同进行配置应用容器,可配置对称算法、非对称算法、签名验签、摘要运算、消息验证码运算等为安全应用系统提供密码服务。

任务处理线程负责处理任务队列中的任务数据包,依次将任务数据包取出、解析、处理、返回结果。

2 无锁队列技术

密码服务软件架构中设计输入缓存机制,输入缓存队列是影响密码服务引擎处理性能的关键因素。 队列(queue)是一种先进先出(FIFO)的线性表,只允许在表的一端进行插入,在另一端进行删除元素。 针对作业排队处理的多线程并发的软件架构中,队列是程序设计中经常使用的一种数据结构,队列在多线程操作一般模式是基于互斥锁与信号量想结合实现,生产者和消费者在操作队列之前,先获得共享锁再操作,完成操作之后将锁释放,但这种共享锁的机制效率不高,使用不当很容易产生死锁的情况,无锁队列是一种非互斥锁的并发数据结构,相比共享锁效率高且避免死锁现象,无锁队列主要是通过原子操作或细粒度锁来实现的一种支持多线程并发的高效线程安全队列[7]。

无锁队列处理模型按照生产者和消费者模型的对应关系可分为:单生产者-单消费者模型(一对一)、多生产者-单消费者模型(多对一)、单生产者-多消费者模型(一对多)、多生产者-多消费者模型(多对多)共四种模型。

(1) 单生产者-单消费者模型

图2 一对一队列模型

(2) 多生产者-单消费者模型

图3 多对一队列模型

(3) 单生产者-多消费者模型

黎永兰母亲李玉说,林雪川在事后第一时间隐瞒了真相,试图以意外来掩饰故意,这是不悔罪的表现,从事发到被抓,三天的空档时间,林雪川也有机会将不利的证据毁灭,这都应该罪加一等。

图4 一对多队列模型

(4)多生产者-多消费者模型

图5 多对多队列模型

以上是无锁队列的四种处理模型,无锁队列技术实现有很多方式,其性能也各有不同,常见的无锁队列主要是通过比较再交换(CAS Compare and Swap)、增加指定的值(FAA Fetch and add)等原子操作或Retry-Loop 细粒度的锁机制实现。

3 多引擎可配置架构设计

3.1 多引擎架构设计

本文基于图1 所示的单引擎密码服务软件架构进行性能优化,针对单引擎的任务处理架构提出一种多引擎处理机制架构,处理引擎由队列和处理线程组成,每一个接受队列绑定一个处理线程,这样的队列与处理线程绑定的结构组成一个密码引擎(Crypto Engine),接受线程将收到的数据包采用顺序轮循的调度方式投入到处理引擎中,处理引擎将待处理数据处理完毕,根据数据包头信息将处理结果发送返回。 如图6 所示多引擎并行处理机制,接受线程将任务分别投入不同的引擎中处理并返回结果。

图6 多引擎并行处理架构

多引擎密码服务主要由接受任务模块、缓存队列、处理线程等功能模块组成。

为提高数据传输效率和稳定性,密码引擎中设计输入缓存机制-缓存队列,缓存队列的是为了匹配数据传输速率和密码服务处理速率,提高数据通信带宽,在多线程并发场景下,缓存队列的入队和出队性能是影响密码服务处理性能的关键。 密码服务软件接受n个任务请求后,按照顺序轮询放入每个密码引擎的缓存队列中,对应的处理线程模块分别处理缓存队列的任务并将结果发送返回,从而实现密码服务的并行性处理,提高密码服务的处理性能,满足上层安全应用系统高并发高性能的需求。

3.2 多包处理机制

软件支持并发访问的数据结构的设计可以基于互斥锁或无锁机制,无锁队列的应用与平台和编译器依赖紧密,在实际的应用场景中,无锁机制是不能完全代替有锁机制的应用,因此本文针对基于有锁队列下单包处理机制,提出一种基于有锁队列的多包处理机制,也是一种多线程并行处理[8-10]的软件架构的性能优化项。

在生产环境中广泛使用生产者和消费者模型,生产者在生产的同时,消费者可以进行消费,通常使用互斥锁保证数据同步。 当多线程并发设计中线程互斥锁的开销较大且频繁出现锁竞争,会导致线程等待情况,CPU 不停地中断,使得软件整体性能下降。 为尽可能降低线程锁争用带来的影响,可以运用多包处理的设计思路即每次获取到竞争锁,获取尽可能多的数据包,降低所竞争的频度,从而提升优化软件架构性能。

密码服务软件中竞争锁情况主要体现在接受线程与多个处理线程之间,接受线程将收到的合法请求数据包通过轮询方法放入队列中,队列中存在数据包时将触发处理线程工作,处理线程将数据取出队列,任务队列是一个临界区,为了提升密码服务软件的处理性能,降低接受线程与处理线程竞争线程锁的概率,本文提出多包处理机制,即处理线程每次获取到锁之后,取出尽可能多的数据包,之后再循环处理多包,相比频繁获取锁,多包处理机制更加节省系统开销,这种多包处理机制在高并发、高吞吐量情况下,密码服务软件处理任务的性能有明显提升。

3.3 引擎可配置

多引擎密码服务软件性能提升的关键在于处理引擎合理配置,如何更加合理设计配置是本文要解决的问题,多引擎是基于多线程并发思路来提升服务软件架构的性能,但处理线程或引擎个数并不是越多越好[11]。 在系统资源有限的情况下,需要在服务软件的多引擎性处理性能和系统硬件配置能之间把握平衡,线程过多反而会影响软件本身的性能。

考虑到系统资源的有限性,为更加合理分配系统资源,满足安全应用系统响应需求,需要对应用系统的调用性能进行评估,本文重点关注应用系统的关键的业务处理流程,通常这些调用频繁的业务处理流程,是评估应用系统业务处理的性能的关键。 通过模拟应用系统关键业务流程的高并发调用业务场景,评估出对密码服务软件的处理引擎配置数。 例如网关密码设备内部关键的密码业务为认证协商,认证协商流程的性能是应用系统用户认证接入响应指标,我们可针对认证协商流程进行多线程并发调用进行密码服务软件的性能调优,即评估出密码服务软件的合理配置引擎个数。

研究表明,密码服务软件的处理引擎个数的配置对性能处理有明显的提升,如图7 所示,通过配置密码服务软件的处理引擎个数来实现性能的可扩展性,从而更好地满足应用系统的性能需求。

4 实验测试

本文实验测试使用本地Socket 编程实现应用接口与密码服务之间的通信,密码算法使用开源OpenSSL 库实现,使用Boost C++标准库中的无锁队列方案,是一种基于原子操作的无锁队列(Lock-free),基于多引擎并行处理机制实现了多引擎并发的密码服务软件。 通过实验对比,较单引擎处理架构的密码服务软件的数据处理性能有大幅度提高。

4.1 测试环境

在终端测试机上使用C/C++语言实现发包程序和多引擎密码服务软件进行数据处理性能测试对比。 终端测试机配置为四核Inter(R)Core(TM) i3-2120 CPU @3.30GHZ 处理器,操作系统为Linux Ubuntu 14.04,其内核版本为Linux version 3.13.0,使用的编译器为GCC Version 4.8.4。

发包程序与多引擎密码服务软件之间使用TCP 网络通信方式收发任务数据包,多引擎密码服务软件可通过配置文件设置处理引擎个数,算法运算通过调用OpenSSL 开源加密库实现,发包软件执行多线程、多通道方式进行发包操作,多引擎密码服务软件分别运用无锁队列、多包处理机制测试1KB 数据AES 加密、SHA256摘要运算和64Bytes 数据RSA 签名性能并对比。

(1) 配置不同引擎个数条件下,多引擎密码服务软件运用无锁队列机制实现,测试对称加密、摘要运算性能并对比;

(2) 配置不同引擎个数条件下,多引擎密码服务软件分别运用单包处理、多包处理机制和无锁队列实现,测试RSA 签名的性能对比。

4.2 测试结果及分析

(1) 密码服务软件分别配置1 引擎、2 引擎、4 引擎、8 引擎、10 引擎,测试对称加密和摘要运算的性能,测试明文数据长度为1KB,测试结果如图7 所示。

图7 不同引擎配置密码服务性能

由图7 可以看出配置不同的引擎个数,处理1KB 数据进行AES256 对称加密和SHA256 运算的性能有明显的提升。 但是并不是配置越多的处理引擎个数性能就越高,受限于测试平台的硬件配置,因此本文提出可配置处理引擎数量的思路,更加合理地利用系统资源,使得整体密码服务软件处理能力得到更好体现。

(2) 密码服务软件分别配置1 引擎、2 引擎、4 引擎、8 引擎、10 引擎,测试RSA 签名性能,签名数据长度为64 Bytes,结果如图8 所示。

由图8 中可以看出,密码服务软件进行签名处理性能随着配置处理引擎的个数的增加而提升。 使用无锁队列的性能明显比使用共享锁性能高出75%-150%左右,使用共享锁情况下多包处理机制明显比单包处理机制性能要高。通过有锁队列和无锁队列性能对比,无锁队列对于整个软件架构处理性能的提升效果明显。

图8 不同引擎个数的RSA 签名性能

5 结束语

本文基于单线程业务处理架构设计提出一种多引擎并行处理机制软件架构,结合无锁队列技术实现了基于多引擎处理、多线程并发的软件处理架构,该架构与传统架构性能有较高提升,能够更好地满足安全应用系统的密码业务性能需求,为安全应用系统提供高效的密码服务,满足安全应用系统对于多算法,多任务流交叉情况下密码服务请求的快速响应。 通过实验测试该密码服务的软件架构的可行性,并给出了一个可配置性能的多引擎高并行的密码服务软件架构设计,如何更加合理智能化配置处理引擎个数是本课题下一阶段要研究的问题。

猜你喜欢
队列线程引擎
5G终端模拟系统随机接入过程的设计与实现
实时操作系统RT⁃Thread启动流程剖析
点燃企业发展的“引擎”
打造信息化建设的“党建引擎”
实时操作系统mbedOS 互斥量调度机制剖析
智能网联车辆队列紧急工况控制策略设计*
队列队形体育教案
车坛往事4:引擎进化之屡次失败的蒸汽机车
青春的头屑
队列操练