[发明专利]一种基于内存池的消息队列优化方法在审
申请号: | 202211701671.1 | 申请日: | 2022-12-29 |
公开(公告)号: | CN116048838A | 公开(公告)日: | 2023-05-02 |
发明(设计)人: | 温泉 | 申请(专利权)人: | 天翼云科技有限公司 |
主分类号: | G06F9/54 | 分类号: | G06F9/54;G06F9/50 |
代理公司: | 暂无信息 | 代理人: | 暂无信息 |
地址: | 100010 北京市东城区青*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 基于 内存 消息 队列 优化 方法 | ||
本发明公开了一种基于内存池的消息队列优化方法,属于数据传输技术领域,包括:通过无锁环形队列的方式,构建内存池队列,其中,每个内存池队列中包括至少一个容量大小相同的内存块;获取消息数据,根据消息数据的长度,挑选目标内存块,通过目标内存块存放消息数据;按照目标内存块的挑选顺序,填充目标内存块的头部区,其中,填充的内容包括:所属的内存池队列编号、消息的总块数以及消息的块索引值;配置内存块指针,内存块指针用于存放目标内存块的指针值;将内存块指针放入消息队列,并通过消息通道进行传输;在消息数据完成传输的情况下,对目标内存块进行回收。本发明内存占用灵活,内存使用率高,可以在性能与内存占用之间达到平衡。
技术领域
本发明属于数据传输技术领域,具体涉及一种基于内存池的消息队列优化方法。
背景技术
消息队列是实现线程间数据传输的常用技术,其实现方式多种多样,常用的有系统消息队列、kafka、RabbitMQ、Redis队列、以及加锁环形链表等。但由于这些技术容易受到数据拷贝、系统调用、锁阻塞的影响,因此主要用在用户态或内核态对性能非极度挑剔的场景下。而在消息传输对内存和时效敏感的场景下,系统对数据的处理在性能、内存占用等方面有极高的要求,进而有现有技术采用DPDK(Data Plane Development Kit,数据平面开发套件)的rte_ring(无锁环形队列)进行消息队列的传输。
但是,现有技术中,DPDK的rte_ring,虽然实现了无锁、零拷贝,但也存在频繁分配与释放堆内存的问题,即使采用预分配堆方式,但对于一些峰值流量场景、大小包比例不均且动态变化的场景,当前也存在内存占用不灵活、内存使用率低的问题,更无法在性能与内存占用之间达到平衡。
发明内容
本发明实施例的目的是提供一种基于内存池的消息队列优化方法,能够解决现有技术内存占用不灵活,内存使用率低,无法在性能与内存占用之间达到平衡的技术问题。
为了解决上述技术问题,本发明是这样实现的:
本发明实施例提供了一种基于内存池的消息队列优化方法,包括:
S101:通过无锁环形队列的方式,构建内存池队列,其中,每个内存池队列中包括至少一个容量大小相同的内存块;
S102:获取消息数据,根据消息数据的长度,挑选目标内存块,通过目标内存块存放消息数据;
S103:按照目标内存块的挑选顺序,填充目标内存块的头部区,其中,填充的内容包括:所属的内存池队列编号、消息的总块数以及消息的块索引值;
S104:配置内存块指针,内存块指针用于存放目标内存块的指针值;
S105:将内存块指针放入消息队列,并通过消息通道进行传输;
S106:在消息数据完成传输的情况下,对目标内存块进行回收。
进一步地,所述S102具体包括:
S1021:在所述消息数据的长度小于或者等于长度阈值的情况下,挑选出符合第一预设条件的所有内存池队列,其中,所述第一预设条件为内存块容量大于或者等于所述消息数据的长度;
S1022:从符合所述第一预设条件的内存池队列中,挑选出符合第二预设条件的内存池队列,其中,所述第二预设条件为内存块容量最小;
S1023:在仅有一个内存池队列满足所述第二预设条件的情况下,从该内存池队列中确定出所述目标内存块;
S1024:在存在多个内存池队列满足所述第二预设条件的情况下,从队列编号最小的内存池队列中确定出所述目标内存块。
进一步地,所述S102还包括:
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于天翼云科技有限公司,未经天翼云科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202211701671.1/2.html,转载请声明来源钻瓜专利网。