专利名称:一种在光纤通道环境中利用rdma存取数据的方法
技术领域:
本发明属于计算机信息存储技术领域,具体涉及一种在光纤通道环境中的存取数据的方法。
背景技术:
在传统的基于处理器到处理器的互联中,主机端对于数据的复制操作是低效的, 所有的数据都需要在用户缓冲区与内核缓冲区间传输,这样的数据复制操作需要极大的内存带宽。当数据到达网络接口时,需要通过DMA(直接内存访问,Direct Memory Access)等方式从网络设备接口缓冲区拷贝到内核缓冲区,然后由主机处理器将数据从内核缓冲区移动到用户缓冲区,在这过程中,需要进行大量的读写操作,反向亦然。这种方法降低了 CPU 的效率,也消耗了大量的内存带宽。而RDMA技术为以上存在的问题提出了新的解决方案。RDMA(Remote Direct Memory Access)全名是远程直接数据存取,RDMA让计算机可以直接读写其它计算机的内存,而不需要经过处理器参与耗时的传输,避免了数据在内核内存与用户内存之间的多次拷贝,从而有效地腾出了系统总线和CPU周期,改善了应用系统的性能。目前随着高性能计算与应用服务的发展,更多的高性能存储区域网络开始利用高速网络与专有协议来构建。这主要包括基于以太网与iSCSI协议的IP-SAN、基于 Infiniband(IB)的IB-SAN,以及基于光纤通道和FCP协议的FC-SAN。IP-SAN可以利用目前广泛使用的以太网,成本较低,但是其网络处理协议需要占用较多的主机CPU时间,针对此问题,RDMA通过在网卡上将可靠传输协议固化于硬件,以及支持零拷贝技术和内核内存旁路技术这两种途径来达到提高性能的目的。IB网络利用RDMA机制和HCA的专用协议卸载引擎可以有效降低主机处理网络协议的开销,在IB-SAN中广泛使用的基于RDMA的协议有 SRP (SCSI RDMA PR0T0CAL)和 iSER(Iscsi extensions for RDMA)。FC-SAN 物理上需要基于光纤通道网络,光纤通道技术所具有的高速、高可靠性以及稳定安全性传输特点,使其在SAN中得到了广泛应用,目前FC中支持RDMA的协议主要是FC-AE-RDMA(Fibre Channel SCSI_3Remote Direct Memory Access),FC-AE-RDMA 协议是光纤通道为了应用于航空电子环境提供了一套FC-AE(Fibre Channel Avionics Environment)的协议子集,在 FC-AE-RDMA协议中制定了在实现实时光纤通道网络时所遵循的规定,它是基于SCSI-3的轻量级、低延迟、低开销通信协议,用于航电系统中各部件之间的通信,该协议的关键是通信双方的发起端anitiator)在对远程目标端(Target)进行读写数据时可以直接访问其 RDMA内存,而不必经过处理器耗时的传输以及避免内核内存和应用内存之间数据的拷贝所造成的开销,这对存储性能的提升具有很重要的意义。此前,国外对FC的研究及应用大多集中在存储区域网(SAN)方面,如FCP协议,而对FC-AE-RDMA的研究非常少。相对于FCP 协议,FC-AE-RDMA协议针对其作了某些限制,不仅支持对远端结点的内存空间的直接访问, 同时还调整了 FCP写事务的处理流程,以更好的支持低延迟实时服务。
发明内容
本发明提出一种在光纤通道环境中利用RDMA技术存取数据的方法,解决FC-SAN 存储环境下存取数据时,数据在核态缓冲区与用户缓冲区之间相互拷贝而导致存储性能低下的问题。在Linux系统下,由于权限保护的因素,用户态应用程序不能直接访问系统内核。 用户态应用程序可以通过系统调用方式访问系统内核,内核态下的设备驱动模块可以看成系统内核和硬件设备之间的接口,整个系统内核和其上层的应用程序要想使用硬件的话都要通过驱动程序访问硬件。设备驱动程序对应用程序屏蔽了底层硬件在实现上的细节,使得应用程序可以像操作普通文件一样操作外部设备。应用程序可以使用标准的系统调用接口来完成打开、读写、I/O控制、关闭等操作,而设备驱动程序就是要实现这些系统调用的函数。本发明中整个方法的步骤包括内存注册、零拷贝设置、发起端发送读写请求、目标端接收请求并处理、发起端接收状态帧、发起端读取所请求数据,具体如下(1)内存注册发起端与目标端在进行数据传输之前,两端分别要进行内存注册,将要使用的用户空间的数据缓冲区锁定在内核空间内存中,防止数据在RDMA操作过程中被系统内核交换出去。内存注册的步骤为(1. 1)在内核空间中通过get_free_pages函数调用申请到一片内核内存。(1. 2)通过virt_t0_page函数调用逐次获得申请的这片内核内存的struct page 结构,并通过^tPageReserved函数调用设置page结构的flag标志为PG_reserved。(2)零拷贝设置本发明中采用Linux中的内存映射机制mmap方法,在不需要内存复制的情况下, 应用程序可以直接使用mmap系统调用返回的虚拟地址来读写数据。内核空间则需要实现 file_operations的.mmap函数,将(1)中注册过的内核物理内存映射到用户空间,使内核空间和用户空间访问的是同一片数据缓冲区,这样数据在内核空间和用户空间就无须跨层拷贝,提高了数据传输效率。本发明中,通过在光纤适配器驱动模块中实现filejperations的.mmap函数。用户空间应用程序和光纤适配器驱动模块的设置分别为(2. 1)用户空间应用程序零拷贝的设置用户空间应用程序只需要调用mmap即可,其系统调用原型为mmap (caddr_t addr,size_t len,int prot,int flags,int fd,off—t offset)(2. 2)光纤适配器驱动模块中零拷贝的设置光纤适配器驱动模块中需要实现filejperations中的.mmap函数,本实施例中的.mmap的实现例程为ml505_mmap,该例程中的最重要的实现映射的机制是remap_pfn_ range函数调用,它将(1)中注册过的内存做了对应的映射,从而使得用户空间的应用程序和内核空间所注册过的内存共享同一片物理内存,进而实现了零拷贝设置。(3)发起端发起读写请求(3. 1)用户空间应用程序通过read/write系统调用向系统内核发送读写请求;
(3. 2)通过虚拟字符设备接口,读写请求传递到内核空间的光纤适配器驱动模块,该光纤适配器驱动模块根据read/write系统调用的读写首地址和读写长度,依照 FC-AE-RDMA协议的规程将其封装为FCP_CMND协议帧;(3. 3)在光纤适配器驱动模块中设置相关硬件寄存器,触发光纤适配器的DMA功能,将FCP_CMND协议帧从核态内存发送到光纤适配器硬件缓存中。(3. 4)在光纤适配器驱动模块中设置相关硬件寄存器,触发光纤适配器的发送功能,将FCP_CMND协议帧从光纤适配器硬件缓存发送到光纤通道链路上,并传送到到目标端。(4)目标端接收请求并处理(4. 1)目标端的光纤适配器驱动模块中,设置相关硬件寄存器,触发光纤适配器的接收功能,将光纤通道链路上的FCP_CMND协议帧接收到光纤适配器硬件缓存中。(4. 2)目标端的光纤适配器驱动模块中,设置相关硬件寄存器,触发光纤适配器的 DMA功能,将光纤适配器硬件缓存中的FCP_CMND协议帧存放到内核内存中。。(4. 3))目标端的光纤适配器驱动模块解析收到的FCP_CMND协议帧并处理。如果是读请求,则目标端根据要读取的块设备、读取首地址、读取长度,发起读盘操作,将结果数据从块设备读到目标端注册过的内存区域,并将结果数据封装为FCP_DATA 协议帧,然后将封装好的FCP_DATA协议帧写到发起端,发起端接收到FCP-DATA协议帧,解析该帧,即去掉帧头帧尾,得到有效数据部分,然后将有效数据存放到发起端中所注册过的内存区域中。; 如果是写请求,发起端将待写数据封装为FCP_DATA协议帧,然后由光纤适配器驱动模块将FCP_DATA协议帧发送给目标端,目标端的光纤适配器模块接收此FCP_DATA协议帧,解析后将有效数据直接发送到目标端注册过的内存域中,目标端此后等待合适的时机, 将目标端注册过的内存域中的数据回写到目标端的磁盘上。(4.4)数据读写操作结束后,根据FC-AE-RDMA协议的规程,目标端要返回给发起端FCP_RSP状态帧。(5)发起端接收状态帧发起端接收到FCP_RSP状态帧,然后对其解析,将该FCP_RSP状态帧的结果字段 (result)提取出来,并通过异步信号中断的方式告诉用户态应用程序,用户空间应用程序通过结果字段(result)判断读写过程是否正确,若正确,则进一步从发起端注册过的内存域中读取所请求的数据。如果是读请求,本发明还包括发起端读取所请求数据的步骤对于步骤(5)中描述的从注册过的内存中读取所请求的数据,用户空间应用程序的做法很简单,只需要从 mmap系统调用返回的地址处,开始读写即可,读写长度为发起端该读写请求设定的长度。本发明的在光纤通道环境中利用RDMA存取数据的方法,不同于传统的数据存取方式。RDMA技术可以将用户空间应用程序要传输的数据直接发送到物理光纤适配器上,而不需要像传统方式那样使得数据在用户内存和核态内存之间的相互拷贝。将RDMA技术应用于光纤通道环境中,尤其是在FC-SAN存储网络中,可以有效地降低数据存取时对系统内存带宽和处理器的开销,对数据存储性能有很大程度的提升。
图1为本发明的流程示意2为内存注册的示意图。图3为零拷贝设置的示意图。图4为发起端发送读写请求的示意图。图5为目标端接收请求并处理的示意图。
具体实施例方式下面结合附图对本发明进一步详细说明。本发明的一种在光纤通道环境中利用RDMA存取数据的方法,其步骤包括内存注册、零拷贝设置、发起端发送读写请求、目标端接收请求并处理、发起端接收状态帧、发起端读取所请求数据,如图1所示,下面具体介绍各步骤的实施方式(1)内存注册步骤,如图2所示发起端与目标端在进行数据传输之前,两端分别要进行内存注册,将要使用的用户空间的数据缓冲区锁定在内核空间内存中,防止数据在RDMA操作过程中被系统内核交换出去。内存注册的步骤为(1. 1)申请核态内存用户空间应用程序在调用open系统调用时,通过虚拟字符设备接口,会对应到内核空间的光纤适配器驱动模块的ml505_open函数,在该函数中通过get_free_pages函数调用申请一片内核内存,所申请的内存大小根据用户应用程序的需求而定。(1. 2)设置保留标志通过virt_t0_page函数调用逐次获得(1. 1)中所申请的这片内核内存的struct page结构,并通过ktPageReserved函数调用设置page结构的flag标志为PG_reserved。(2)零拷贝设置步骤,如图3所示在一般情况下,Linux用户空间是不能直接访问内核空间的,用户空间应用程序的数据要想通过底层硬件设备发送到网络上,必须经过跨层的拷贝首先拷贝给内核空间的驱动程序,然后才能发送到硬件设备上。当要传输的数据量很大时,用户空间应用程序和内核空间驱动程序的相互拷贝耗费大量CPU时间和内存带宽,严重影响系统的性能。为了克服这一弊端,本发明中采用Linux中的内存映射机制mmap方法,在不需要内存复制的情况下,应用程序可以直接使用mmap系统调用返回的地址来读写数据,同时在内核空间的光纤适配器驱动模块中通过虚拟字符设备接口对应的实现file_0perati0ns 的.mmap函数,即能将内核空间申请的物理内存映射到用户空间,这样内核空间和用户空间访问的是同一片数据缓冲区,数据在内核空间和用户空间就无须跨层的拷贝,提高了数据传输效率。用户空间应用程序和光纤适配器驱动模块的设置分别为(2. 1)用户空间应用程序零拷贝的设置用户空间应用程序只需要调用mmap即可,其系统调用原型为mmap (caddr_t addr,size_t len,int prot,int flags,int fd,off—t offset)(2. 2)光纤适配器驱动模块中零拷贝的设置
对应的光纤适配器驱动模块中需要实现filejperations中的.mmap函数,本实施例中的.mmap的实现例程为ml505_mmap,该例程中的最重要的实现映射的机制是remap_ pfn_range函数调用,它将(1)中注册过的内存建立了新的页表,从而将内核空间所注册过的内存映射到了用户空间应用程序,使得用户空间应用程序和内核空间所注册过的内存共享同一片物理内存,进而实现了零拷贝设置。mmap系统调用的实现过程为(2. 1. 1)先通过文件系统定位要映射的文件;(2. 1. 2)权限检查,映射的权限不会超过文件打开的方式,也就是说如果文件是以只读方式打开的话,那么则不允许建立一个可写映射;(2. 1. 3)从进程虚拟地址空间中获得一个未使用的VMA对象,并对之进行初始化;(2. 1. 4)调用映射文件的mmap函数,其主要工作是给vm_ops向量表赋值;(2. 1. 5)把该vma链入该进程的vma链中,如果可以和前后的vma合并则合并;(3)发起端发起读写请求,如图4所示(3. 1)用户空间应用程序通过read/write系统调用发送读写请求;(3. 2)通过虚拟字符设备接口,读写请求传递到内核态的光纤适配器驱动模块,光纤适配器驱动模块根据read/write系统调用的读写首地址和读写长度,依照FC-AE-RDMA 协议的规程将其封装为FCP_CMND协议帧;(3. 3)在光纤适配器驱动模块中设置相关硬件寄存器,触发光纤适配器的DMA功能,将FCP_CMND协议帧从核态内存发送到光纤适配器硬件缓存中。(3. 4)在光纤适配器驱动模块中设置相关硬件寄存器,触发光纤适配器的发送功能,将FCP_CMND协议帧从光纤适配器硬件缓存发送到光纤通道链路上,并发送到目标端。(4)目标端接收请求并处理,如图5所示(4. 1)目标端的光纤适配器驱动模块中,,设置相关硬件寄存器,触发光纤适配器的接收帧功能,将光纤通道链路上的FCP_CMND协议帧接收到光纤适配器硬件缓存中。(4. 2)目标端的光纤适配器驱动模块中,设置相关硬件寄存器,触发光纤适配器的 DMA功能,将光纤适配器硬件缓存中的FCP_CMND协议帧存放到内核内存中。(4. 3)目标端的光纤适配器驱动模块解析收到的FCP_CMND协议帧并处理。如果是读请求,则目标端根据要读取的块设备、读取首地址、读取长度,发起读盘操作,将结果数据从块设备读到目标端注册过的内存区域,并将结果数据封装为FCP_DATA 协议帧,然后将封装好的FCP_DATA协议帧写到发起端,发起端接收到FCP-DATA协议帧,解析该帧,即去掉帧头帧尾,得到有效数据部分,然后将有效数据存放到发起端中所注册过的内存区域中。如果是写请求,发起端将待写数据封装为FCP_DATA协议帧,然后由光纤适配器驱动模块将FCP_DATA协议帧发送给目标端,目标端的光纤适配器模块接收此FCP_DATA协议帧,解析后将有效数据直接发送到目标端注册过的内存域中,目标端此后等待合适的时机, 将目标端注册过的内存域中的数据回写到本端的磁盘上。(4. 4)数据读写操作结束后,根据FC-AE-RDMA协议的规程,目标端发送FCP_RSP状态帧到发起端。(5)发起端接收状态帧
7
发起端接收到FCP_RSP状态帧,然后对其解析,将该FCP_RSP状态帧的结果字段 (result)提取出来,并通过异步信号中断的方式告诉用户空间应用程序,用户空间应用程序通过结果字段(result)判断读写过程是否正确,若正确,则进一步从发起端注册过的内存域中读取所请求的数据。(6)发起端读取所请求数据对于步骤(5)中描述的从发起端注册过的内存中读取所请求的数据,用户态应用程序的做法很简单,只需要从mmap系统调用返回的地址处,开始读写即可,读写长度为发起端该读写请求设定的长度。
权利要求
1.一种在光纤通道中利用RDMA存取数据的方法,具体包括如下步骤(1)对发起端与目标端进行内存注册,即将发起端和目标端中的用户空间的数据缓冲区分别锁定在各自的内核空间内存中;(2)发起端发起读写请求,具体过程为(2. 1)发起端的用户空间应用程序发送读写请求;(2. 2)将读写请求按照FC-AE-RDMA协议封装为FCP_CMND协议帧;(2. 3)将FCP_CMND协议帧通过光纤通道发送到目标端;(3)目标端接收读写请求并处理,具体为首先,目标端接收发送的FCP_CMND协议帧;其次,按照FC-AE-RDMA协议将接收的FCP_ CMND协议帧解析,获得读写信息,包括读写块设备、读写首地址以及读写长度;然后,根据所述读写信息进行读写操作;最后,数据读写操作结束后,目标端返回给发起端结果状态帧;其中,根据所述读写信息进行读写操作的具体过程为如果是读请求,则目标端根据要读取的块设备、读取首地址和读取长度,发起读盘操作,将待读取数据从目标端的块设备读到目标端注册过的内存区域,然后将其封装为 FCP-DATA数据帧通过光纤通道发送到发起端;如果是写请求,发起端将待写数据直接发送到目标端注册过的内存区域中,目标端将目标端注册过的内存区域中的数据回写到本端的磁盘上。(4)发起端接收状态帧,完成数据存取。
2.根据权利要求1所述的方法,其特征在于,所述步骤C3)中,如果是读请求,发起端还需接收目标端发送过来的FCP-DATA数据帧,其具体过程为首先,发起端解析FCP-DATA数据帧,即去掉帧头帧尾,得到有效数据部分,然后,将所述有效数据存放到发起端中所注册过的内存区域中。
3.根据权利要求1或2所述的方法,其特征在于,所述的发起端中所注册过的内存区域需进行零拷贝设置,即将所注册过的内核空间内存区域映射到用户空间应用程序内存中, 使内核空间和用户空间应用程序共享一片物理内存。
4.根据权利要求1-3之一所述的方法,其特征在于,所述步骤中发起端接收状态帧的具体过程为首先,解析状态帧,提取状态帧中的结果字段,然后并通过异步信号中断的方式通知用户空间应用程序;用户空间应用程序可根据该结果字段判断读写过程的正确性。
5.根据权利要求3或4所述的方法,其特征在于,所述用户空间应用程序通过mmap系统调用,获取所注册过的内核内存的虚拟地址,从而建立内核空间内存区域到用户空间应用程序内存的映射关系。
6.根据权利要求1-5之一所述的方法,其特征在于,所述步骤(1)中,内存注册的具体步骤为(1.1)在内核空间中申请一片内核内存;(1. 2)逐次获得申请的该片内核内存的struct page结构,并设置该结构的flag标志为PG_reSerVed,即完成内存注册。
全文摘要
本发明公开了一种在光纤通道中利用RDMA存取数据的方法,具体包括如下步骤(1)对发起端与目标端进行内存注册,即将发起端和目标端中的用户空间的数据缓冲区分别锁定在各自的内核空间内存中;(2)发起端发起读写请求;(3)目标端接收读写请求并处理目标端接收发送的FCP_CMND协议帧;将接收的FCP_CMND协议帧解析,获得读写信息,包括读写块设备、读写首地址以及读写长度;然后,根据所述读写信息进行读写操作;最后,数据读写操作结束后,目标端返回给发起端结果状态帧;(4)发起端接收状态帧,完成数据存取。本发明将RDMA技术应用于光纤通道环境中,可以有效地降低数据存取时对系统内存带宽和处理器的开销,对数据存储性能有很大程度的提升。
文档编号H04L29/08GK102571925SQ20111042487
公开日2012年7月11日 申请日期2011年12月19日 优先权日2011年12月19日
发明者任佳, 冯丹, 刘景宁, 吴龙飞, 王晓静, 童薇, 袁小燕 申请人:华中科技大学