一种多进程数据输出方法与流程

文档序号:26003967发布日期:2021-07-23 21:21阅读:170来源:国知局
一种多进程数据输出方法与流程

本申请实施例涉及信息处理领域,尤指一种多进程数据输出方法。



背景技术:

sdn(softwaredefinednetwork,软件定义网络)、nfv(networkfunctionsvirtualization,网络功能虚拟化)技术发展得如火如荼,各大通信厂商都投入了很大精力来开发虚拟设备(如,虚拟网关、虚拟路由器等等)。dpdk(dataplanedevelopmentkit,数据平面开发套件)以其超高转发性能以及超多业务支持能力赢得了大部分厂商的青睐,相当多的厂商都在使用dpdk做转发基础架构。

dpdk无锁环形队列是一种高性能支持单生产者入队、单消费者出队、多生产者入队、多消费者出队,基于linux内核无锁环形缓冲原理,dpdk开发了一套易于使用的无锁环形队列api(applicationprogramminginterface,应用程序接口)。在dpdk转发架构中,无锁环形队列出现得频率很高,典型应用是用于dpdk数据转发平面中各cpu各进程之间报文信息交互。

基于dpdk的虚拟设备发展的如火如荼,其中多进程多线程数据交互的技术应用非常普遍,在实际使用过程中可能遇到各种各样的棘手问题,例如由于消息丢失、队列拥塞导致的数据乱序、多线程访问buffer(缓存)异常等,是亟待解决的问题。



技术实现要素:

为了解决上述任一技术问题,本申请实施例提供了一种多进程数据输出方法。

为了达到本申请实施例目的,本申请实施例提供了一种多进程数据输出方法,控制面进程通过第一数据平面开发套件dpdk无锁环形队列和第二dpdk无锁环形队列与目标数据面进程通信,所述方法包括:

所述控制面进程中第一线程从所述控制面进程中的控制台接收对所述目标数据面进程的数据查询指令;

所述第一线程将接收到的数据查询指令消息放入所述第一dpdk无锁环形队列,待所述目标数据面进程读取;

在所述目标数据面进程将所述数据查询指令的回程消息放入所述第二dpdk无锁环形队列后,所述控制面进程中的第二线程从第二dpdk无锁环形队列中读取回程消息,得到所述数据查询指令对应的输出数据。

一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上文所述的方法。

一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上文所述的方法。

上述技术方案中的一个技术方案具有如下优点或有益效果:

控制面进程中第一线程从所述控制面进程中的控制台接收对所述目标数据面进程的数据查询指令,第一线程将接收到的数据查询指令消息放入所述第一dpdk无锁环形队列,待所述目标数据面进程读取,在所述目标数据面进程将所述数据查询指令的回程消息放入所述第二dpdk无锁环形队列后,所述控制面进程中的第二线程从第二dpdk无锁环形队列中读取回程消息,得到所述数据查询指令对应的输出数据,通过数据查询指令的下发和回程消息的获取分别由不同的dpdk无锁环形队列来完成,实现对数据查询指令的处理。

本申请实施例的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本申请实施例而了解。本申请实施例的目的和其他优点可通过在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

附图说明

附图用来提供对本申请实施例技术方案的进一步理解,并且构成说明书的一部分,与本申请实施例的实施例一起用于解释本申请实施例的技术方案,并不构成对本申请实施例技术方案的限制。

图1为本申请实施例提供的多进程数据输出方法的流程图;

图2为本申请实施例提供的多进程数据系统的示意图。

具体实施方式

为使本申请实施例的目的、技术方案和优点更加清楚明白,下文中将结合附图对本申请实施例的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请实施例中的实施例及实施例中的特征可以相互任意组合。

本申请实施例应用于控制面与数据转发平面(简称:数据面)分离的通信设备(如网关、路由器),其中控制面和数据面分离是指分别处于单独的进程运行。典型的,所述通信设备为基于dpdk架构的虚拟设备。

如何将数据面的转发数据正确的通过控制面来输出非常重要。为此,本申请实施例提供一种基于dpdk无锁环形队列的跨进程数据可靠输出的方法,该方案基于超时等待、序列号断点续传等机制,很好的解决了多进程间大容量数据输出遇到的数据乱序、缓存异常等问题。

图1为本申请实施例提供的多进程数据输出方法的流程图。如图1所示,控制面进程通过第一数据平面开发套件dpdk无锁环形队列和第二dpdk无锁环形队列与目标数据面进程通信,所述方法包括:

步骤a01、所述控制面进程中第一线程从所述控制面进程中的控制台接收对所述目标数据面进程的数据查询指令;

步骤a02、所述第一线程将接收到的数据查询指令消息放入所述第一dpdk无锁环形队列,待所述目标数据面进程读取;

步骤a03、在所述目标数据面进程将所述数据查询指令的回程消息放入所述第二dpdk无锁环形队列后,所述控制面进程中的第二线程从第二dpdk无锁环形队列中读取回程消息,得到所述数据查询指令对应的输出数据。

在该方法中,通信设备运行有多个进程,包括1个控制面进程和至少1个数据面进程,典型的各进程分别运行在设备的独立cpu上,即每个进程唯一对应1个cpu。

控制面进程负责指令下发、数据输出等,包括:控制台、第一线程和第二线程,第一线程主要负责接收指令和下发指令给数据面进程,第二线程用于接收数据面进程对于指令的回程消息;

每个数据面进程负责报文转发、指令响应等,存在至少一个数据库,保存有报文转发信息、统计数据等。

其中,控制面进程与任一数据面进程之间共享一个dpdk无锁环形队列1,通过该队列1控制面进程将指令传递给数据面进程,同时控制面进程与任一数据面进程之间还共享另一个dpdk无锁环形队列2,通过该队列2数据面进程将数据回传给控制面进程。假设,数据面进程个数为n,则dpdk无锁环形队列个数为2*n,其中n个dpdk无锁环形队列1,n个dpdk无锁环形队列2。优选的,每个dpdk无锁环形队列的容量大小为32k。

如图2所示,通信设备包括3个cpu,cpu1上运行有控制面进程processa,cpu2上运行有数据面进程processb,cpu3上运行有数据面进程processc。进程a中包括第一线程threada和第二线程threadb,第一线程负责指令接收和下发,第二线程用于接收dpdk无锁环形队列的回传信息。通过两个dpdk无锁环形队列分别完成数据的传输,方便对数据查询指令的处理。

本申请实施例提供的方法,控制面进程中第一线程从所述控制面进程中的控制台接收对所述目标数据面进程的数据查询指令,第一线程将接收到的数据查询指令消息放入所述第一dpdk无锁环形队列,待所述目标数据面进程读取,在所述目标数据面进程将所述数据查询指令的回程消息放入所述第二dpdk无锁环形队列后,所述控制面进程中的第二线程从第二dpdk无锁环形队列中读取回程消息,得到所述数据查询指令对应的输出数据,通过数据查询指令的下发和回程消息的获取分别由不同的dpdk无锁环形队列来完成,实现对数据查询指令的处理。

下面对本申请实施例提供的方法进行说明:

在一个示例性实施例中,所述第一线程在将接收到的数据查询指令消息放入所述第一dpdk无锁环形队列之后,所述第一线程将所述数据查询指令和控制台指针参数写入到全局控制块;

在得到所述输出数据后,所述第二线程从所述全局控制块读取所述控制台指针参数,并利用所述控制台指针参数将所述输出数据存入到所述控制台。

在上述示例性实施例中,全局控制块能够允许第一线程和第二线程访问,通过将数据查询指令和控制指针参数都放入到全局控制块,使得第二线程从全局控制块完成对回程消息的管理,实现利用全局控制块完成对数据查询操作的交互的管理。

在一个示例性实施例中,所述第一线程或所述第二线程在访问所述全局控制块之前,获取所述全局控制块的互斥信号量,并在完成对所述全局控制块的访问后,释放所述互斥信号量,其中所述互斥信号量用于控制所述第一线程和所述第二线程中的一个访问所述全局控制量。

利用互斥信号量实现控制第一线程和第二线程中的一个来访问全局控制量,减少两个线程同时访问的全局控制量所带来的访问冲突。

在一个示例性实施例中,所述数据查询指令包括指令序列号;

所述第二线程在读取回程消息后,获取所述回程消息中的指令序列号;

所述第二线程获取所述数据查询指令中的指令序列号,并将所述回程消息中的指令序列号与所述数据查询指令中的指令序列号进行比较,得到比较结果;

如果所述比较结果为一致,则所述第二线程将所述回程消息中携带的数据组装成所述输出数据。

给每一个数据查询指令都分配序列号,数据面进程回程消息中携带对应接收到的指令序列号,控制面进程中的第二线程接收到回程消息后将消息中的指令序列号和全局变量中存储的最新序列号做对比,不对应即不输出,等待下一次回程消息,跳过若干条回程消息直至指令序列号匹配后,再输出到控制台,结束最新一次的数据查询指令运行。

在一个示例性实施例中,所述回程消息是所述目标数据面进程通过如下方式得到的,包括:

获取所述数据查询指令对应的数据;

判断所述数据容量是否大于预配置的第二dpdk无锁环形队列中单条消息内存大小的上限值;

如果大于所述上限值,则将获取到的数据划分为至少两个数据片段,生成回程消息,且回程消息中携带有索引最小的数据片段及所述索引最小的数据片段的索引;

如果不大于所述上限值,则生成携带有所述数据的回程消息。

由于数据面中的数据容量一般非常庞大,只通过一次交互无法完全上送到控制面,因此,可以将数据查询指令的数据分批多次上送。

在一个示例性实施例中,所述第二线程在读取回程消息后,判断回程消息中是否存在数据索引:

如果存在索引,第二线程将所述回程消息中携带的数据片段组装为输出数据片段,并获取所述回程消息中的分片结束标记字段,判断该回程消息中的数据片段是否为所述数据查询指令的最后一份数据片段;

如果是所述数据查询指令的最后一份数据片段,则所述第二线程将输出数据片段组装成输出数据;

如果不是所述数据查询指令的最后一份数据片段,则所述第二线程获取所述数据查询指令中的数据查询内容,将所述数据查询内容与数据续传索引封装为新的数据查询指令消息后放入所述第一dpdk无锁环形队列,触发所述目标数据面进程将该数据续传索引的数据片段及所述数据续传索引封装成回程消息。

dpdk无锁环形队列单个消息大小是有上限的,如果数据库有大容量数据时,就需要多次交互才可以完整输出。本实施例中数据面能够将大数据分片,并在控制面的配合下多批次上传。特别需要说明的是,数据面需要等待下一条指令的到来才继续下一数据片段的上传,并且指令中要带有数据断点索引,而不并是数据面自动记录每一次的数据断点索引。

在一个示例性实施例中,在完成全局控制块的写入后,所述第一线程为所述数据查询指令获取同步信号量;

在所述第二线程得到所述输出数据后,所述第二线程释放所述同步信号量。

利用同步信号量可以有效协助第一线程和第二线程对数据查询指令进行管理,提高管理效率。

在一个示例性实施例中,在完成全局控制块的写入后,所述第一线程为所述数据查询指令获取同步信号量,并启动对所述同步信号量持有时长的计时;

确定满足如下任一条件时,释放所述同步信号量,清空全局控制块中的信息:

第二线程从第二dpdk无锁环形队列中读取到所述数据查询指令的全部回程消息时,计时时长未达到预设的等待时长;

从开始计时至计时时长达到预设的等待时长的时间窗口内,第二线程未从第二dpdk无锁环形队列中读取到所述数据查询指令的全部回程消息。

控制面进程对同步信号量采用超时等待机制,等待时长可根据实际系统性能情况自行设定,第一线程会在等待时长完毕时无法p成功同步信号量的情况下,将全局控制块中的信息全部清空,以结束本次数据查询指令的响应,等待控制台下发下次数据查询指令。

下面详细介绍本发明实施例提供的技术方案。

实施例一

本实施例提供的多进程数据输出方法包括以下步骤100-104。

步骤100、控制面进程中的控制台向第一线程下发对目标数据面进程的数据查询指令。

其中,数据查询指令内容包括:指令序列号、所要查询的数据类型与数据面进程标识。示例性的,数据类型可包括:转发表项、统计数据等。

步骤101、控制面进程中的第一线程将接收到的数据查询指令消息,放入控制面进程与目标数据面进程通信的dpdk无锁环形队列1。

步骤102、控制面进程中的第一线程对互斥信号量b进行p(获取)操作,p成功后将数据查询指令内容和控制台指针参数写入全局控制块,写入成功后释放互斥信号量b,并对同步信号量a进行p(获取)操作,等待回程消息输出。

其中,互斥信号量b用来保证全局控制块不被第一线程和第二线程同时访问,任何时候只有一个线程使用全局控制块;同步信号量a用于数据查询指令输入与数据输出之间的同步,保证指令输入和数据输出按顺序执行。

步骤103、目标数据面进程从dpdk无锁环形队列1中读取指令消息,响应该指令消息得到回程消息,将回程消息放入控制面进程与目标数据面进程通信的dpdk无锁环形队列2。

在本步骤中,目标数据面进程可以创建一个任务,以轮询的方式访问dpdk无锁环形队列1。指令消息携带有指令序列号、所要查询的数据类型与数据面进程标识。具体的,可按照指令消息中所要查询的数据类型,在本地查找对应的数据;进而,生成携带有指令序列号和查找到的数据的回程消息。

步骤104、控制面进程中的第二线程从dpdk无锁环形队列2中读取回程消息,比较回程消息中的指令序列号是否与全局控制块中的指令序列号一致;

如果比较结果一致,则第二线程将回程消息中携带的查找到的数据组装为输出数据,从全局控制块中取出控制台指针,将输出数据写入控制台以使控制台进行输出,并对同步信号量a进行v(释放)操作;

如果比较结果不一致,则第二线程继续等待,直至收到与全局控制块中的指令序列号一致的回程消息后,将回程消息中携带的查找到的数据组装为输出数据,从全局控制块中取出控制台指针,将输出数据写入控制台以使控制台进行输出,并对同步信号量a进行v操作。

在队列拥塞时,数据面进程向无锁环形队列写入数据可能没有失败,只是被放在队列缓冲区中,但是由于控制面进程中的第二线程没有及时得到调度等原因没有及时读取出来,管理员会发现输入指令没有得到输出,可能就会频繁输入数据查询指令,这样可能在第n次数据查询指令执行时,第二线程接收到之前旧指令的回程消息,此时控制面进程中的第一线程运行的数据查询指令和第二线程接收的数据不对应,会造成控制台输出信息和指令不符,后续无锁环形队列中存储的数据查询指令和数据都会不对应,乱序。

为此,本实施例中采用序列号方式解决该问题,给每一个数据查询指令都分配序列号,数据面进程回程消息中携带对应接收到的指令序列号,控制面进程中的第二线程接收到回程消息后将消息中的指令序列号和全局变量中存储的最新序列号做对比,不对应即不输出,等待下一次回程消息,跳过若干条回程消息直至指令序列号匹配后,再输出到控制台,释放掉同步信号量a,结束最新一次的数据查询指令运行。

实施例二

本实施例以上述实施例一为基础,针对大数据传输的场景进一步优化实施例一提供的技术方案。

步骤200、控制面进程中的控制台向第一线程下发对目标数据面进程的数据查询指令。

其中,数据查询指令内容包括:指令序列号、所要查询的数据类型与数据面进程标识。

步骤201、控制面进程中的第一线程将接收到的数据查询指令消息,放入第一线程与目标数据面进程通信的dpdk无锁环形队列1。

步骤202、控制面进程中的第一线程对互斥信号量b进行p操作,p成功后将数据查询指令内容和控制台指针参数写入全局控制块,写入成功后释放互斥信号量b,并对同步信号量a进行p操作,等待回程消息输出。

步骤203、目标数据面进程从dpdk无锁环形队列1中读取指令消息,解析到该指令消息未携带数据续传索引,响应该指令消息得到回程消息,将回程消息放入控制面进程与目标数据面进程通信的dpdk无锁环形队列2。

在本步骤中,目标数据面进程响应指令消息得到回程消息,可具体包括:

按照指令消息中所要查询的数据类型,在本地查找对应的数据;

判断查找到的数据容量是否大于预配置的dpdk无锁环形队列2中单条消息内存大小的上限;

如果是,则将查找到的数据划分为多个数据片段,生成回程消息,回程消息中携带有对应指令消息中的指令序列号、索引最小的数据片段及其索引;

如果否,则生成携带有指令序列号和查找到的数据的回程消息。

因为数据面中的数据容量一般非常庞大,只通过一次交互无法完全上送到控制面,所以该情况下可以将数据分批多次上送。

步骤204、控制面进程中的第二线程从dpdk无锁环形队列2中读取回程消息,比较回程消息中的指令序列号是否与全局控制块中的指令序列号一致:

(1)序列号一致

第二线程检查回程消息中是否存在数据索引:

①不存在索引时,第二线程将回程消息中携带的查找到的数据组装为输出数据,从全局控制块中取出控制台指针,将输出数据写入控制台以使控制台进行输出,并对同步信号量a进行v操作;

②在存在索引时,第二线程将回程消息中携带的查找到的数据片段组装为输出数据片段,从全局控制块中取出控制台指针,将输出数据片段写入控制台;

第二线程检查回程消息中的分片结束标记字段(命令字cmd),判断该回程消息中查询到的数据片段是否为当前数据查询指令下的最后一份数据片段;

a、如果是,则第二线程对同步信号量a进行v操作;

b、如果否,则第二线程对互斥信号量b进行p操作,p成功后从全局控制块中读取当前数据查询内容,将其与数据续传索引封装为指令消息后放入控制面进程与目标数据面进程通信的dpdk无锁环形队列1,执行步骤205;

其中,数据续传索引根据本次回程消息中的数据索引得到;需要说明的是,所述b情况下并不对同步信号量a进行v操作,第一线程继续等待回程消息输出;

(2)序列号不一致时

第二线程继续等待,直至收到与全局控制块中的指令序列号一致的回程消息后,执行上述(1)步骤。

步骤205、目标数据面进程从dpdk无锁环形队列1中读取指令消息,解析到该指令消息携带数据续传索引后,将本地查找到的该数据续传索引的数据片段及其索引和本次读取到的指令消息中的指令序列号封装成回程消息,放入控制面进程与目标数据面进程通信的dpdk无锁环形队列2。继续执行步骤204。

dpdk无锁环形队列单个消息大小是有上限的,如果数据库有大容量数据时,就需要多次交互才可以完整输出。本实施例中数据面能够将大数据分片,并在控制面的配合下多批次上传。特别需要说明的是,数据面需要等待下一条指令的到来才继续下一数据片段的上传,并且指令中要带有数据断点索引,而不并是数据面自动记录每一次的数据断点索引,目的在于:

数据面进程中一个表头下面会有n个entry数据内容,在控制面要对所有entry数据做格式化排版等功能,还会出现ctrl+c取消回显操作,如果把断点索引放在数据面,在用户执行ctrl+c取消回显后,数据面中断点索引不会清零,后续回显操作无法从头开始。

实施例三

因为数据面进程主要负责数据报文转发,接收控制面消息会因为数据转发占用cpu而导致无锁环形队列出现拥塞。拥塞出现后,可能会导致数据面进程向无锁环形队列中写入数据失败。根据前述实施例方案所述,控制面进程的第一线程在下发数据查询指令后,会处于p同步信号量a等待,如果设置同步信号量a超时为forever(永远),队列拥塞情况的出现会导致控制面进程的第二线程无法接收到回程消息,无法触发同步信号量a的v操作,会造成第一线程卡死。

为此,本实施例对上述实施例一和实施例二的技术方案作进一步优化。控制面进程对同步信号量a采用超时等待机制,等待时长可根据实际系统性能情况自行设定,第一线程会在等待时长完毕时无法p成功同步信号量a的情况下,将全局控制块中的信息全部清空,以结束本次数据查询指令的响应,等待控制台下发下次数据查询指令。

具体的,本实施例提供的技术方案包括以下步骤:

步骤300、控制面进程中的控制台向第一线程下发对目标数据面进程的数据查询指令。

其中,数据查询指令内容包括:指令序列号、所要查询的数据类型与数据面进程标识。

步骤301、控制面进程中的第一线程将接收到的数据查询指令消息,放入控制面进程与目标数据面进程通信的dpdk无锁环形队列1。

步骤302、控制面进程中的第一线程对互斥信号量b进行p操作,p成功后将数据查询指令内容和控制台指针参数写入全局控制块,写入成功后释放互斥信号量b,并对同步信号量a进行p操作,启动超时等待定时器,等待回程消息输出。

步骤303、目标数据面进程从dpdk无锁环形队列1中读取指令消息,解析到该指令消息未携带数据续传索引,响应该指令消息得到回程消息,将回程消息放入第二线程与目标数据面进程通信的dpdk无锁环形队列2。

在本步骤中,目标数据面进程响应指令消息得到回程消息,可具体包括:

按照指令消息中所要查询的数据类型,在本地查找对应的数据;

判断查找到的数据容量是否大于预设的dpdk无锁环形队列2中单条消息内存大小的上限;

如果是,则将查找到的数据划分为多个数据片段,生成回程消息,回程消息中携带有对应指令消息中的指令序列号、索引最小的数据片段及其索引;

如果否,则生成携带有指令序列号和查找到的数据的回程消息。

步骤304、控制面进程中的第二线程从dpdk无锁环形队列2中读取回程消息;

(1)在超时等待定时器超时前读取到回程消息

当全局控制块中的控制台指针有效且指令序列号与读取到的回程消息中的指令序列号一致时,第二线程检查回程消息中是否存在数据索引:

①不存在索引时,第二线程将回程消息中携带的查找到的数据组装为输出数据,从全局控制块中取出控制台指针,将输出数据写入控制台以使控制台进行输出,并对同步信号量a进行v操作;

②存在索引时,第二线程将回程消息中携带的查找到的数据片段组装为输出数据片段,从全局控制块中取出控制台指针,将输出数据片段写入控制台;

第二线程检查回程消息中的分片结束标记字段(命令字cmd),判断该回程消息中查询到的数据片段是否为当前数据查询指令下的最后一份数据片段;

a、如果是,则第二线程对同步信号量a进行v操作;

b、如果否,则第二线程对互斥信号量b进行p操作,p成功后从全局控制块中读取当前数据查询内容,将其与数据续传索引封装为指令消息后放入控制面进程第一线程与目标数据面进程通信的dpdk无锁环形队列1,对互斥信号量b进行v操作,执行步骤305。

当全局控制块中的控制台指针无效,或者,指令序列号与读取到的回程消息中的指令序列号不一致时,丢弃本次回程消息,不作其它处理。

(2)在超时等待定时器超时时未读取到回程消息

控制面进程中的第一线程结束对回程消息输出的等待,释放同步信号量a,清空全局控制块中的信息;

后续,控制面进程中的第二线程读取到回程消息后,对互斥信号量b执行p操作,p成功后检查全局控制块中控制台指针已经无效,或者回程消息中的指令序列号与全局控制块中的不一致,不再执行数据输出,v(释放)掉互斥信号量b,轮询等待下一次回程消息。

步骤305、目标数据面进程从dpdk无锁环形队列1中读取指令消息,解析到该指令消息携带数据续传索引后,将本地查找到的该数据续传索引的数据片段及其索引和本次读取到的指令消息中的指令序列号封装成回程消息,放入控制面进程与目标数据面进程通信的dpdk无锁环形队列2。继续执行步骤304。

在本实施例中,控制面进程中的等待时长(即超时等待定时器的定时时长)如何确定非常重要。该等待时长过长,会影响控制面进程中其它线程业务正常处理,等待时长过短,会放大控制面进程与数据面进程之间队列拥塞的影响,出现回程消息频繁失效,无法完整输出数据问题,只有选择合适的等待时长才能使系统整体运行平稳且数据输出准确。下面介绍两种确定控制面进程中等待时长的方法。

方法一

等待时长是通过如下方式得到的,包括:

在所述第一线程启动计时操作之前,所述第一线程获取控制面进程的cpu和目标数据面进程的cpu的运行状态;以及,所述第一dpdk无锁环形队列的缓存的第一占用率和所述第二dpdk无锁环形队列的缓存的第二占用率,得到运行信息;

根据所述运行信息,确定本次计时操作对应的等待时长。每次控制面进程中的第一线程启动超时等待定时器进行计时之前,获取控制面进程和目标数据面进程的cpu利用率,以及,控制面进程的两个线程与目标数据面进程通信的两个dpdk无锁环形队列的缓存占用率;

在上述实现方式中,可以查找预先创建的如下映射关系,确定本次获取结果对应的等待时长,其中该映射关系包括4个参数与等待时长的对应关系,其中该4个参数包括控制面进程的cpu利用率、目标数据面进程的cpu利用率、dpdk无锁环形队列1的缓存占用率以及dpdk无锁环形队列2的缓存占用率。

在一个示例性实施例中,所述运行信息包括控制面进程的cpu的第一利用率和目标数据面进程的cpu的第二利用率,以及,所述第一dpdk无锁环形队列的缓存的第一占用率和所述第二dpdk无锁环形队列的缓存的第二占用率;

其中,所述根据所述运行信息,确定本次计时操作对应的等待时长,包括:

将得到每个运行信息与各自的负载范围进行比较,得到cpu和缓存队列的负载状态信息;

根据所述负载状态信息,确定本次计时操作对应的等待时长。

例如,可以设置4个运行信息中的3个符合各自的预设的高负载的条件,则确定该等待时长为预设的最长等待时长t1;或者,可以设置4个运行信息中的2个符合各自的高负载的条件,则确定该等待时长为预设的第二时长t2,其中t2小于t1;或者,可以设置4个运行信息中的1个运行信息符合各自的预设的高负载条件,则确定该等待时长为预设的最小等待时长为最小等待时长t3,其中t3小于t2。

可以定义控制面进程a与目标数据面进程b之间的两个dpdk无锁环形队列的缓存占用率分别为queue-ratio-ab、queue-ratio-ba,定义进程a、进程b的cpu利用率分别为cpu-usage-a、cpu-usage-b。

在该方式中,可以由本领域技术人员根据经验预测选择不同等待时长t会出现的影响其他线程业务、消息丢失、任务卡死等问题的概率,典型的,将t在0(不等待)、1分钟、3分钟、5分钟、forever(永远等待)这6种值中选择。0代表此时所要查询的数据获取和输出不应该执行,因为无论等待多久都会很大概率出现上述问题。1、3、5表示此时整个系统有余力处理此次转发数据获取和输出,但是随着对系统的整体影响程度以及消息丢失概率等会选择不同的t值以降低不良影响程度。forever(永远等待)表示此时系统非常空闲,可以有充足时间等待,一般情况下选择forever(永远等待)的场景,实际会等待很短的时间便会有消息输出,因为系统比较空闲。

表1为不同队列缓存占用率和cpu利用率下对应t值,列出在不同队列缓存占用率和cpu利用率下选择t的大小,x表示任意。

表1

注:表格中未列出的部分组合,代表实际不会出现的情况,例如cpu-usage-a和cpu-usage-b都低于50%的时候,queue-ratio-ab和queue-ratio-ba不会出现高值,缓存不会积累较多,

可以通过获取到的运行状态信息,从表格中确定等待时长。选择上述表格中推荐的t值,可以很大程度上降低不合理t值对系统的不良影响。

方法二

所述等待时长是第一线程或第二线程通过如下方式得到的,包括:

记录第二线程在所述时间窗口内对回程消息的读取情况;

根据不同的读取情况,分不同策略更新等待时长。

其中,等待时长为全局变量,存储在全局控制块中。

控制面进程中初始化一个等待时长t的全局变量,保存在全局控制块中,第一线程和第二线程通过互斥信号量b访问修改t,系统启动时t初始化为2分钟。之后记录每次指令输入到完成实际使用的时间t(单位:秒),通过t参数经过一系列计算得出新t值,来修改全局变量t,后续指令输入直接使用t等待。

第一种情况:

如果读取情况为所述时间窗口内未读取到所述数据查询指令的任何回程消息,本次指令是由于t超时没有收到回程消息造成的结束,实际使用时间t等于t,则如果等待时长小于预设的最小时长,则增加等待时长的数值;如果等待时长大于所述最小时长且小于预设的最大时长,则保持等待时长的数值不变;如果等待时长大于所述最大时长,则减小等待时长的数值。

上述第一种情况的出现说明系统出现了拥塞,不同拥塞程度处理不同:

a、如果t小于1分钟,系统拥塞程度可能不严重,等待时间t相对过短,,回程消息在队列中延迟而非丢弃的概率比较大,所以需要增大t,对t乘以2倍得出新t值,这样下一下指令回程消息能够更大概率得到处理;

b、如果t在1分钟和3分钟之间,说明系统拥塞程度较重,不能再继续增大t,否则会过度影响系统其它功能运转,也不能减小,否则下一次指令仍然无法正常处理,所以t保持不变;

c、如果t大于3分钟,说明系统拥塞程度很严重,需要将t值降低,否则会严重影响系统其它功能运转,将t值设置为初始值2分钟;

第二种情况:

如果读取情况为所述时间窗口内读取到所述数据查询指令的全部回程消息,则本次指令在t超时之前收到了所有回程消息完成全部回显,实际使用时间t小于t,说明系统当前负载较低,可以获取所述数据查询指令响应的实际耗时,其中该耗时由从设置到释放所述同步信号量的时间段确定;将当前的等待时长更新为该实际耗时加上预设的富余量、

情况2的出现说明系统当前负载较低,t值使用实际时长t加上一些富余量即可,将t值设置为t+30秒;

第三种情况:

如果读取情况为所述时间窗口内读取到所述数据查询指令的部分回程消息,表示本次数据查询指令在t超时之前收到了部分回程消息,输出了部分回显,后续t超时,没有将后续回程消息输出,实际使用时间t等于t,说明系统可能出现拥塞,或者t值设置不合理。

如果等待时长小于预设的最小时长,则利用预设的第一系数和等待时长的数值,增加等待时长的数值;如果等待时长大于所述最小时长且小于预设的最大时长,则利用预设的第一系数和等待时长的数值,增加等待时长的数值,其中所述第二系数小于所述第二系数;如果等待时长大于所述最大时长,则保持等待时长的数值不变。

a、如果此时t小于1分钟,说明t值过短,数据量大较大,导致数据没有回显完成,需要增大t值,对t乘以2倍得出新t值;

b、如果此时t在1分钟和3分钟之间,如果数据量过大,t值相对较小,如果数据量不大,说明系统出现了拥塞,所以要适当增大t,但不能过大,以免过度影响系统其它功能运转,所以对t乘以1.5倍得出新t值;

c、如果此时t在3分钟和5分钟之间,说明数据量过大并且系统出现了拥塞,但是拥塞并不是很严重,为了避免过度影响系统其它功能运转,t不能增大,为了获取更多的数据,t也不能再减小,所以t保持不变;

该方法通过结合当前系统实际运转时长来预先决定下一次指令的等待时长,能够保证t值始终在5分钟以内,不会过度影响整体系统运转。而且在系统整体负载发生变化时,能够及时灵活得修改t值,三种情况之间会来回切换,使其始终在一个合理范围内。

本方案使用dpdk无锁环形队列,序列号断点续传,同步信号量,互斥信号量等基础技术结合起来形成一套完整的技术解决方案,全方位全面解决多进程间大容量数据输出业务场景中可能出现的由于消息丢失、队列拥塞导致的数据乱序、多线程访问控制台buffer异常等棘手问题。

本申请实施例提供一种存储介质,所述存储介质中存储有计算机程序,其中,所述计算机程序被设置为运行时执行上文任一项中所述的方法。

本申请实施例提供一种电子装置,包括存储器和处理器,所述存储器中存储有计算机程序,所述处理器被设置为运行所述计算机程序以执行上文任一项中所述的方法。

本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些组件或所有组件可以被实施为由处理器,如数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读介质上,计算机可读介质可以包括计算机存储介质(或非暂时性介质)和通信介质(或暂时性介质)。如本领域普通技术人员公知的,术语计算机存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1