APP下载

基于国产化环境的线程池模型研究与实现

2020-01-07王韩波孙文俊

网络安全技术与应用 2020年1期
关键词:设计模式空闲国产化

◆王韩波 孙文俊 林 鹏

基于国产化环境的线程池模型研究与实现

◆王韩波1孙文俊1林 鹏2

(1.中国电子科技集团公司第二十八研究所 江苏 210007;2.92020部队 山东 266000)

为满足面向服务化和大数据的大型企业级信息系统的高并发、高吞吐、安全性需求,也为适应新形势下国防网络信息系统逐步向国产化自主平台迁移的行业发展趋势,本文通过对常用线程池模型的比较研究,提出了固定无优先级领导者/跟随者线程池和动态有优先级半同步/半异步线程池模型,并提供基于银河麒麟操作系统+飞腾CPU的国产自主环境的实现方案。

线程池模型;国产化环境;领导者/跟随者;半同步/半异步

多线程技术主要分为两种:在需要时进行创建的经典多线程处理方式和基于预创建的线程池处理方式[1]。经典多线程是一种按需创建的机制,为每个请求创建独立的线程进行处理,逻辑简单且可靠性高,适用于并发量少且不密集的应用场景。一旦系统出现并发请求峰值时,大量资源的创建和销毁开销将严重影响系统响应能力。因此在高并发服务端使用场景下,基于预创建的线程池解决方案更为常见。

为满足面向服务化和大数据的大型企业级业务信息系统的高并发、高吞吐需求,也为适应国防信息安全领域逐步向国产化软硬件平台迁移的行业发展趋势,有必要基于国产化环境研究通用线程池技术,探索其国产化平台的实现方案,为未来国产化环境下如何提高系统效率寻找一种切实有效的解决方法。

1 线程池模型

对线程池的研究主要从三个方面进行:一是线程池的大小设定;二是线程池的优先级设定;三是线程池的设计模式。线程池大小设定影响线程池对系统资源的需求,按照线程池内线程数量能否增减,可将线程池划分为固定线程池和动态线程池[2]。线程池优先级设定通常有两种类型,一是线程池中所有线程的优先级别相同,即无通道模式;另一种是线程池中的线程有一定的优先级别,即有通道的模式,线程池中不同的优先级别对应着线程不同的数据存储方式,同时也影响者线程池大小[2]。线程池的常见设计模式则主要包括:半同步/半异步(Half-Sync/Half-Async)和领导者/跟随者(Leader/Follower)两种。文献[3]深入分析了并发用户数、请求处理时间和线程池中线程数对Half-Sync/Half-Async和Leader/Follower这两种线程池设计模式对系统性能的影响,并在不同场景下对两种设计模式的线程池性能表现做了比较。

通过分析常见大型业务信息系统多线程并发需求的特点,文章选择不同的线程池设计策略组合,提出以下两种通用线程池模型:(1)固定无优先级领导者/跟随者线程池(本文简称简单LF线程池);(2)动态有优先级半同步/半异步线程池(本文简称动态HH线程池)。

1.1 简单LF线程池模型

为了在简单多任务并发处理的场景下,更好地利用多线程的并发优势,降低程序的复杂度,提高产品的稳定性,提出简单LF线程池模型,如图1所示。

简单LF线程池的简单主要指对线程池内线程数量做固定设计,线程间不区分优先级按照先到先执行原则进行调度作业。LF是指线程池采用领导者/跟随者(Leader/Follower)的设计模式,由领导者(leader)线程负责线程池请求事件监听和消息分离,并从跟随者(follower)中遴选新的领导者线程,然后自己以执行线程(processor)的身份去处理相关事件,直到本次请求处理完毕后恢复为follower线程并等待重新被遴选为leader线程。其中leader线程的挑选方式,可根据实际情况决定,通常采用先进先出、随机指定等简单原则。

图1 简单LF线程池模型

简单LF线程池模型设计简单、成熟度高、运行稳定,但在大量负载动态变化或线程任务存在不同实时性要求的情况下并不适用。由于空闲线程不会被销毁,在用户的并发需求较低时,线程池仍维持着为正常运行设计的线程数,将会造成大量的系统资源浪费;而当用户请求峰值出现时,线程池无法提供更多的工作线程,使得用户请求大量积压甚至超时失效,从而造成系统响应能力的进一步恶化。此外线程池中的线程优先级全部相同,高负载环境下大量普通非实时任务会抢占过多的处理器资源,实时任务却无法得到及时处理。

1.2 动态HH线程池模型

简单LF线程池模型由于缺乏灵活性和优先级考虑,难以满足强实时数据处理和复杂多任务调度的实际要求,如实时情报处理软件和高并发服务网关等。为满足高并发场景下的使用需求,在常规线程池的基础上对线程池的线程数量、优先级、调度机制等进行设计优化,提出动态HH线程池模型,如图2所示。

图2 动态HH线程池模型

动态HH线程池模型的动态性体现在两个方面:(1)支持线程数量的动态调整,通过初始化线程池为一个预先设定的固定大小,再根据实际需求动态增减临时线程的数量,提供动态伸缩的线程池并发处理能力。(2)支持线程优先级的动态设定,通过等待处理的任务优先级动态指定处理线程的优先级,支持实时任务获得更多处理能力。

动态HH线程池模型参考CORBA标准(简称RT-CORBA),RT-CORBA提供了半同步/半异步(Half-Sync/Half-Async)线程池的设计模式。Half-Sync/Half-Async将同步模式与异步模式相结合,异步层完成数据的I/O操作,提高系统整体I/O效率,同步层进行业务的请求处理,降低线程池复杂度,通过优先级消息队列来完成数据交互。

2 线程池实现

目前常见的国产化基础软件环境包括以中标、银河麒麟操作系统为代表的国产操作系统,以武汉达梦、人大金仓为代表的国产数据库管理系统,国产化基础硬件环境包括基于龙芯、飞腾CPU解决方案的各类终端和服务器设备[4]。本文仅以“银河麒麟操作系统+飞腾CPU”的国产化解决方案为例,讨论简单LF线程池模型和动态HH线程池模型的实现方案。但实际上以指挥信息系统为例,今后将会相当长的一段时期内,同时在Windows、Unix、银河麒麟等多种操作系统上运行。尽管各操作系统的实现方案会存在种种细节方面的不同(如:pthread和solaris thread,epoll、kqueue和iocp等),但是简单LF线程池模型和动态HH线程池模型的运作机理不会改变。

2.1 简单LF线程池实现

简单LF线程池使用Reactor设计模式来实现事件的多路分离,很多高性能网络应用如Netty、Redis均在使用类似的IO方式。其中事件源和分离机制采用银河麒麟操作系统中最常用的fd_set 和select 系统调用。简单LF线程池模型的实现类图如图3 所示。

简单LF线程池模型将请求的I/O处理部分封装为统一的事件回调接口,任意时刻只有leader线程负责响应I/O句柄事件,不再是一对一的经典I/O响应机制,其他follower线程将处于静默等待状态。线程间使用信号量作为同步机制,所有follower 线程阻塞在同一个LF选主信号量上等待,直到当前leader线程释放出下一轮选主通知。

2.2 动态HH线程池实现

动态HH线程池的异步层负责I/O层事件监听,使用Reactor 模式实现异步层事件派分,在完成消息提取后放入到线程池消息队列等待处理。考虑到银河麒麟操作系统是基于Linux内核实现,选用更高效的epoll系统调用实现高效的事件通知机制,使用fd_set 数据结构来标识事件源。线程池的同步层和消息队列使用主动对象(Active-Object)设计模式来实现,主动对象模式抽象并发任务为逻辑请求对象,通过异步编程的方法调用(Method Invocation)和方法执行(Method Execution)的分离设计,实现动态HH线程池请求提取和请求处理在不同的线程中执行,最终完成同步层和异步层的分离。动态HH线程池的实现类图如图4所示。

常见的动态线程池大小调整方案有两种:一是阈值触发式调整,二是公式预测式调整。阈值触发式指按照预先设定的线程池参数来控制线程池的扩展和收缩行为,简单易实现且维护性开销小,但线程池参数需要精确地校正,否则会导致系统性能下降;公式预测式指通过经验公式来预测未来线程池的最优大小,往往更能反映业务系统运行中资源消耗的真实情况,并根据统计学原理快速调整线程池规模,但通用性较差,需要较大的资源状态采集、统计和预测动作的开销。

图3 简单LF线程池实现类图

图4 动态HH线程池实现类图

为保证动态HH线程池在不同使用场景下的适用性,文中采用了第一种调整方案,并支持阈值参数的可调整。假设线程池最大线程数量为T_MAX,最小为T_MIN,单次可调整线程数为T_NUM,最小空闲数量为T_IMIN,最大为T_IMAX。动态HH线程池的线程池大小动态调整策略如下:

(1)首先建立线程池,创建T_MIN个初始线程;

(2)当线程池中空闲线程数低于T_IMIN时,触发线程池动态扩张机制,创建并添加T_NUM个空闲线程;

(3)当线程池中空闲线程数高于T_IMAX时,触发线程池动态收缩机制,回收并删除T_NUM个空闲线程;

(4)线程池动态调整过程中,保证线程池中线程数量不超过T_MAX也不低于T_MIN;

(5)若线程池已达最大限制且无空闲线程可用时,任务请求将被存入缓冲队列,等待空闲线程出现并处理。

以上参数的合理设置可以保证任意时刻系统均具有一定的并发请求响应能力,缓冲区的存在也在一定程度上降低了动态调整或瞬间峰值过程中任务丢失的可能性。

3 结束语

为满足面向服务化和大数据的大型企业级信息系统的高并发、高吞吐需求,以及国产化发展趋势,本文提出一组适用于常见的业务信息系统需求的线程池模型,并提供了基于银河麒麟操作系统+飞腾CPU国产化自主环境的实现方案。通过实际的项目试用过程中发现,简单LF线程池和动态HH线程池能够很好解决常见的信息系统并发需求。后续在此研究基础上封装跨平台的多线程开发基础支撑库,以达到减少开发人员日后迁移工作量、提高代码复用率、提升程序鲁棒性和降低软件维护成本的目的。

[1]唐富强,于鸿洋,张萍.Linux下通用线程池的改进与实现[J].计算机工程与应用,2012.

[2]聂兰兰.考虑外界影响因子的动态线程池优化设计与实现[D].武汉:华中科技大学,2014.

[3]李刚,金蓓弘.两种线程池的实现和性能评价[J].计算机工程与设计,2007.

[4]陈奡,王超,张永等.国产化Web信息系统性能评估模型与优化方法[J].指挥信息系统与技术,2015.

[5]赵海,李志蜀,韩学为等.线程池的优化设计[J].四川大学学报(自然科学版),2005.

[6]刘云生,王刚,王卫国.实时线程池性能研究与动态优化[J].计算机工程与科学,2007.

[7]谢宙宇,臧飞.基于国产软硬件的信息系统性能优化技术[J].指挥信息系统与技术,2014.

猜你喜欢

设计模式空闲国产化
元器件国产化推进工作实践探索
设计模式识别的特征信息分类研究
“1+1”作业设计模式的实践探索
LNG接收站扩建工程低压泵国产化应用管理
ASM-600油站换热器的国产化改进
智慧图书馆环境下的融贯式服务设计模式研究
三维协同设计模式下的航天项目管理实践与展望
“鸟”字谜
面向国产化的MCU+FPGA通用控制器设计
西湾村采风