一种基于内存池与细粒度锁优化的高并发SIP信令处理方法与流程

摘要: 本发明涉及通信网络信令处理领域,尤其涉及一种基于内存池与细粒度锁优化的高并发sip信令处理方法。背景技术:1、会话发起协议sip作为ip多媒体通信领域常用的信令...
一种基于内存池与细粒度锁优化的高并发SIP信令处理方法与流程

本发明涉及通信网络信令处理领域,尤其涉及一种基于内存池与细粒度锁优化的高并发sip信令处理方法。

背景技术:

1、会话发起协议sip作为ip多媒体通信领域常用的信令控制协议,广泛应用于voip语音通话、呼叫中心、ims核心网及会话边界控制设备等场景。在高并发呼叫与大量注册、呼叫建立及释放的业务压力下,sip服务器通常采用事件驱动的网络接入方式配合多线程并行处理以提升吞吐。现有技术中较常见的实现架构为基于epoll的监听与输入输出线程负责连接管理与收发数据,并将解析后的sip消息投递至线程池中的工作者线程执行事务处理;同时,为维护同一呼叫的状态一致性,通常建立以call-id等标识为键的会话表来存取会话上下文,并在共享数据结构上使用互斥锁保证并发安全;在内存管理方面,多采用通用内存分配器或对象缓存对消息对象与会话对象进行动态分配与释放。

2、然而,上述现有技术在面向多核高并发sip信令处理时仍存在不足,主要包括:

3、1、在消息处理与发送回包跨线程协作的情况下,消息对象在不同线程中频繁分配与释放,易引发全局内存分配器的锁竞争并导致内存碎片累积,影响吞吐与稳定时延;

4、2、会话状态一致性往往依赖全局锁或较粗粒度的锁策略,导致大量并发消息访问会话表或更新会话上下文时产生严重阻塞,限制多核并行度;

5、3、任务调度常采用轮询、按连接数或简单队列长度等方式,难以反映线程的真实综合负载,容易造成负载不均衡、时延波动增大及整体处理能力受限。

6、因此,需要一种能够解决上述现有技术不足的高并发sip信令处理方法。

技术实现思路

1、本发明的一个目的在于提出一种基于内存池与细粒度锁优化的高并发sip信令处理方法,针对现有技术在高并发sip信令处理场景下跨线程频繁分配释放引发全局内存分配器锁竞争与内存碎片、会话状态一致性依赖粗粒度锁导致阻塞与多核利用率不足、以及轮询或按连接数等简单调度方式难以反映真实负载从而造成负载不均与时延波动的问题,提出了如下技术方案:构建输入输出线程与多个工作者线程的并发处理框架,为各工作者线程建立私有分层内存池与无锁环形缓冲队列;建立以call-id为键的全局会话表并为每个会话上下文配置互斥锁以实现会话级细粒度加锁;建立会话亲和映射表并由调度模块基于待处理事件数、处理器利用率、私有内存池使用率及负载预测值计算综合负载评分,在负载熵值失衡时比较迁移收益与迁移成本以更新亲和绑定;响应消息由工作者线程私有内存池分配并携带标识,在输入输出线程发送完成后按标识回收至原内存池。本发明具备降低锁竞争与内存碎片、提升吞吐与多核并行度、并降低时延波动的技术效果。

2、本发明提供了一种基于内存池与细粒度锁优化的高并发sip信令处理方法,包括:

3、s1、创建至少一个输入输出线程以及多个工作者线程,分别建立私有内存池并分别建立任务队列,建立全局会话表,以sip消息的call-id为键存储会话上下文且每个会话上下文配置互斥锁,建立会话亲和映射表以记录call-id与工作者线程的绑定关系,设置调度模块;s2、输入输出线程接收sip消息并解析获得call-id,生成消息任务;s3、调度模块获取各工作者线程的负载评分,依据会话亲和映射表以及负载评分为消息任务确定目标工作者线程,当候选工作者线程的负载评分低于已绑定工作者线程的负载评分且差值大于迁移成本时,更新会话亲和映射表以变更call-id对应后续消息任务的投递目标;s4、输入输出线程将消息任务写入目标工作者线程对应的任务队列;s5、目标工作者线程从其对应的任务队列获取消息任务,基于call-id在全局会话表中定位会话上下文并获取该会话上下文对应的互斥锁,在持有互斥锁的条件下执行sip会话处理以生成响应消息,从目标工作者线程的私有内存池分配内存生成响应消息,并关联私有内存池的标识;s6、输入输出线程发送响应消息,依据私有内存池的标识将响应消息占用的内存归还至对应的私有内存池。

4、可选的,s1包括:

5、在服务器启动时获取处理器核心数,依据所述处理器核心数确定所述工作者线程的线程数量,同时创建所述监听线程以及所述至少一个输入输出线程;

6、为每个工作者线程分别分配线程标识并分别建立对应的私有内存池,所述私有内存池按照不同内存块大小划分为至少两个内存层级并分别维护对应的空闲内存块集合;

7、为每个工作者线程分别建立对应的无锁环形缓冲队列,将所述无锁环形缓冲队列与该工作者线程的线程标识关联存储,所述无锁环形缓冲队列为多生产者单消费者队列,至少一个输入输出线程作为生产者,所述工作者线程作为消费者;

8、初始化所述全局会话哈希表并配置哈希桶数量,所述全局会话哈希表为支持并发访问的哈希表,对会话上下文的插入操作采用哈希桶级互斥锁或者原子插入方式,以保证同一call-id对应的会话上下文被唯一创建;

9、所述全局会话哈希表用于以call-id为键建立call-id与会话上下文的对应关系,每一会话上下文中包含对应的互斥锁;

10、初始化所述会话亲和映射表,使所述会话亲和映射表用于存储call-id与工作者线程的线程标识的绑定关系;

11、初始化所述调度模块的预设采集周期、预设权重、第一阈值、第二阈值以及预设变化率阈值,为各工作者线程建立待处理事件数、处理器利用率以及私有内存池使用率的采集项,用于执行所述多维感知与预测调度算法。

12、可选的,s2包括:

13、所述监听线程基于epoll接收sip连接并将所述sip连接对应的文件描述符注册至所述输入输出线程的epoll;

14、所述输入输出线程基于epoll对已注册的所述文件描述符进行事件监听,在监听到可读事件时从对应的所述sip连接读取字节流并生成原始sip消息;

15、所述输入输出线程对所述原始sip消息进行协议解析以提取call-id,基于所述原始sip消息与所述call-id构造消息任务,所述消息任务包括所述call-id、所述原始sip消息以及用于标识所述sip连接的连接标识。

16、可选的,s3包括:

17、所述调度模块在每一采集周期内分别获取各工作者线程的待处理事件数、处理器利用率以及对应私有内存池使用率,将所述待处理事件数、所述处理器利用率以及所述私有内存池使用率进行归一化处理;

18、所述待处理事件数为对应工作者线程的无锁队列中的待处理消息任务数量,所述处理器利用率为所述采集周期内对应工作者线程的运行时间占所述采集周期的比例,所述私有内存池使用率为对应私有内存池的已分配内存量占可分配内存总量的比例;所述调度模块基于历史综合负载评分计算负载预测值,所述负载预测值通过对历史综合负载评分进行指数平滑得到的平滑值以及趋势分量计算获得;所述调度模块将归一化后的所述待处理事件数、所述处理器利用率、所述私有内存池使用率以及所述负载预测值按预设权重加权求和得到各工作者线程的综合负载评分,基于各工作者线程的综合负载评分占综合负载评分总和的占比计算负载均衡熵值;

19、所述负载均衡熵值为基于所述占比的香农熵,将所述香农熵除以工作者线程数量的对数得到归一化熵值,使所述负载均衡熵值的取值范围为0至1;所述调度模块针对每一工作者线程分别基于相邻采集周期的综合负载评分计算综合负载评分变化率,所述综合负载评分变化率为相邻采集周期内该工作者线程综合负载评分之差的绝对值与前一采集周期该工作者线程综合负载评分之比,取各工作者线程综合负载评分变化率的最大值作为全局变化率;

20、当所述全局变化率超过预设变化率阈值时,将所述采集周期调整为小于当前采集周期的更新采集周期,采用所述更新采集周期重新计算各工作者线程的综合负载评分以及所述负载均衡熵值;所述调度模块以call-id查询所述会话亲和映射表以获得绑定工作者线程;

21、在所述绑定工作者线程存在且所述绑定工作者线程的综合负载评分不超过第一阈值时,将所述绑定工作者线程确定为目标工作者线程;

22、在所述绑定工作者线程不存在时,从各工作者线程中选择综合负载评分最小的工作者线程作为目标工作者线程,更新所述会话亲和映射表以建立所述call-id与所述目标工作者线程的绑定关系;

23、在所述绑定工作者线程存在且所述绑定工作者线程的综合负载评分超过所述第一阈值时,从各工作者线程中选择综合负载评分最小的工作者线程作为候选工作者线程;

24、在所述负载均衡熵值低于第二阈值时执行会话迁移机制,所述会话迁移机制包括:计算迁移收益与迁移成本,所述迁移收益为所述绑定工作者线程的综合负载评分与所述候选工作者线程的综合负载评分之间的差值;

25、所述迁移成本由所述call-id对应的会话上下文大小以及所述绑定工作者线程与所述候选工作者线程的私有内存池使用率通过预设成本函数确定;

26、在所述迁移收益大于所述迁移成本时,将所述候选工作者线程确定为所述目标工作者线程并更新所述会话亲和映射表以建立所述call-id与所述目标工作者线程的绑定关系;

27、在所述迁移收益不大于所述迁移成本时,将所述绑定工作者线程确定为所述目标工作者线程;

28、在所述负载均衡熵值不低于第二阈值时,将所述绑定工作者线程确定为所述目标工作者线程;

29、进一步的,所述会话亲和映射表中针对每一call-id的绑定关系还包括绑定版本号;

30、在更新所述会话亲和映射表以变更call-id对应后续消息任务的投递目标时,对应call-id的绑定版本号递增;

31、所述输入输出线程在s4中将所述绑定版本号写入消息任务;

32、所述目标工作者线程在s5中在查询所述会话亲和映射表获得当前绑定版本号后,将所述当前绑定版本号与所述消息任务中的绑定版本号进行比对,当二者不一致时,将所述消息任务重新提交至所述调度模块以重新确定目标工作者线程;

33、进一步的,所述调度模块在计算各工作者线程的综合负载评分时,还确定输入输出线程所在的numa节点以及各工作者线程所在的numa节点,基于所述numa节点是否相同确定numa惩罚项,将所述numa惩罚项计入所述综合负载评分,使所述调度模块优先选择与所述输入输出线程位于相同numa节点的工作者线程。

34、可选的,s4包括:

35、所述输入输出线程接收目标工作者线程,获取与所述目标工作者线程对应的无锁队列,所述无锁队列为无锁环形缓冲队列;

36、所述输入输出线程将消息任务写入所述无锁环形缓冲队列的写入位置,并通过原子操作更新所述无锁环形缓冲队列的写入索引以形成队列入队结果;

37、所述无锁环形缓冲队列依据所述写入索引向所述目标工作者线程输出待处理消息任务,使所述目标工作者线程在s5中获取所述待处理消息任务;

38、进一步的,所述输入输出线程在向无锁环形缓冲队列写入消息任务之前检测所述无锁环形缓冲队列的剩余容量;

39、当剩余容量小于预设容量阈值时,将所述消息任务写入全局溢出队列,并将对应工作者线程的待处理事件数增加预设惩罚值,使所述调度模块降低向该工作者线程分配消息任务的概率;

40、所述工作者线程在从无锁环形缓冲队列取任务后,还从所述全局溢出队列竞争式获取消息任务进行处理。

41、可选的,s5包括:

42、目标工作者线程从与其对应的无锁环形缓冲队列中取出待处理消息任务,读取所述待处理消息任务中的call-id;

43、目标工作者线程以所述call-id为键在全局会话哈希表中查询会话上下文;

44、在查询到会话上下文的情况下,目标工作者线程获取所述会话上下文对应的互斥锁并在持有所述互斥锁的条件下对所述待处理消息任务执行sip会话处理;

45、在未查询到会话上下文的情况下,目标工作者线程创建与所述call-id对应的会话上下文并为所述会话上下文配置互斥锁,采用哈希桶级互斥锁或者原子插入方式将创建得到的所述会话上下文写入所述全局会话哈希表,以保证同一call-id对应的会话上下文被唯一创建;

46、在写入过程中检测到所述全局会话哈希表中已存在同一call-id对应的会话上下文时,放弃所创建的会话上下文并获取已存在的会话上下文;

47、目标工作者线程获取所述会话上下文对应的互斥锁,并在持有所述互斥锁的条件下对所述待处理消息任务执行所述sip会话处理;

48、所述sip会话处理包括:从所述目标工作者线程的私有内存池分配用于生成响应消息的内存,依据所述待处理消息任务更新所述会话上下文并生成所述响应消息。

49、可选的,s6包括:

50、目标工作者线程将响应消息封装为引用计数的对象句柄,并为所述对象句柄配置释放回调;

51、所述释放回调记录目标工作者线程的私有内存池标识以及所述响应消息所占用内存对应的内存层级信息;

52、目标工作者线程将封装后的所述对象句柄提交至输入输出线程;

53、所述输入输出线程基于所述对象句柄获取所述响应消息并通过所述sip连接发送所述响应消息;

54、在所述输入输出线程完成发送并释放所述对象句柄时,所述释放回调被触发,依据所述私有内存池标识以及所述内存层级信息执行内存回收操作,使所述响应消息占用的内存归还至对应的私有内存池,所述内存回收操作包括通过线程安全释放接口释放,或者向对应工作者线程投递回收任务以由对应工作者线程执行释放。

55、本发明的有益效果是:

56、1、通过建立会话亲和映射表并基于待处理事件数、处理器利用率、私有内存池使用率及负载预测值计算综合负载评分,在负载熵值失衡时结合迁移收益与迁移成本进行会话绑定迁移,使sip消息任务更精准地分配至负载更优的工作者线程,从而提升负载均衡性,降低排队等待导致的时延波动并提高整体吞吐能力与资源利用率。

57、2、通过以call-id为键建立全局会话表,并为每个会话上下文配置专属互斥锁实现会话级细粒度加锁,避免会话处理依赖全局锁或粗粒度锁引发的大范围阻塞,减少锁竞争,提高并发处理的可扩展性与多核并行度,同时保证同一会话状态更新的一致性。

58、3、通过为每个工作者线程建立私有分层内存池,并将响应消息对象携带私有内存池标识,输入输出线程发送完成后按标识回收至原内存池,降低跨线程分配释放对全局内存分配器的依赖,减少锁竞争与内存碎片,提高内存分配释放效率,从而在高并发场景下实现更稳定的时延与更高的处理性能。