异步拷贝方法和装置转让专利

申请号 : CN201910950581.8

文献号 : CN110865953B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 李丁丁陈振科刘海汤庸

申请人 : 华南师范大学

摘要 :

本发明公开了异步拷贝方法和装置,方法包括以下步骤:获取异步拷贝请求;根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合,其中通道集合包括至少一通道;根据通道集合和异步拷贝请求,进行异步拷贝。通过本发明的通道分配算法进行通道分配,能根据异步拷贝请求提供合适的通道,利用合适的通道进行异步拷贝的任务,能将多通道的优势最大化,提高异步拷贝的性能。本发明作为一种异步拷贝方法和装置,可广泛应用于数据传输技术领域。

权利要求 :

1.异步拷贝方法,其特征在于,包括以下步骤:获取异步拷贝请求;

根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合,其中通道集合包括至少一通道;

根据通道集合和异步拷贝请求,进行异步拷贝;

所述根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合的步骤中,包括以下步骤:根据异步拷贝请求和预设阈值确定待分配通道数量;

获取通道的热度系数;

根据热度系数,确定候选通道组合;

确定候选通道组合中候选通道的数量是否大于或等于待分配通道数量;

若是,从候选通道中选取与待分配通道数量相同的候选通道,作为所述通道集合;

否则,增加补充通道,将补充通道与候选通道作为所述通道集合。

2.根据权利要求1所述异步拷贝方法,其特征在于:所述根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合的步骤中,包括以下步骤:获取权限;

根据获取权限后的异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合。

3.根据权利要求1所述异步拷贝方法,其特征在于:还包括以下步骤:根据通道集合,更新通道的热度系数。

4.根据权利要求1所述异步拷贝方法,其特征在于:所述增加补充通道,将补充通道与候选通道作为所述通道集合的步骤中,包括以下步骤:获取异步拷贝请求内存所对应的源地址和目的地址;

获取通道与所述源地址和/或所述目的地址所在节点的物理距离;

根据所述物理距离,从候选通道以外的通道中选择补充通道;

将补充通道与候选通道组成所述通道集合。

5.根据权利要求1所述异步拷贝方法,其特征在于:所述根据通道集合和异步拷贝请求,进行异步拷贝的步骤中,包括以下步骤:根据通道集合中通道的数量,将异步拷贝请求分成与所述通道的数量相同个数的任务;

为所述通道集合中的每一通道对应分配一个所述任务,进行异步拷贝。

6.根据权利要求5所述异步拷贝方法,其特征在于:所述为所述通道集合中的每一通道对应分配一个所述任务,进行异步拷贝的步骤中,包括以下步骤:将所述任务细化为细化任务;

根据细化任务,确定需要的描述符数量,其中一个描述符对应一个细化任务;

获取入队控制权;

根据获取入队控制权结果,进行源页面和目的页面的偏移量计算,其中,异步拷贝请求对应的源地址内存具有至少一个源页面,异步拷贝请求对应的目的地址内存具有至少一个目的页面;

根据描述符数量和偏移量计算结果,进行描述符队伍填充,其中描述符队伍具有至少一个所述描述符;

根据描述符队伍填充结果,进行异步拷贝。

7.异步拷贝装置,其特征在于,包括:获取模块,用于获取异步拷贝请求;

分配模块,用于根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合,其中通道集合包括至少一通道;

处理模块,用于根据通道集合和异步拷贝请求,进行异步拷贝;

所述根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合的步骤中,包括以下步骤:根据异步拷贝请求和预设阈值确定待分配通道数量;

获取通道的热度系数;

根据热度系数,确定候选通道组合;

确定候选通道组合中候选通道的数量是否大于或等于待分配通道数量;

若是,从候选通道中选取与待分配通道数量相同的候选通道,作为所述通道集合;

否则,增加补充通道,将补充通道与候选通道作为所述通道集合。

8.异步拷贝装置,其特征在于,包括:至少一处理器;

至少一存储器,用于存储至少一程序;

当所述至少一程序被所述至少一处理器执行,使得所述至少一处理器实现如权利要求

1-6任一项所述异步拷贝方法。

说明书 :

异步拷贝方法和装置

技术领域

[0001] 本发明涉及数据传输领域,尤其是一种异步拷贝方法和装置。

背景技术

[0002] 存储性能开发套件SPDK(Storage Performance Development Kit),能实现基于I/OAT技术的DMA驱动,I/OAT为DMA控制器,通过SPDK和I/OAT能够借用专用的DMA硬件中的通道(DMA通道)进行异步拷贝工作。其中,异步拷贝指的是接收到请求后,CPU自身不进行拷贝,而将拷贝工作交给DMA控制器来进行拷贝工作。现今的SPDK,在接收到异步拷贝请求后,通过DMA控制器,利用DMA通道进行异步拷贝工作,然而由于DMA通道具有多个,无法在多个DMA通道中进行合理分配,使用过多通道会导致通道控制权的开销大幅增加,如果用户程序无法处理这些开销,会导致某些通道的阻塞,使得多通道的优势无法发挥,最终影响异步拷贝性能。

发明内容

[0003] 有鉴于此,为了解决上述技术问题,本发明的目的是提供一种提高异步拷贝性能的异步拷贝方法和装置。
[0004] 本发明采用的技术方案是:异步拷贝方法,包括以下步骤:
[0005] 获取异步拷贝请求;
[0006] 根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合,其中通道集合包括至少一通道;
[0007] 根据通道集合和异步拷贝请求,进行异步拷贝。
[0008] 进一步,所述根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合的步骤中,包括以下步骤:
[0009] 获取权限;
[0010] 根据获取权限后的异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合。
[0011] 进一步,所述根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合的步骤中,包括以下步骤:
[0012] 根据异步拷贝请求和预设阈值确定待分配通道数量;
[0013] 获取通道的热度系数;
[0014] 根据待分配通道数量和热度系数,得到通道集合。
[0015] 进一步,还包括以下步骤:根据通道集合,更新通道的热度系数。
[0016] 进一步,所述根据待分配通道数量和热度系数,得到通道集合的步骤中,包括以下步骤:
[0017] 根据热度系数和预设比例,确定候选通道组合;
[0018] 确定候选通道组合中候选通道的数量是否大于或等于待分配通道数量;
[0019] 若是,从候选通道中选取与待分配通道数量相同的候选通道,作为所述通道集合;
[0020] 否则,增加补充通道,将补充通道与候选通道作为所述通道集合。
[0021] 进一步,所述增加补充通道,将补充通道与候选通道作为所述通道集合的步骤中,包括以下步骤:
[0022] 获取异步拷贝请求内存所对应的源地址和目的地址;
[0023] 获取通道与所述源地址和/或所述目的地址所在节点的物理距离;
[0024] 根据所述物理距离,从候选通道以外的通道中选择补充通道;
[0025] 将补充通道与候选通道组成所述通道集合。
[0026] 进一步,所述根据通道集合和异步拷贝请求,进行异步拷贝的步骤中,包括以下步骤:根据通道集合中通道的数量,将异步拷贝请求分成与所述通道的数量相同个数的任务;
[0027] 为所述通道集合中的每一通道对应分配一个所述任务,进行异步拷贝。
[0028] 进一步,所述为所述通道集合中的每一通道对应分配一个所述任务,进行异步拷贝的步骤中,包括以下步骤:
[0029] 将所述任务细化为细化任务;
[0030] 根据细化任务,确定需要的描述符数量,其中一个描述符对应一个细化任务;
[0031] 获取入队控制权;
[0032] 根据获取入队控制权结果,进行源页面和目的页面的偏移量计算,其中,异步拷贝请求对应的源地址内存具有至少一个源页面,异步拷贝请求对应的目的地址内存具有至少一个目的页面;
[0033] 根据描述符数量和偏移量计算结果,进行描述符队伍填充,其中描述符队伍具有至少一个所述描述符;
[0034] 根据描述符队伍填充结果,进行异步拷贝。
[0035] 本发明还提供异步拷贝装置,包括:
[0036] 获取模块,用于获取异步拷贝请求;
[0037] 分配模块,用于根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合,其中通道集合包括至少一通道;
[0038] 处理模块,用于根据通道集合和异步拷贝请求,进行异步拷贝。
[0039] 本发明还提供异步拷贝装置,包括:
[0040] 至少一处理器;
[0041] 至少一存储器,用于存储至少一程序;
[0042] 当所述至少一程序被所述至少一处理器执行,使得所述至少一处理器实现所述异步拷贝方法。
[0043] 本发明的有益效果是:根据接收的异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合,根据通道集合和异步拷贝请求,进行异步拷贝;本发明通过通道分配算法进行通道分配,能根据异步拷贝请求提供合适的通道,利用合适的通道进行异步拷贝的任务,能将多通道的优势最大化,提高异步拷贝的性能。

附图说明

[0044] 图1为本发明方法的步骤流程示意图;
[0045] 图2为本发明具体实施例的框架层次图。

具体实施方式

[0046] 下面结合说明书附图和具体实施例对本发明作进一步解释和说明。对于本发明实施例中的步骤编号,其仅为了便于阐述说明而设置,对步骤之间的顺序不做任何限定,实施例中的各步骤的执行顺序均可根据本领域技术人员的理解来进行适应性调整。
[0047] 如图1所示,异步拷贝方法,包括以下步骤:
[0048] 获取异步拷贝请求;
[0049] 根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合,其中通道集合包括至少一通道;
[0050] 根据通道集合和异步拷贝请求,进行异步拷贝。
[0051] 在本实施例中,所述通道为物理DMA通道,在SPDK中被具体抽象成通道结构体(struct spdk_ioat_chan),每个通道结构体代表唯一的DMA通道。
[0052] 针对现有的SPDK提供的异步拷贝接口:1)无法满足多线程并发地使用同一通道;2)用户程序发送异步拷贝请求必须感知DMA通道;3)多个用户线程同时调用该异步拷贝接口使用同一DMA通道时,DMA通道队伍数据会被不同线程随意删改;4)用户程序难以合理使用多个通道的缺点。
[0053] 在本实施例中,利用Linux内核kfifo无锁队列的入队出队算法(或DPDK无锁队伍入队出队算法),重新设计一个新接口ioat_copy,为NUMA架构用户程序提供异步的NUMA远端内存拷贝接口(NUMA结构-Non-Uniform Memory Access,将内存和处理器逻辑地分为多个NUMA节点,每个节点包含一定数量的处理器和内存,节点之间通过内部传输链路IC(Inter-Connects)连接并通信),以实现多线程无锁和并发地入队出队同一通道的支持。新接口声明如下:
[0054] struct spdk_ioat_chan*ioat_copy(void*cb_arg,
[0055] void(*cb_fn)(*void),
[0056] void*dst,
[0057] const void*src,
[0058] uint64_t nbytes)
[0059] 其中,dst和src均可是本地内存或远端内存的虚拟地址(对于一个处理器CPU来说,本地内存--该处理器CPU位于同一个节点的内存,远端内存--与该处理器CPU位于不同节点的内存),它们分别表示目的地址和源地址。参数nbytes表示数据拷贝的长度(单位为字节),表示将虚拟地址为src至src+nbytes的源数据段拷贝到虚拟地址为dst至dst+nbytes这目的数据段上。cb为回调函数,参数fn和arg为回调函数的参数,void*、const void*和uint64_t都是参数的类型,在轮询期间检测到异步拷贝任务已经完成后执行回调函数。
[0060] 在本实施例中,当用户程序调用所述新接口ioat_copy,发送异步拷贝请求后,获取异步拷贝请求并进行汇总。
[0061] 进一步作为优选的实施方式,所述根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合的步骤中,包括以下步骤:
[0062] 获取权限;
[0063] 根据获取权限后的异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合。
[0064] 在本实施例中,由于异步拷贝请求可能来自多个不同的线程,因此为了异步拷贝请求,因此某个线程需要先获得权限,即获得锁,只有获得锁后才能使用通道分配算法进行通道分配,保证了通道分配算法的可靠性。在通道分配结束后进行解锁,其他线程获得锁再进行上述步骤。
[0065] 进一步作为优选的实施方式,所述根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合的步骤中,包括以下步骤:
[0066] 根据异步拷贝请求和预设阈值确定待分配通道数量;
[0067] 获取通道的热度系数;
[0068] 根据待分配通道数量和热度系数,得到通道集合。
[0069] 进一步作为优选的实施方式,根据通道集合,更新通道的热度系数。
[0070] 进一步作为优选的实施方式,所述根据待分配通道数量和热度系数,得到通道集合的步骤中,包括以下步骤:
[0071] 根据热度系数和预设比例,确定候选通道组合;
[0072] 确定候选通道组合中候选通道的数量是否大于或等于待分配通道数量;
[0073] 若是,从候选通道中选取与待分配通道数量相同的候选通道,作为所述通道集合;
[0074] 否则,增加补充通道,将补充通道与候选通道作为所述通道集合。
[0075] 进一步作为优选的实施方式,所述增加补充通道,将补充通道与候选通道作为所述通道集合的步骤中,包括以下步骤:
[0076] 获取异步拷贝请求内存所对应的源地址和目的地址;
[0077] 获取通道与所述源地址和/或所述目的地址所在节点的物理距离;
[0078] 根据所述物理距离,从候选通道以外的通道中选择补充通道;
[0079] 将补充通道与候选通道组成所述通道集合。
[0080] 在本实施例中,预设阈值为1GB,其他实施例中可以根据实际需要进行不同数值的设置,每1GB拷贝大小数据分配最少一个通道,若不足1GB,按1GB计算。例如:拷贝大小为5.5GB的异步拷贝请求,将会分配得到6个通道,即待分配通道数量为6,从而限制通道的数量,避免分配过多通道。
[0081] 在本实施例中,引入热度系数temperature,衡量每个通道的争抢情况,热度系数的定义为某一时刻正在使用这个通道或者入队这个通道的线程数量,热度系数越大,通道的争抢越激烈。预设比例为80%,其他实施例中可以为其他比例,可以根据实际需要进行调整。
[0082] 在实际中对于某一异步拷贝请求而言,在多线程环境下,由于通道属于抢占型资源,如果通道分配过多,会造成获取通道控制权的开销增加,使得多通道所带来的效益被抵消。因此需要在保证一定数量的通道前提下,为异步拷贝请求分配合适的通道。在本实施例中,(DMA)通道分配算法,具体地:
[0083] 输入:dst,src,nbytes
[0084] 输出:通道集合Cselect
[0085] 1:Lock()—上锁
[0086] 2:/*设置待分配的通道数量*/
[0087] 3:num=nbytes/230
[0088] 4:if nbytes%230>0then
[0089] 5:num++
[0090] 6:end if
[0091] 7:/*找出最高热度的值*/
[0092] 8:Maxtemperature=0
[0093] 9:for all Chan∈Call do
[0094] 10:Maxtemperature=max(Maxtemperature,Chan->temperature)
[0095] 11:end for
[0096] 12:/*首先选择热度较低的通道*/
[0097] 13:for all Chan∈Call do
[0098] 14:if Chan->temperature
[0099] 15:Chan加入Cselect
[0100] 16:Chan->temperature++
[0101] 17:end if
[0102] 18:end for
[0103] 19:/*低热度通道不够,选择距源节点和目的节点距离近的通道*/
[0104] 20:if Num(Cselect)
[0105] 21:随机从Cnode[Node(dst)]∪Cnode[Node(src)]中挑选n-Num(Cselect)个通道,并且这些通道都不在Cselect中
[0106] 22:end if
[0107] 23:Unlock()—解锁
[0108] 24:return Cselect
[0109] 其中,Num()--获得通道集合的通道数目,Cselect--分配调度算法选定的通道集合,Call--所有节点的通道集合,Cnode[i]--节点i上的通道集合,Node(adr)--虚拟地址adr所在的NUMA节点、Chan—指向通道的指针,n-待分配通道数量,Node--DMA通道所在的NUMA节点。
[0110] 具体步骤如下:
[0111] 1)首先遍历所有通道,得出最高热度系数的值;
[0112] 2)将小于最高热度系数80%的所有通道,即热度较低的通道,作为候选通道,组成候选通道组合;
[0113] 3)确定候选通道组合中候选通道的数量是否大于或等于待分配通道数量,若是,例如候选通道的数量为6或7,直接将候选通道组合作为通道集合,或抽取其中的6条通道作为通道集合;若不是,即候选通道的数量小于6,例如:候选通道只有5条,将5条候选通道在加上补充的1条补充通道作为通道集合。
[0114] 而在本实施例中,根据NUMA架构的特性,由于DMA硬件访问内存的性能与其到物理内存的距离有关,距离越长,性能越差,因此引入通道与源地址和/或目的地址所在节点的物理距离作为参考标准,进行通道补充。具体方法为:确定通道与内存源地址和/或内存目的地址所在节点的物理距离,从候选通道以外的通道中选择补充通道(优先选择物理距离最短的通道),由补充通道和候选通道组合组成通道集合。
[0115] 其中,在确定通道集合后,进行热度系数的更新,其中利用通道分配算法进行通道分配,最终得到的通道集合,指的是上述描述中第24步得到的Cselect。
[0116] 进一步作为优选的实施方式,所述根据通道集合和异步拷贝请求,进行异步拷贝的步骤中,包括以下步骤:
[0117] 根据通道集合中通道的数量,将异步拷贝请求分成与所述通道的数量相同个数的任务;
[0118] 为所述通道集合中的每一通道对应分配一个所述任务,进行异步拷贝。
[0119] 进一步作为优选的实施方式,所述为所述通道集合中的每一通道对应分配一个所述任务,进行异步拷贝的步骤中,包括以下步骤:
[0120] 将所述任务细化为细化任务;
[0121] 根据细化任务,确定需要的描述符数量,其中一个描述符对应一个细化任务;
[0122] 获取入队控制权;
[0123] 根据获取入队控制权结果,进行源页面和目的页面的偏移量计算,其中,异步拷贝请求对应的源地址内存具有至少一个源页面,异步拷贝请求对应的目的地址内存具有至少一个目的页面;
[0124] 根据描述符数量和偏移量计算结果,进行描述符队伍填充,其中描述符队伍具有至少一个所述描述符;
[0125] 根据描述符队伍填充结果,进行异步拷贝。
[0126] 在本实施例中,根据通道集合Cselect中的通道数量,将异步拷贝请求的任务分成多个任务,分配到通道集合Cselect中的所有通道完成,每一个任务对应分配到一个通道中,使得多通道能够并发地进行异步拷贝,发挥多通道的优势。具体地:
[0127] 1)将源数据段(虚拟地址为src到src+nbytes的数据段)和目的数据段(虚拟地址为dst到dst+nbytes的数据段)按照地址升序平均分为n个数据段(n为通道集合Cselect中的通道数量),以便每个通道拷贝一个数据段;
[0128] 2)通过调用上述新接口,为Cselect中的每个通道分配一个拷贝任务,一个拷贝任务对应拷贝一个数据段,确保每个任务的源地址和目的地址与原始的源数据段和目的数据段中是一一对应,保证数据的一致性。
[0129] 然后,进行拷贝任务细化和无锁进入Cselect中的通道队伍。在将每一个任务分配到每一个通道后,需要通过无锁入队算法进行通道描述符队伍的填充。在本实施例中,描述符队伍ring(FIFO无锁环形描述符队伍)通过数组实现环形队伍,队伍是由215个描述符结构体组成,每个描述符代表一个拷贝粒度最大为页面大小的拷贝请求,其中ring数组具有多个下标:pro_head--队伍入队的头部,pro_tail--队伍入队的尾部,cons_head--队伍出队的头部,cons_tail--队伍出队的尾部,这些下标所有线程都能触摸感知得到。(DMA通道)无锁入队算法,具体地:
[0130] 输入:Chan,cb_arg,cb_fn,dst,src,length(拷贝的长度,单位为字节)
[0131] 输出:
[0132] 25:根据dst和src是否页面对齐推算需要描述符数量n
[0133] 26:ret=1
[0134] 27:while ret≠0do/*先更新Chan->pro_head,再填充描述符*/
[0135] 28:old_head=Chan->pro_head
[0136] 29:new_head=old_head+n
[0137] 30:ret=CAS(&Chan->pro_head,old_head,new_head)
[0138] /*成功返回0,失败返回1*/
[0139] 31:end while
[0140] 32:orig_head=old_head//入队描述符数组下标
[0141] 33:while length>0do
[0142] 34:op_size=min(PAGE_SIZE-PAGE_OFFSET(src),--页面大小-源地址页面偏移[0143] PAGE_SIZE-PAGE_OFFSET(dst),PAGE_SIZE)--页面大小-目的地址页面偏移[0144] 35:length-=op_size
[0145] 36:描述符填充(&Chan->ring[orig_head],/*填充第orig_head个描述符*/[0146] SPDK地址转换(dst),SPDK地址转换(src),op_size)
[0147] 37:orig_head++
[0148] 38:src+=op_size
[0149] 39:dst+=op_size
[0150] 40:end while
[0151] 41:Chan->ring[orig_head-1].cb_fn=cb_fn
[0152] 42:Chan->ring[orig_head-1].cb_arg=cb_arg
[0153] 43:/*更新Chan->pro_tail*/
[0154] 44:while Chan->pro_tail≠old_head do
[0155] 45:do pause指令
[0156] 46:end while
[0157] 47:Chan->pro_tail=new_head
[0158] 48:Chan->temperature--/*更新通道热度系数*/
[0159] 包括以下步骤:
[0160] 1)将每一个通道的任务细化为细化任务,每一个描述符描述一个拷贝粒度最大为页面大小的细化任务。其中,操作系统为了方便管理内存,把内存人为地划分为多个大小一致页面,以页面为单位管理内存,页面大小指的是页面的大小,通常是4KB。
[0161] 2)根据细化任务,dst和src是否页面对齐推算需要的描述符数量n;
[0162] 3)获取入队控制权,这里指的是当不同线程提出异步请求时,各个线程需要利用CAS指令(上述代码31行)原子地抢夺pro_head的控制权,成功后才能推进pro_head(代码27到31行),将成功抢到控制权的线程的本地变量old_head成功更新为pro_head,线程的本地变量new_head成功更新为old_head+n(描述符数量);
[0163] 4)由于描述符不支持跨页拷贝,因此要进行要对源页面和目的页面进行偏移量计算(代码34行);同时,描述符直接面向DMA硬件,而DMA硬件只能识别物理地址,因此利用SPDK的地址转换接口(代码36行)对源地址和目的址进行地址转换,以将其虚拟地址转换为物理地址;
[0164] 5)填充描述符队伍ring下标介于old_head与new_head-1之间的描述符(代码33到40行);
[0165] 6)在最后一个描述符里添加回调函数和回调函数的参数(代码41到42行),用于后续轮询期间调用回调函数;
[0166] 7)推进pro_tail,告知DMA控制器下标介于old_head与new_head-1之间的描述符已经填充完毕,DMA控制器随后会根据这些描述符进行异步拷贝(代码44到46行);
[0167] 8)将pro_tail更新为new_head,完成入队;
[0168] 9)更新通道热度系数。
[0169] 其中,线程在完成填充描述符后,必须要更新pro_tail。所有线程都看得见pro_tail的更新,如果线程发现自身线程的本地变量old_head与pro_tail相同,就会停止while循环(代码第31行),继续推进更新pro_tail为new_head,pro_tail就会被正在使用该通道的线程不断更新。
[0170] 以上整体流程步骤可以总结为:
[0171] 输入:cb_arg,cb_fn,dst,src,nbytes
[0172] 输出:通道集合Cselect
[0173] 49:Cselect←DMA通道分配算法(dst,src,nbytes)
[0174] 50:length=nbytes/Num(Cselect)
[0175] 51:for all Chan∈Cselect do
[0176] 52:DMA通道无锁入队算法(Chan,cb_arg,cb_fn,dst,src,length)
[0177] 53:dst+=length
[0178] 54:src+=length
[0179] 55:end for
[0180] 56:return Cselect
[0181] 进一步作为优选的实施方式,还包括轮询请求流程:在进行拷贝任务细化和无锁进入通道队伍后,DMA控制器执行相应的拷贝操作,各个DMA通道每完成一个队伍描述符,DMA控制器会更新相应通道结构体的cons_head变量,cons_head的值不大于pro_tail,表示下标介于cons_head与pro_tail之间的描述符尚未完成;而下标介于cons_head与cons_tail之间的描述符表示已经拷贝完成但尚未轮询;在所有通道轮询完成后(没有可轮询的描述符),异步拷贝请求的任务则完成,其中轮询的作用为执行已经完成描述符的回调函数。
[0182] 其中,用户程序可以在任何时刻轮询新的接口ioat_copy返回的通道集合,从而查询自己提交的请求是否已经完成。本发明提供轮询算法,为基于Linux内核kfifo无锁队列的出队算法(或DPDK无锁队伍出队算法),支持多线程同时对一个通道轮询。本框架提供接口ioat_poll供用户程序进行轮询,轮询算法具体地:
[0183] 输入:通道集合Cselect
[0184] 输出:
[0185] 57:for all Chan∈Cselect do
[0186] 58:if Chan->cons_tail==Chan->cons_head/*没有可轮询的描述符*/
[0187] 59:then continue
[0188] 60:end if
[0189] 61:ret=1
[0190] 62:while ret≠0do/*先更新Chan->cons_tail*/
[0191] 63:old_tail=Chan->cons_tail
[0192] 64:new_tail=Chan->cons_head
[0193] 65:ret=CAS(&Chan->cons_tail,old_tail,new_tail)
[0194] /*成功返回0,失败返回1*/
[0195] 66:end while
[0196] 67:orig_tail=old_tail//出队描述符数组下标
[0197] 68:while orig_tail
[0198] 69:if chan->ring[orig_tail].cb_fn≠NULL/*描述符的回调函数不为空*/[0199] 70:then chan->ring[orig_tail].cb_fn(chan->ring[orig_tail].cb_arg)//出队第orig_head个描述符
[0200] 71:end if
[0201] 72:orig_tail++
[0202] 73:end while
[0203] 74:while Chan->pro_tail≠old_head do
[0204] 75:do pause指令
[0205] 76:end while
[0206] 77:Chan->cons_tail=new_tail
[0207] 78:end for
[0208] 其中,old_tail、new_tail为线程的变量。
[0209] 综上所述,异步拷贝方法的步骤描述如下:
[0210] 1)异步拷贝请求流程:
[0211] ①获取异步拷贝请求;
[0212] ②根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合Cselect;
[0213] ③异步拷贝请求细化和分配拷贝任务:根据通道集合Cselect,将异步拷贝请求分为多个拷贝任务,分别交给Cselect中的所有通道完成,一个通道对应一个拷贝任务;
[0214] ④根据拷贝任务,进行拷贝任务细化为细化任务,根据细化任务对通道的描述符队伍ring进行填充,方法参照无锁入队算法;
[0215] 2)轮询请求流程:在执行完异步拷贝请求流程后,DMA控制器执行拷贝操作,通过轮询算法(基于Linux内核kfifo无锁队列的出队算法)进行轮询,以便查询异步拷贝请求的拷贝操作是否完成。
[0216] 本发明还提供一种异步拷贝装置,包括:
[0217] 获取模块,用于获取异步拷贝请求;
[0218] 分配模块,用于根据异步拷贝请求,利用通道分配算法进行通道分配,得到通道集合,其中通道集合包括至少一通道;
[0219] 处理模块,用于根据通道集合和异步拷贝请求,进行异步拷贝。
[0220] 如图2所示,在本实施例中,在用户层提供一个异步拷贝框架,包含所述获取模块和分配模块,所述异步拷贝框架设计有所述新接口ioat_copy,为SPDK提供新的异步拷贝接口,同时该框架为新接口设置有所述通道分配算法。
[0221] 在运行时,用户程序可以通过异步拷贝框架的新接口调用为SPDK提供新的NUMA结构异步拷贝接口,再由SPDK实现利用I/OAT技术(DMA控制器)进行异步拷贝的工作。
[0222] 进一步作为优选的实施方式,还包括内核层设置的uio模块,用于将把I/O设备(与DMA硬件连接的设备)的物理地址暴露给用户程序,使得用户程序可以在用户空间中访问I/O设备,以实现用户层驱动。
[0223] 进一步作为优选的实施方式,硬件层为DMA硬件,包括DMA控制器(I/OAT芯片)和DMA通道,DMA控制器包括所述处理模块。
[0224] 本发明实施例还提供了异步拷贝装置,包括:
[0225] 至少一处理器;
[0226] 至少一存储器,用于存储至少一程序;
[0227] 当所述至少一程序被所述至少一处理器执行,使得所述至少一处理器实现所述异步拷贝方法。
[0228] 上述方法实施例中的内容均适用于本系统实施例中,本系统实施例所具体实现的功能与上述方法实施例相同,并且达到的有益效果与上述方法实施例所达到的有益效果也相同。
[0229] 综上所述,相较于现有技术,本发明具有以下优点:
[0230] 1)通过通道分配算法进行通道分配,为异步拷贝请求提供合适的通道,利用合适的通道进行异步拷贝的任务,能将多通道的优势最大化,充分发挥了多通道并发拷贝的性能优势,加速了NUMA远端内存异步拷贝的性能;
[0231] 2)提供一个新的异步拷贝框架,使得用户程序无需感知DMA通道,用户程序能够以更低的成本、更简单进行异步拷贝,降低了I/OAT的使用门槛,提高可靠的、异步的NUMA远端内存拷贝服务;
[0232] 在一些可选择的实施例中,在方框图中提到的功能/操作可以不按照操作示图提到的顺序发生。例如,取决于所涉及的功能/操作,连续示出的两个方框实际上可以被大体上同时地执行或所述方框有时能以相反顺序被执行。此外,在本发明的流程图中所呈现和描述的实施例以示例的方式被提供,目的在于提供对技术更全面的理解。所公开的方法不限于本文所呈现的操作和逻辑流程。可选择的实施例是可预期的,其中各种操作的顺序被改变以及其中被描述为较大操作的一部分的子操作被独立地执行。
[0233] 此外,虽然在功能性模块的背景下描述了本发明并且采用方块图的形式举例说明,但应当理解的是,除非另有相反说明,所述的功能和/或特征中的一个或多个可以被集成在单个物理装置和/或软件模块中,或者一个或多个功能和/或特征可以在单独的物理装置或软件模块中被实现。还可以理解的是,有关每个模块的实际实现的详细讨论对于理解本发明是不必要的。更确切地说,考虑到在本文中公开的装置中各种功能模块的属性、功能和内部关系的情况下,在工程师的常规技术内将会了解该模块的实际实现。因此,本领域技术人员运用普通技术就能够在无需过度试验的情况下实现在权利要求书中所阐明的本发明。还可以理解的是,所公开的特定概念仅仅是说明性的,并不意在限制本发明的范围,本发明的范围由所附权利要求书及其等同方案的全部范围来决定。
[0234] 在本说明书的描述中,参考术语“一个实施例”、“本实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0235] 以上是对本发明的较佳实施进行了具体说明,但本发明并不限于所述实施例,熟悉本领域的技术人员在不违背本发明精神的前提下还可做作出种种的等同变形或替换,这些等同的变形或替换均包含在本申请权利要求所限定的范围内。