一种解决virtio协议下报文与主机缓存匹配的方法与流程

    专利查询2026-07-21  13


    本发明涉及网络通信,具体涉及一种解决virtio协议下报文与主机缓存匹配的方法。


    背景技术:

    1、对于virtio报文,网卡在处理完成上送到主机前,需要提前获取主机对于该报文的存储信息,这一存储信息中包括主机缓存空间的大小,报文上送后的缓存地址等信息。之后比较需要上送的报文包长与缓存空间的大小,当处于virtio merge buffer模式下,一个完整的数据报可以拆分成多份,由多个缓存空间分别存储;当处于virtio normal模式下,一个完整的数据报必须存储在一个缓存空间中。当完成了报文和缓存空间的匹配后,网卡将报文携带缓存地址信息一起上送至主机中。

    2、当接收到virtio报文时,网卡内基于设定的处理流程,软件除了需要完成正常的报文处理流程以外,还需从主机侧拉取主机缓存信息,完成报文与缓存的匹配等处理,对应会消耗掉网卡大量的处理能力。除此之外,在merge buffer模式下,当报文或主机缓存信息被读取后,如果发现当前的缓存空间总和都不足以存储下一个完整数据报时,还需继续从主机侧拉取更多的主机缓存信息,在整个过程中需要保持报文的保序以及主机缓存信息的连贯。上述所有的操作,均需要消耗网卡的内核资源,对应的会影响网卡的处理性能。


    技术实现思路

    1、发明目的:本发明所要解决的技术问题是针对现有技术的不足,提供一种解决virtio协议下报文与主机缓存匹配的方法,包括:建立主机缓存管理模块和流量管理模块;

    2、所述主机缓存管理模块用于向主机发出获取主机缓存信息的请求;

    3、所述流量管理模块用于进行流量管理;

    4、然后执行以下步骤:

    5、步骤1,在网卡初始化阶段,主机缓存管理模块向主机发出获取主机缓存信息的请求,主机基于所述请求,向网卡下发主机缓存信息,由网卡进行提前缓存;

    6、步骤2,当网卡接收到virtio报文后,在内核完成报文的处理后,向流量管理模块发送报文描述符,流量管理模块完成对报文描述符的缓存,并开始进行流量管理;流量管理通常包括调度器scheduler和速率整形shaper等功能,速率整形shaper,是指对调度器的出口配置一个固定速率,能够使得这个出口的出包速率固定在这个配置值内,调度器scheduler可通过配置不用调度规则(例如sp,dwrr,wfq等等)和多级调度,加上shaper的限速,从而完成对对应端口的调度;

    7、步骤3,流量管理模块基于配置的流量分配(一般人为基于报文目的地的vf/pf,对不同的报文进行队列分配,再基于不同的vf/pf,配置对应的优先级和带宽,最终映射到流量分配模块上实现对于host侧pcie vf/pf的流量分配),向对应队列的报文描述符提供授权,对应队列的报文描述符与步骤1中缓存的主机缓存信息进行匹配;

    8、步骤4,当报文与主机缓存信息能够满足virtio协议要求后,流量管理模块基于报文描述符拉取实际报文,并结合主机缓存信息,将报文正确传输到主机对应的缓存地址中。

    9、步骤1中,在网卡初始化完成后,建立队列(可以基于报文最终去往的目的地划分队列,通常报文会去往pcie不同的vf/pf,再通过pcie送往host主机。如果要对于主机接收的报文进行流量分配,通常是基于pcie的vf/pf进行分配。所以对于不同的vf/pf,可以分配不同的队列号,而去往对应vf/pf的报文则打上对应的队列号。除此之外,也可以同一vf/pf内部的不同报文类型划分队列,将这些队列挂载在同一个调度器下,那么这个调度器的出口就对应了某一个vf/pf,再将多个调度器的出口续接到次一级的调度器上,又能够完成不同vf/pf之间的流量分配,这也就是我们说的映射和流量分配。最后,不管以何种方式划分队列,对于单个队列,都必须遵循先入先出的规则),并基于队列配置每个队列独享的存储空间,以及所有队列都能够使用的共享的存储空间。

    10、步骤1中,基于队列能够进行virtio模式的配置,virtio能够配置为virtionormal模式与virtio merge buffer模式(virtio是一种虚拟接口技术,用于主机接收信息。通过给报文分配虚拟空间的方式将报文进行存储。该专利中主要负责将实际报文与虚拟空间进行匹配。实现虚拟空间和报文的充分利用,将报文以符合virtio协议要求的方式充分填充在对应的虚拟空间中。主机获取报文的时候,会将其对应的虚拟空间一起提取,经过转换后存入到实际的内存地址中。virtio normal1对应的方式就是一个虚拟空间只用于存储一个报文,不允许多个虚拟空间分别存储报文的部分进行拼接;virtio merge buffer模式对应的方式是一个完整的报文可以由多个虚拟空间进行拼接存储,每个虚拟空间可以存储报文的一部分);

    11、当队列配置在virtio normal模式时,进行报文和主机缓存信息匹配时依据如下规则:主机缓存的一个缓存空间用于存储一个报文,即使主机缓存存放有一个报文后还有冗余空间,剩余冗余空间也不会给第二个报文使用;如果主机的缓存空间无法容纳一个完整的报文时,网卡上报异常中断,并丢弃对应报文和主机缓存信息;

    12、当队列配置在virtio merge buffer模式下,进行报文和主机缓存信息匹配时依据如下规则:在virtio normal模式的基础上,当存在主机的缓存空间无法容纳一个完整的报文时,允许两个以上主机缓存共同存储数据报文,当主机的缓存空间无法容纳一个完整的报文时,网卡不再上报异常,而是继续获取下一个主机缓存信息,直到能够完整存储下一个数据报文。

    13、步骤1中,基于配置的队列和每个队列分配的空间,由硬件自动向主机发起获取主机缓存信息的请求(这里的硬件指的是芯片,芯片内部有一个模块,其功能就是在配置了队列后,从主机拉取对应的缓存信息,如果主机已经有准备好了的缓存信息,则直接下发到芯片内对应模块,如果没有,则会在一段时间后再次拉取),当主机下发了对应的主机缓存信息后,依照队列依次进行存储;此外,还需记录队列中当前所有主机缓存信息对应的缓存空间总和,用于virtio merge buffer模式下的匹配比较。

    14、步骤1中,所述主机缓存信息包括主机缓存空间的大小和缓存空间在主机中的起始地址(这里的主机缓存空间,就是virtio协议中,分配的一段虚拟空间,用于存储实际报文,主机需要解析这段虚拟地址,从而获取真实的存储空间,并将报文内的数据放置到对应的位置上);

    15、所述主机缓存空间用于存储实际数据报文;

    16、所述起始地址用于存储接收的报文。

    17、步骤1中,用于拉取主机缓存的主机缓存管理模块基于队列对主机缓存信息进行管理。网卡初始化完成后,配置每个队列能够存储(预取)的主机缓存信息数量。后续主机会定时向网卡中的主机缓存管理模块下发已准备完成的主机缓存信息数目与主机缓存信息在主机中的存储地址;当满足以下任一条件时,主机缓存管理模块将基于主机下发的主机缓存信息在主机中的存储地址,从主机中读取到主机缓存信息:

    18、条件1:队列中已存储的主机缓存信息数量还未达到可预取的最大值(预取的最大值和链表深度存在一定关联,也和主机缓存模块拉取主机缓存信息的延迟有关。例如在连续出现主机缓存信息出队的情况下,每个主机缓存信息出队的间隔时间为t,而主机缓存管理模块向主机拉取主机缓存信息从发起请求,到主机缓存信息返回的时间为t,那么这里的可预取的最大值就不能小于t/t。如果配置了n个队列,链表的总深度为n,网卡能处理的最长包匹配最小主机缓存信息时,需要消耗的主机缓存信息个数为m,那么这个最大值也不能超过(n-n*m)/n),且主机缓存管理模块接收到的主机内为所述队列已准备好的主机缓存信息还未全部被拉取,此时继续向主机发起拉取主机缓存信息的请求;

    19、条件2:主机缓存管理模块接收到的主机内为队列已准备好的主机缓存信息还未全部被拉取,且即使存储的主机缓存信息数量已达到可预取的最大值,但当前已缓存的主机缓存信息所对应的缓存空间之和仍无法存储下一个完整数据报时,主机缓存管理模块会继续向主机发起拉取主机缓存信息的请求,直到已缓存的主机缓存信息所对应的缓存空间之和能够存储下一个完整数据报。

    20、步骤1中,在主机缓存管理模块内部维护一个链表模块进行队列管理;所述链表模块包含两套链表,其中一套负责存储和处理报文描述符,另一套负责存储和处理主机缓存信息。

    21、步骤1中,所述链表通过维护头指针、尾指针、下一跳、空闲指针、链表序号和链表空状态来存储报文和主机缓存信息。

    22、步骤1中,当满足以下三种情况的任一种时,主机缓存管理模块会自动向主机发起获取主机缓存信息的请求:

    23、第一种情况,在完成队列的配置后,硬件自动拉取主机缓存信息直至所有队列的独享存储空间都完成了主机缓存信息的存储;

    24、第二种情况,当某一队列中存储的主机缓存信息完成与报文匹配并出队完成后,如果此时当前队列的独享存储空间存在空闲,主机缓存管理模块会继续向主机拉取新的主机缓存信息并入队到队列末尾,直至独享存储空间都完成了主机缓存信息的存储;

    25、第三种情况,对于virtio merge buffer模式,建立报文缓存匹配模块,所述报文缓存匹配模块将报文和虚拟缓存地址进行一一对应,并打包在一起后通知host主机去进行解析和处理;

    26、如果出现独享存储空间内存储的主机缓存信息对应的主机缓存空间都无法存放下一个完整数据报时,报文缓存匹配模块会告知主机缓存管理模块,主机缓存管理模块会再次向主机发起拉取主机缓存信息的请求,新获取的主机缓存信息存储到共享的存储空间内,并入队在队列的末尾。

    27、第二种情况和第三种情况中,入队包括如下步骤:

    28、步骤1-1,基于队列,获取入队链表序号;

    29、步骤1-2,基于链表序号,操作对应的链表:读取链表的空状态,读取空闲指针,读取尾指针;

    30、步骤1-3,将数据存储在空闲指针对应的存储地址中,基于当前链表的状态,维护指针:如果当前链表为空状态,则同时将空闲指针写入到头指针与尾指针中,并将链表状态更新为非空状态;如果当前链表为非空状态,则以尾指针为写地址,将空闲指针写入到下一跳表格中,同时使用空闲指针替换原有尾指针。

    31、步骤2中,所述报文描述符记录了报文的全部信息,包括报文包长(用于完成报文与主机缓存信息的匹配)、报文在网卡内的存储地址(用于出队完成后,从网卡中获取实际报文)和报文所属队列等信息;使用报文描述符来进行队列和流量管理能够有效节省流量管理模块的缓存空间大小。

    32、步骤2中,所述流量管理模块内基于队列维护报文描述符,并使用链表来进行队列管理。

    33、步骤3中,当存储有报文的队列中,同时还存在未被消耗的主机缓存信息时,则队列参与到流量管理模块的调度;流量管理模块基于业务配置调度规则(所述业务配置调度规则是指,依据实际业务,按照pcie vf/pf映射的流量带宽分配。例如视频语音通话相关业务的流量优先级就比较高,需要尽快传输;音乐视频播放的优先级就稍微低一些),支持sp、dwrr、rr调度方式(sp :strict priority,严格优先级调度;dwrr :deficit weight roundrobin,负载权重轮询调度;rr:round robin,轮询调度),还支持添加速率整形shaper进行限速;调度基于当前的调度结果,向对应的队列输出出队授权。

    34、步骤3中,当对应的队列接收到出队授权后,链表执行出队操作,在获取到链表中存储的报文描述符和主机缓存信息后,基于当前virtio模式配置进行报文匹配。

    35、步骤3中,所述基于当前virtio模式配置进行报文匹配,如果当前队列配置为virtio merge buffer模式,遵循如下判断规则来控制报文与主机缓存信息的出队:

    36、步骤3-a1,如果当前报文描述符中记录的报文长度小于当前队列中所有主机缓存信息对应的缓存空间之和,则完成对主机缓存信息的出队,并记录当前已出队的主机缓存信息对应的缓存空间之和;

    37、步骤3-a2,当队列中当前的主机缓存信息与之前已出队的主机缓存信息对应的缓存空间之和大于等于报文描述符中报文的包长时,报文描述符与主机缓存信息同时进行出队;

    38、步骤3-a3,如果当前报文描述符中记录的报文长度仍大于当前队列中所有主机缓存信息对应的缓存空间之和,则说明即使当前队列中所有主机缓存信息全部出队也无法支持当前报文的存储,此时向所述主机缓存管理模块发出拉取请求,请求主机缓存管理模块继续向主机发出拉取请求,从而使得队列获得更多的主机缓存信息。

    39、所述基于当前virtio模式配置进行报文匹配,如果当前队列配置为virtionormal模式,遵循如下判断规则来控制报文与主机缓存信息的出队:

    40、步骤3-b1,如果当前报文描述符中记录的报文长度小于等于当前主机缓存信息对应的缓存空间,报文描述符与主机缓存信息同时进行出队;

    41、步骤3-b2,如果当前报文描述符中记录的报文长度大于当前主机缓存信息对应的缓存空间,此时主机下发的缓存空间无法满足协议要求,报文描述符与主机缓存信息同时进行出队,并执行丢包操作,同时向主机上报异常。

    42、所述报文描述符与主机缓存信息同时进行出队,包括如下步骤:

    43、步骤3-c1,链表模块接收到向对应的队列输出出队授权(进行匹配的报文与主机缓存空间一定是具有相同队列号的,在匹配成功后,进行出队的也就是正在进行匹配的这个队列。这里的队列就是之前说的需要与实际业务进行一一映射的最小粒度。根据业务需求,如果只需要做vf/pf之间的流量管理,那么每个vf/pf就分配一个独立的队列号;如果需要做具体业务之间的流量管理,那么每种业务类型,就需要分配一个独立的队列号。不同队列号之间的报文和主机缓存空间信息使用链表进行存储),存储报文描述符的链表与存储主机缓存信息的链表同时基于队列号获取当前队列头指针;

    44、步骤3-c2,基于当前队列头指针,获取头指针指向的存储地址和当前队列的下一跳指针信息,从存储地址中读取报文描述符和主机缓存信息;

    45、步骤3-c3,当满足出队条件时(即报文与主机缓存空间信息完成匹配),使用步骤3-c2获取的下一跳指针信息作为新的头指针,进行当前队列的头指针更新;同时将已完成出队的头指针放入空闲指针池内,供下次入队时使用;

    46、步骤3-c4,当不满足出队条件时,退出当前出队流程,不改写当前队列的头指针,也不对头指针进行回收。

    47、所述存储主机缓存信息的链表和存储报文描述符的链表,因为存在同一队列的主机缓存信息与报文描述符连续出队,为了吸收步骤3-c1~步骤3-c2所消耗的时延,通过使用两个以上链表的方式,保证在链表完成步骤3-c1~步骤3-c2后,依照链表的切换顺序,保证出队的主机缓存信息与报文描述符连续不断,具体包括如下步骤:

    48、步骤3-d1,链表模块接收到调度输出的授权后(调度授权是指所述流量管理模块按照业务类型划分了很多种的队列,不同队列之间出包顺序有先后区别,哪个队列有先出队,哪个队列推迟出队,都是基于调度的规则,与实际应用时的需求有关联;当调度模块确认哪个队列可以出队后,会向链表发送这个即将可以出队的队列的队列号,链表基于队列号,完成这个队列的预出队),基于授权队列,获取出队链表序号;

    49、步骤3-d2,基于出队链表序号,操作对应的链表,读取链表的头指针;

    50、步骤3-d3,以头指针为地址,读取已存储的报文描述符和主机缓存信息,读取对应下一跳信息;

    51、步骤3-d4,将读出的报文描述符和主机缓存信息进行virtio协议匹配,基于匹配结果,完成对报文描述符和主机缓存的输出;当确认输出后,将当前头指针回收,将下一跳信息作为读地址,获取新的报文描述符、主机缓存信息和下一跳信息;

    52、步骤3-d5,基于步骤3-d2~步骤3-d4的时延,通过同一队列下的两个以上链表的循环切换,吸收读取表项信息和协议匹配的时延,使得没有流控且存储报文描述符和主机缓存信息充足的情况下,每一拍都能够输出,从而保证存在一定的加速比,用于吸收出队操作过程中的时延。

    53、步骤4中,所述流量管理模块基于报文描述符中记录的网卡内报文存储地址,按照对应字节序依次拉取实际报文,并输出至后级报文拼接模块;当主机缓存信息完成出队后,直接输出至后级报文拼接模块。

    54、步骤4中,所述报文拼接模块将实际报文与主机缓存信息进行拼接,并最终送往主机侧。

    55、本方法中,为了保证能够支持virtio merge buffer模式,各队列在存储主机缓存时,需要维护当前队列中所有主机缓存信息对应缓存空间之和。当进行匹配时,优先判断当前报文描述符中记录的报文包长与当前队列中所有主机缓存信息对应缓存空间之和的大小,只有缓存空间之和大于数据包长时,报文描述符与主机缓存信息方可进行出队操作。

    56、本发明涉及网络传输过程中,网卡处理virtio协议的报文时,需要完成报文与报文接收端主机内缓存空间的匹配工作。通过特定的处理结构,使用尽可能少的软件干预,在软件完成报文处理后,于流量管理模块中完成主机缓存信息获取,报文流量管理,报文和主机缓存的匹配,并在处理完成后正确的将报文传输到主机对应的缓存空间中。

    57、本发明具有如下有益效果:使用本发明提供的方法后,能够大量减少cpu在相关业务中的用于匹配报文和主机缓存空间的资源消耗,从而节约算力用于处理实际应用。同时本方法通过多链表的方式,能够在匹配不报错的情况下完成报文的连续输出,从而吸收队列切换,匹配失败等情况下产生的带宽损耗,最终满足芯片的性能要求。


    技术特征:

    1.一种解决virtio协议下报文与主机缓存匹配的方法,其特征在于,包括:建立主机缓存管理模块和流量管理模块;

    2.根据权利要求1所述的方法,其特征在于,步骤1中,在网卡初始化完成后,建立队列,并基于队列配置每个队列独享的存储空间,以及所有队列都能够使用的共享的存储空间。

    3.根据权利要求2所述的方法,其特征在于,步骤1中,基于队列能够进行virtio模式的配置,virtio能够配置为virtio normal模式与virtio merge buffer模式;

    4.根据权利要求3所述的方法,其特征在于,步骤1中,基于配置的队列和每个队列分配的空间,由硬件自动向主机发起获取主机缓存信息的请求,当主机下发了对应的主机缓存信息后,依照队列依次进行存储;此外,还需记录队列中当前所有主机缓存信息对应的缓存空间总和,用于virtio merge buffer模式下的匹配比较。

    5.根据权利要求4所述的方法,其特征在于,步骤1中,所述主机缓存信息包括主机缓存空间的大小和缓存空间在主机中的起始地址;

    6.根据权利要求5所述的方法,其特征在于,步骤1中,用于拉取主机缓存的主机缓存管理模块基于队列对主机缓存信息进行管理;网卡初始化完成后,配置每个队列能够存储的主机缓存信息数量,后续主机会定时向网卡中的主机缓存管理模块下发已准备完成的主机缓存信息数目与主机缓存信息在主机中的存储地址;当满足以下任一条件时,主机缓存管理模块将基于主机下发的主机缓存信息在主机中的存储地址,从主机中读取到主机缓存信息:

    7.根据权利要求6所述的方法,其特征在于,步骤1中,在主机缓存管理模块内部维护一个链表模块进行队列管理;所述链表模块包含两套链表,其中一套负责存储和处理报文描述符,另一套负责存储和处理主机缓存信息。

    8.根据权利要求7所述的方法,其特征在于,步骤1中,所述链表通过维护头指针、尾指针、下一跳、空闲指针、链表序号和链表空状态来存储报文和主机缓存信息。

    9.根据权利要求8所述的方法,其特征在于,步骤1中,当满足以下三种情况的任一种时,主机缓存管理模块会自动向主机发起获取主机缓存信息的请求:

    10.根据权利要求9所述的方法,其特征在于,第二种情况和第三种情况中,入队包括如下步骤:

    11.根据权利要求10所述的方法,其特征在于,步骤2中,所述报文描述符记录了报文的全部信息,包括报文包长、报文在网卡内的存储地址和报文所属队列等信息;使用报文描述符来进行队列和流量管理能够有效节省流量管理模块的缓存空间大小。

    12.根据权利要求11所述的方法,其特征在于,步骤2中,所述流量管理模块内基于队列维护报文描述符,并使用链表来进行队列管理。

    13.根据权利要求12所述的方法,其特征在于,步骤3中,当存储有报文的队列中,同时还存在未被消耗的主机缓存信息时,则队列参与到流量管理模块的调度;流量管理模块基于业务配置调度规则,支持sp、dwrr、rr调度方式,还支持添加速率整形shaper进行限速;调度基于当前的调度结果,向对应的队列输出出队授权。

    14.根据权利要求13所述的方法,其特征在于,步骤3中,当对应的队列接收到出队授权后,链表执行出队操作,在获取到链表中存储的报文描述符和主机缓存信息后,基于当前virtio模式配置进行报文匹配。

    15.根据权利要求14所述的方法,其特征在于,步骤3中,所述基于当前virtio模式配置进行报文匹配,如果当前队列配置为virtio merge buffer模式,遵循如下判断规则来控制报文与主机缓存信息的出队:

    16.根据权利要求14所述的方法,其特征在于,所述基于当前virtio模式配置进行报文匹配,如果当前队列配置为virtio normal模式,遵循如下判断规则来控制报文与主机缓存信息的出队:

    17.根据权利要求15或16所述的方法,其特征在于,所述报文描述符与主机缓存信息同时进行出队,包括如下步骤:

    18.根据权利要求17所述的方法,其特征在于,所述存储主机缓存信息的链表和存储报文描述符的链表,因为存在同一队列的主机缓存信息与报文描述符连续出队,为了吸收步骤3-c1~步骤3-c2所消耗的时延,通过使用两个以上链表的方式,保证在链表完成步骤3-c1~步骤3-c2后,依照链表的切换顺序,保证出队的主机缓存信息与报文描述符连续不断,具体包括如下步骤:

    19.根据权利要求18所述的方法,其特征在于,步骤4中,所述流量管理模块基于报文描述符中记录的网卡内报文存储地址,按照对应字节序依次拉取实际报文,并输出至后级报文拼接模块;当主机缓存信息完成出队后,直接输出至后级报文拼接模块。

    20.根据权利要求19所述的方法,其特征在于,步骤4中,所述报文拼接模块将实际报文与主机缓存信息进行拼接,并最终送往主机侧。


    技术总结
    本发明提供了一种解决virtio协议下报文与主机缓存匹配的方法,包括:步骤1,主机缓存管理模块向主机发出获取主机缓存信息的请求,网卡提前缓存主机缓存信息;步骤2,网卡完成报文的处理,向流量管理模块发送报文描述符,流量管理模块完成对报文描述符的缓存,进行流量管理;步骤3,流量管理模块提供授权,报文描述符与缓存的主机缓存信息进行匹配;步骤4,当报文与主机缓存信息满足要求后,流量管理模块基于报文描述符拉取实际报文,并结合主机缓存信息,将报文正确传输到主机对应的缓存地址中。使用本发明提供的方法后,能够大量减少CPU在相关业务中的用于匹配报文和主机缓存空间的资源消耗,从而节约算力用于处理实际应用。

    技术研发人员:华瑞东,卢笙
    受保护的技术使用者:芯云晟(杭州)电子科技有限公司
    技术研发日:
    技术公布日:2024/11/26
    转载请注明原文地址:https://tc.8miu.com/read-37344.html

    最新回复(0)