接收数据的方法、装置、数据接收设备和存储介质与流程

文档序号:20883946发布日期:2020-05-26 17:21阅读:188来源:国知局
接收数据的方法、装置、数据接收设备和存储介质与流程

本申请涉及存储技术领域,特别涉及一种接收数据的方法、装置、数据接收设备和存储介质。



背景技术:

网络小型计算机系统接口(internetsmallcomputersysteminterface,iscsi)能够使数据接收端的中央处理器(centralprocessingunit,cpu)利用率比较高,所以常应用于数据接收端的数据接收。

相关技术中,在数据接收端接收数据时,数据接收端的网络接口卡(networkinterfacecard,nic)(简称为网卡)接收到传输控制协议(transmissioncontrolprotocol,tcp)报文后,nic将tcp报文按照直接存储器存取(directmemoryaccess,dma)存储至数据接收端的内核协议栈的数据页面中。cpu使用内核协议栈对tcp报文进行解析,去掉tcp报文头、以及进行乱序、拥塞处理等。数据接收端的cpu使用iscsi驱动从内核协议栈中获得tcp报文中的iscsi头部,根据该iscsi头部,获得scsi层数据空间的数据页面。cpu使用iscsi驱动将tcp报文中的scsi数据复制至scsi层数据空间的数据页面。

在相关技术中,由于需要将scsi数据复制到scsi层数据空间,所以在数据量比较大的情况下,会占用数据接收端的cpu比较多,从而导致数据接收端的存储性能较差。



技术实现要素:

本申请提供了一种接收数据的方法、装置、数据接收设备和存储介质,以提升数据接收端的存储性能。

第一方面,提供了一种接收数据的方法,应用于数据接收端,数据接收端包含处理器、内存和网卡,网卡、处理器和内存间通信,该方法包括:

网卡接收传tcp报文;tcp报文包含iscsi头部和scsi数据。网卡将scsi数据存储至内存中的目标数据页面,处理器根据iscsi头部,获取scsi数据在scsi层数据空间的数据页面;处理器根据scsi数据在scsi层数据空间的数据页面,采用数据页面交换的方式,将scsi数据从目标数据页面存储至scsi层数据空间。

本申请所示的方案,数据发送端有数据要发送至数据接收端,数据发送端可以将数据组织成tcp报文,然后向数据接收端发送该tcp报文。数据接收端的网卡接收数据发送端发送的tcp报文,网卡可以在内存中确定存储tcp报文包含的scsi数据的数据页面,该数据页面可以称为是目标数据页面。然后网卡将tcp报文包含的scsi数据存储至目标数据页面,并且网卡可以将tcp报文包含的iscsi头部存在至内存中除目标数据页面之外的数据页面。

网卡通知处理器在内存中读取tcp报文包含的iscsi头部,处理器可以在内存中读取iscsi头部,使用iscsi头部确定出tcp报文包含的scsi数据,在scsi层数据空间的数据页面。然后处理器可以采用页面交换的方式,将tcp报文包含的scsi数据从目标数据页面存储至scsi层数据空间。这样,由于是数据接收端的网卡将iscsi头部和scsi数据进行分离,存储至内存的提供的数据页面,而且数据接收端的处理器将scsi数据采用页面交换的方式,提供给数据接收端的scsi层,而没有进行数据的复制处理,所以在数据接收方向上,实现数据零拷贝,可以减少数据接收端的cpu的占用,进而可以提升数据接收端的存储性能。

在一种可能的实现方式中,网卡将scsi数据存储至内存中的目标数据页面之前,还包括:网卡基于上下文信息,对tcp报文包含的scsi数据和iscsi头部进行分离处理,获得第一分离结果。处理器将scsi数据从目标数据页面存储至scsi层数据空间之前,还包括:处理器确定第一分离结果正确。

本申请所示的方案,网卡在将scsi数据存储至内存中的目标数据页面之前,网卡可以基于上下文信息,对tcp报文包含的scsi数据和iscsi头部进行分离处理,获得第一分离结果,然后将tcp报文包含的scsi数据和iscsi头部分别存储至目标数据页面和除目标数据页面之外的其它页面。处理器还可以判断第一分离结果是否正确,在确定第一分离结果正确后,将scsi数据从目标数据页面存储至scsi层数据空间。这样,只有在第一分离结果正确的情况下,处理器才会将scsi数据从目标数据页面存储至scsi层数据空间,所以可以尽可能的保证提供至scsi层数据空间的scsi数据正确。

在一种可能的实现方式中,处理器对tcp报文包含的iscsi头部和scsi数据进行分离处理,获得第二分离结果。当第一分离结果与第二分离结果相同,则处理器确定第一分离结果正确。

本申请所示的方案,处理器也可以基于自身存储的上下文信息,对tcp报文包含的iscsi头部和scsi数据的分离进行分离处理,获得第二分离结果。然后处理器将第一分离结果和第二分离结果进行比较,当第一分离结果与第二分离结果相同,则处理器可以确定第一分离结果正确。这样,由于处理器对tcp报文包含的iscsi头部和scsi数据的分离进行分离处理,获得第二分离结果是正确的,所以通过比对第一分离结果与第二分离结果是否相同,可以准确的确定出第一分离结果是否正确,进而可以尽可能的保证提供至scsi层数据空间的scsi数据正确。

在一种可能的实现方式中,当第一分离结果与第二分离结果不相同,则处理器基于第二分离结果,将tcp报文包含的scsi数据复制至scsi层数据空间的数据页面。

本申请所示的方案,处理器在确定第一分离结果与第二分离结果不相同时,处理器可以确定第一分离结果不正确。处理器可以基于第二分离结果,确定tcp报文包含的scsi数据。然后将当前存储在内存中的tcp报文包含的scsi数据,复制至scsi层数据空间的数据页面。这样,即使在第一分离结果不正确的情况下,处理器也可以将tcp报文包含的scsi数据,正确的存储至scsi层数据空间的数据页面。

在一种可能的实现方式中,处理器向网卡发送目标消息,其中,目标消息中携带有目标上下文信息,目标上下文信息用于分离iscsi头部。网卡将获得第一分离结果的上下文信息替换为目标上下文信息。

本申请所示的方案,处理器在确定第一分离结果与第二分离结果不相同时,处理器可以确定第一分离结果不正确。然后处理器可以生成目标消息,在该目标消息中携带目标上下文信息,该目标上下文信息可以用于指示正确的分离iscsi头部,该目标上下文信息是处理器使用的上下文信息。处理器可以向网卡发送目标消息,网卡接收到目标消息后,可以从中解析到目标上下文信息,然后使用目标上下文信息替换获得第一分离结果的上下文信息。这样,可以指示网卡后续正确分离iscsi头部。

在一种可能的实现方式中,处理器确定目标数据页面中的scsi数据符合对齐要求。

本申请所示的方案,处理器在将scsi数据从目标数据页面存储至scsi层数据空间之前,处理器还可以确定存储scsi数据的数据页面中的scsi数据符合对齐要求。这样,在符合对齐要求时,将scsi数据从目标数据页面存储至scsi层数据空间,可以尽可能的保证提供至scsi层数据空间的scsi数据正确。

在一种可能的实现方式中,当目标数据页面中的scsi数据不符合对齐要求,则处理器将scsi数据复制至scsi层数据空间的数据页面。

本申请所示的方案,处理器在确定目标数据页面中的scsi数据不符合对齐要求时,处理器可以将scsi数据复制至scsi层数据空间的数据页面,而不采用页面交换的方式。这样也可以尽可能的保证提供至scsi层数据空间的scsi数据正确。

在一种可能的实现方式中,处理器将目标数据页面的指针存储至scsi层数据空间,将scsi数据在scsi层数据空间的数据页面的指针用于存储网卡后续接收到的tcp报文。

本申请所示的方案,处理器可以将目标数据页面的指针存储至scsi层数据空间,而将scsi数据在scsi层数据空间的数据页面的指针用于存储网卡后续接收到的tcp报文。这样,可以不使用复制的方式,就将tcp报文包含的scsi数据存储至scsi层数据空间的数据页面,从而减少数据接收端的cpu的占用,进而可以提升数据接收端的存储性能。

第二方面,提供了一种接收数据的装置,所述装置包括:

接收模块,用于接收tcp报文;所述tcp报文包含iscsi头部和scsi数据;

存储模块,用于将所述scsi数据存储至所述内存中的目标数据页面;

获取模块,用于根据所述iscsi头部,获取所述scsi数据在scsi层数据空间的数据页面;

所述存储模块,还用于根据所述scsi数据在scsi层数据空间的数据页面,采用数据页面交换的方式,将所述scsi数据从所述目标数据页面存储至所述scsi层数据空间。

在一种可能的实现方式中,所述装置还包括:

定界模块,用于基于上下文信息,对所述tcp报文包含的所述scsi数据和所述iscsi头部进行分离处理,获得第一分离结果;

所述存储模块,还用于确定第一分离结果正确。

在一种可能的实现方式中,所述存储模块,还用于:

对所述tcp报文包含的所述iscsi头部和所述scsi数据进行分离处理,获得第二分离结果;

当所述第一分离结果与所述第二分离结果相同,则确定所述第一分离结果正确。

在一种可能的实现方式中,所述存储模块,还用于:

当所述第一分离结果与所述第二分离结果不相同,则所述处理器基于所述第二分离结果,将所述tcp报文包含的scsi数据复制至所述scsi层数据空间的数据页面。

在一种可能的实现方式中,所述装置还包括:

发送模块,用于向所述网卡发送目标消息,其中,所述目标消息中携带有目标上下文信息,所述目标上下文信息用于分离iscsi头部;

替换模块,用于将获得所述第一分离结果的上下文信息替换为所述目标上下文信息。

在一种可能的实现方式中,所述存储模块,还用于:

确定所述目标数据页面中的scsi数据符合对齐要求。

在一种可能的实现方式中,所述存储模块,还用于:

当所述目标数据页面中的scsi数据不符合对齐要求,则将所述scsi数据复制至所述scsi层数据空间的数据页面。

在一种可能的实现方式中,所述存储模块,用于:

将所述目标数据页面的指针存储至scsi层数据空间,将所述scsi数据在scsi层数据空间的数据页面的指针用于存储所述网卡后续接收到的tcp报文。

第三方面,提供了一种数据接收端,所述数据接收端包括网卡和处理器,其中:

所述网卡,为第一方面所述的网卡,所述处理器,为第一方面所述的处理器。

第四方面,提供了一种网络处理器,所述网络处理器应用于数据接收端,所述网络处理器包含处理器和网卡,其中:所述网卡,为第一方面所述的网卡,所述处理器,为第一方面所述的处理器。

第五方面,提供了一种接收数据的数据接收设备,所述数据接收设备包括处理器和存储器,其中:

所述存储器中存储有计算机指令;

所述处理器执行所述计算机指令,以实现上述第一方面所述的接收数据的方法。

第六方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,当所述计算机可读存储介质中的计算机指令被数据接收设备执行时,使得所述数据接收设备实现上述第一方面所述的接收数据的方法。

附图说明

图1是本申请实施例提供的一种接收数据的流程示意图;

图2是本申请实施例提供的一种数据接收设备的结构示意图;

图3是本申请实施例提供的一种接收数据的应用场景示意图;

图4是本申请实施例提供的一种接收数据的应用场景示意图;

图5是本申请实施例提供的一种接收数据的方法的流程示意图;

图6是本申请实施例提供的一种tcp报文的聚合示意图;

图7是本申请实施例提供的一种接收数据的流程示意图;

图8是本申请实施例提供的一种接收数据的流程示意图;

图9是本申请实施例提供的一种接收数据的装置的结构示意图;

图10是本申请实施例提供的一种接收数据的装置的结构示意图;

图11是本申请实施例提供的一种接收数据的装置的结构示意图。

具体实施方式

为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。

为了便于对本申请实施例的理解,下面首先介绍所涉及到的名词的概念:

scsi协议,是一种智能的通用接口标准,是计算机与外围设备(如硬盘等)进行通信的协议。

iscsi协议,是通过tcp对scsi内容(如scsi数据、scsi命令)进行封装的一种协议,也即是通过以太网传输scsi内容的协议。

零拷贝,指cpu不需要将数据从内存中的复制到另一个特定区域。

tcp卸载引擎(tcpoffloadengine,toe),计算机通过网络进行通信的过程中,计算机的cpu需要耗费大量资源进行多层网络协议的数据包处理工作,这些协议包括tcp、ip等。为了将占用的这部分计算机的cpu资源进行释放,将上述计算机的cpu的工作转移到芯片(如计算机的网卡)上。

iscsi卸载引擎(iscsioffloadengine,ioe),将处理iscsi协议的工作在芯片(如计算机的网卡)中实现,芯片向外提供内容为scsi数据,而不是tcp报文。

网卡,可以称为是网络接口卡(networkinterfacecard,nic),又可以称为是网络接口控制器(networkinterfacecontroller,nic),用于将传输的数据转换为网络中其它设备能够识别的格式,通过网络介质传输。具体的,在本申请实施例中,还可以实现tcp报文中的iscsi头部和scsi的分离。

数据接收端接收到数据的tcp报文后,将tcp报文按照直接存储器存取的方式存储至数据接收端的内核协议栈的数据页面。内核协议栈对tcp报文进行报文解析,去掉tcp报文头、以及进行tcp乱序和拥塞等处理,数据接收端的iscsi驱动从内核协议栈中获得tcp报文中的iscsi头部。该iscsi驱动根据该iscsi头部,获得scsi层数据空间的数据页面。数据接收端的iscsi驱动将tcp报文包含的scsi数据复制至scsi层数据空间的数据页面。例如,如图1所示,数据接收端的网卡接收到三条tcp报文,即tcp报文1中包括scsi数据-1,tcp报文2包括scsi数据-2,tcp报文3包括scsi数据-3,数据接收端的网卡将第一条tcp报文和第二条tcp报文存储至一个数据页面,将第三条tcp报文存储至另一个数据页面。数据接收端的内核协议栈去掉tcp报文的tcp报文头,完成tcp乱序和拥塞处理等,数据接收端的iscsi驱动根据iscsi头部,获得scsi层数据空间的数据页面,数据接收端的iscsi驱动将scsi数据从内核协议栈中的数据页面复制至scsi层数据空间的数据页面。这样,由于数据接收端的iscsi驱动会将scsi数据复制至scsi层数据空间的数据页面,会占用数据接收端的大量cpu资源,所以在数据接收端接收数据时,需要提供一种降低cpu资源的占用的方式。

本申请实施例提供了一种接收数据的方法,该方法可以应用于数据接收端,数据接收端,即数据接收设备,可以是存储设备,如存储阵列、硬盘框、分布式存储系统中的存储服务器。数据接收端还可以是应用服务器。

在接收数据的方法由存储设备执行时,图2示出了本申请实施例中存储设备的结构框图,该存储设备可以至少包括网卡(网卡为硬件接口)201和处理器202。处理器可以是cpu和存储器的组合,还可以是现场可编程逻辑门阵列(fieldprogrammablegatearray,fpga)或其他硬件,处理器202也可以是cpu与其他硬件的组合,如cpu与fpga的组合等。处理器202可以是存储设备的控制中心,利用各种接口和线路连接整个存储设备的各个部分,作为一种可能的实施方式,处理器202可以包括一个或多个处理核心。进一步的,存储设备还包括硬盘,用于为存储设备提供存储空间。具体实现,在存储设备为存储阵列的场景,存储设备包含存储阵列控制器和硬盘;网卡201和处理器202位于存储阵列控制器中。在存储设备为硬盘框场景中,网卡201和处理器202位于硬盘框中。在分布式存储系统场景中,网卡201和处理器202位于存储服务器中。

本申请实施例涉及的接收数据的方法可以适用于多种接收数据的场景中,以下给出两种可行的场景:

场景一,如图3所示,数据接收端包含处理器、内存和网卡,处理器与内存通信,处理器与网卡通信,内存与网卡通信。数据接收端的网卡为硬件接口,用于实现tcp报文的接收,以及将tcp报文的iscsi头部和scsi分离。数据接收端的处理器执行iscsi驱动的代码,实现数据页面的交换处理(后续进行描述)。数据接收端的处理器执行内核协议栈的代码,实现tcp解析。数据接收端的处理器执行scsi驱动的代码,实现数据存储。那么后文中,iscsi驱动执行的处理,实际上是处理器执行iscsi驱动的代码实现的;scsi驱动执行的处理,实际上是处理器执行iscsi驱动的代码实现的;内核协议栈执行的处理,实际上是处理器执行内核协议栈的代码实现的。

场景二,如图4所示,数据接收端中包括一个网络处理器和内存,网络处理器与内存之间通信。该网络处理器可以包括处理器和网卡,网卡用于实现tcp报文的接收,以及将tcp报文的iscsi头部和scsi分离,处理器用于进行tcp解析、实现数据页面的交换处理等。也即是将场景一中的tcp报文的接收处理、将tcp报文的iscsi头部和scsi分离处理、数据页面的交换处理和对进行tcp解析的处理的模块都设置在一个网络处理器中。

在一种可能的实现方式中,在场景二中,网络处理器的形态可以是数据接收端的融合网卡,即支持toe的网卡。

数据发送端向数据接收端发送tcp报文的过程,数据发送端在处理数据发送端的一个写请求时,会将写请求对应的数据分为两部分,一部分是非请求数据(当然也可以不包括非请求数据),一部分是请求数据。其中,非请求数据是和写命令一起发送的数据(该数据也是数据发送端要发送给数据接收端的数据(此部分数据的数据量小),只不过随写命令一起发送),写命令中携带了所要写入数据的数据长度;请求数据是在得到数据接收端发送的准备传输(readytotransfer,r2t)报文后才发送对应的数据(也就是后文中提到的tcp报文)。具体的,数据发送端将非请求数据和写命令发送至数据接收端,数据接收端的iscsi驱动在处理一个新的写命令时,基于写命令中的数据长度,会通知数据接收端的scsi驱动完成数据页面的分配。数据接收端的scsi驱动基于写命令中的数据长度,为所要写入的数据分配能写入该数据长度的数据页面(该数据页面属于数据接收端的内存)。然后数据接收端的scsi驱动通知数据接收端的iscsi驱动,数据页面已经分配好。数据接收端的iscsi驱动可以把已经接收到的非请求数据拷贝到scsi层提供的数据页面,如果还有数据(即请求数据,也就是后文中提到的tcp报文中的scsi数据),则需要记录这个iscsi命令对应了哪些数据页面,并通知数据发送端发送该写命令对应的数据,即发送后文中提到的tcp报文。

以下结合图5对本申请实施例的接收数据的方法的流程进行描述(以场景一为例进行描述):

步骤501,数据接收端的网卡接收tcp报文。

在本实施例中,数据接收端在通知数据发送端发送写命令对应的数据后,数据发送端的scsi驱动会生成相应的scsi命令,即命令描述符块(commanddescriptorblock,cbd),将scsi命令和请求数据传输至数据发送端的iscsi驱动。数据发送端的iscsi驱动接收到后,可以对cbd和请求数据进行封装,获得iscsi消息包,iscsi消息包包括iscsi头部和scsi数据,然后数据发送端的iscsi驱动将iscsi消息包传输至数据发送端的网卡,数据发送端的网卡将iscsi消息包封装成tcp报文,tcp报文中包括tcp报文头、iscsi头部和scsi数据。然后数据发送端的网卡将tcp报文通过网络传输至数据接收端。数据接收端的网卡接收数据发送端发送的tcp报文。

步骤502,数据接收端的网卡对tcp报文包含的iscsi头部和scsi数据进行分离处理,将scsi数据存储至内存中的目标数据页面。

在本实施例中,数据接收端的网卡将接收到的tcp报文,采用接收侧面合并(receivesidecoalescing,rsc)技术,进行聚合处理(即将接收到的tcp报文进行大接收减负(largereceiveoffload,lro)处理),获得聚合处理后的tcp报文,即将接收到的tcp报文聚合成一条tcp报文。例如,如图6所示,有三条tcp报文,第一条tcp报文(报文1)中包括scsi数据-1,第二条tcp报文(报文2)包括scsi数据-2,第三条tcp报文(报文3)包括scsi数据-3,数据接收端的网卡将这三条tcp报文聚合处理后,获得的一条tcp报文,该tcp中报文包括一个tcp报文头(包括tcp和ip),且包括scsi数据-1、scsi数据-2和scsi数据-3。

然后数据接收端的网卡基于当前存储的上下文信息(此处上下文信息是定界上下文信息(与后文提到的命令上下文信息不相同),定界上下文信息包括iscsi头部的初始位置),对聚合处理后的tcp报文进行识别,获得聚合处理后的tcp报文包含的iscsi头部和scsi数据。具体的,数据接收端的网卡使用当前存储的上下文信息,确定出tcp报文的iscsi头部的初始位置,然后在该iscsi头部中获取到scsi数据的长度,在初始位置偏移iscsi头部的长度(iscsi头部的长度为定长的,如48字节)后,即为scsi数据的开始位置,在该开始位置,偏移scsi数据的长度即为scsi数据的结束位置,从而可以获取到tcp报文包含的scsi数据。并且在初始位置偏移iscsi头部的长度然后再偏移scsi数据的长度,即获取到一个位置,该位置为下一个iscsi头部的初始位置。依照这种方式,即可将tcp报文包含的iscsi头部和scsi数据进行分离。

这样,数据接收端的网卡识别出其中包括的iscsi头部和scsi数据,获得第一分离结果。数据接收端的网卡通过dma技术,将scsi数据分别存储至内存中的目标数据页面(数据页面可以称为是套接字缓存(socketbuffer,skb)结构中的缓存页面)。另外,数据接收端的网卡还可以将iscsi头部存储至内存中除目标数据页面之外的其它数据页面。这样,实现了iscsi头部和scsi数据的分离。

此处需要说明的是,dma技术是使数据接收端的网卡直接在数据接收端的内存中写入网卡接收的数据,而不使用数据接收端的cpu。具体处理过程为:数据接收端的内核协议栈在数据接收端的内存中,为接收数据建立一个环形的缓存序列(该环形的缓存序列中包括多个数据页面),然后该内核协议栈将环形的缓存序列提交至网卡。网卡可以将iscsi头部和scsi数据分别存储至环形的缓存序列中的不同数据页面。

步骤503,数据接收端的处理器根据iscsi头部,获取scsi数据在scsi层数据空间的数据页面。

其中,scsi数据在scsi层数据空间的数据页面也属于数据接收端的内存。

在本实施例中,数据接收端的网卡将iscsi头部和scsi数据分别存储至不同的数据页面后,数据接收端的网卡可以向数据接收端的内核协议栈发送中断消息。数据接收端的内核协议栈接收到中断消息后,该内核协议栈可以将iscsi头部中的tcp报文头去掉,以及完成scsi数据的tcp乱序和拥塞处理。然后该内核协议栈可以向数据接收端的iscsi驱动发送读取iscsi头部的读取消息。数据接收端的iscsi驱动接收到读取iscsi头部的读取消息,可以在内核协议栈提供的数据页面中,读取tcp报文的iscsi头部。

数据接收端的iscsi驱动读取到tcp报文的iscsi头部后,可以根据iscsi头部中获取基本报文头段(basicheadersegment,bhs),该bhs为iscsi头部中的第一个段,占用48bit,bhs包括cbd、数据段长度(即scsi数据的长度)等。然后数据接收端的iscsi驱动从bhs中,获取到scsi数据的长度。数据接收端的iscsi驱动将该scsi数据的长度以及命令描述符块传输至数据接收端的scsi驱动。数据接收端的scsi驱动接收到scsi数据的长度以及cbd后,可以确定这是一个数据写入指令,可以获取能存储该scsi数据的长度的数据页面的指针(该指针也可以称为是地址,该指针为数据页面在数据接收端的内存中的地址),然后将该指针返回给数据接收端的iscsi驱动。数据接收端的iscsi驱动接收到存储该scsi数据的长度的数据页面的指针,即获取到scsi数据在scsi层数据空间的数据页面。需要说明的是,由于tcp报文包含的scsi数据有可能不是数据发送端要写入数据接收端的所有数据,也有可能是数据发送端要写入数据接收端的所有数据,所以此处scsi数据的长度可能是数据发送端要写入数据接收端的数据中部分数据的长度,也可能是数据发送端要写入数据接收端的数据中的全部数据的长度。

例如,目标数据页面为数据页面1和数据页面2,数据接收端的scsi驱动给数据接收端的iscsi驱动返回数据页面5和数据页面6的指针。数据接收端的scsi驱动返回的数据页面的数目与目标数据页面的数目相同。

需要说明的是,上述数据接收端的网卡向数据接收端的内核协议栈发送中断消息的触发条件可以是:数据接收端的网卡接收到一定数据量的tcp报文后触发,也可以是每隔一段时长进行触发,当然也可以是基于数据接收端的性能考虑的其它触发机制,本申请实施例不做限定。由于本申请实施例涉及数据的写入,所以命令描述符块描述的是数据写入指令。

步骤504,数据接收端的处理器根据scsi数据在scsi层数据空间的数据页面,采用数据页面交换的方式,将scsi数据从目标数据页面存储至scsi层数据空间。

其中,scsi层数据空间为数据接收端的scsi驱动对应的数据空间。

在本实施例中,数据接收端的iscsi驱动可以根据scsi数据在scsi层数据空间的数据页面和scsi数据当前存储的数据页面,采用页面交换的方式,将scsi数据存储至scsi层数据空间。这样,由于scsi数据是采用页面交换的方式存储至scsi层数据空间,而不是经过复制处理,所以可以减少数据接收端的cpu的占用,降低了数据接收端的cpu的负载。

在一种可能的实现方式中,在步骤504中,将scsi数据存储至scsi层数据空间的处理可以为:

数据接收端的处理器将目标数据页面的指针存储至scsi层数据空间,将scsi数据在scsi层数据空间的数据页面的指针用于存储网卡后续接收到的tcp报文。

在本实施例中,数据接收端的iscsi驱动可以向内核协议栈,发送scsi数据所存储的数据页面的获取消息,该获取消息中携带scsi数据在scsi层数据空间的数据页面的指针。数据接收端的内核协议栈接收到该获取消息后,可以从中解析到scsi层数据空间的数据页面的指针,将该指针添加至环形的缓存序列,向iscsi驱动发送scsi数据所存储的数据页面的指针。数据接收端的iscsi驱动接收到scsi数据所存储的数据页面的指针,可以向scsi驱动发送scsi数据所存储的数据页面的指针(即目标数据页面的指针)。

数据接收端的scsi驱动接收scsi数据所存储的数据页面的指针。这样,scsi驱动获取到scsi数据所存储的数据页面的指针,后续scsi驱动可以基于该指针,获取scsi数据,将scsi数据存储至数据接收端的磁盘,或者,将scsi数据存储至scsi驱动对应的缓存池等。在scsi驱动将scsi数据存储至磁盘后,scsi驱动可以将目标数据页面中的scsi数据删除,供后续数据页面的交换。

这样,将scsi层数据空间的数据页面的指针提供给网卡,供网卡接收后续接收到的tcp报文,将scsi数据存储的数据页面的指针提交给scsi驱动,是交换指针的处理,并未进行scsi数据的复制,所以降低了数据接收端的cpu的负载。

需要说明的是,上述scsi层数据空间的数据页面可以是数据接收端的内核协议栈提供给scsi驱动的未存储数据的数据页面。

另外,在本申请实施例中,iscsi头部作为控制数据,是不会进入scsi层数据空间中。在将tcp报文的scsi数据写入至scsi层数据空间后,scsi驱动可以通知内核协议栈删除iscsi头部。

在一种可能的实现方式中,为了使获取到的scsi数据比较准确,可以在iscsi驱动执行数据页面的交换之前,判断网卡分离iscsi头部和scsi数据获得的分离结果是否正确,相应的处理为:

数据接收端的处理器确定第一分离结果正确,其中,第一分离结果为数据接收端的网卡对tcp报文包含的iscsi头部和scsi数据进行分离处理,获得的分离结果。

在本实施例中,数据接收端的iscsi驱动获取到第一分离结果后,可以判断第一分离结果是否正确。数据接收端的iscsi驱动在判断第一分离结果正确的情况下,可以执行数据页面的交换。这样,iscsi驱动在第一分离结果正确的情况下,才会将scsi数据提供给scsi驱动,可以尽可能的保证提交至scsi驱动的scsi数据正确。

在一种可能的实现方式中,iscsi驱动基于自己对iscsi头部和scsi数据的分离结果,判断第一分离结果是否正确,相应的处理可以为:

处理器对tcp报文包含的iscsi头部和scsi数据进行分离处理,获得第二分离结果。当第一分离结果与第二分离结果相同,则确定第一分离结果正确。

在本实施例中,数据接收端的iscsi驱动可以将网卡分离的iscsi头部和scsi数据进行合并处理,然后基于自身存储的上下文信息(该上下文信息为定界上下文信息,包含iscsi头部的初始位置),对合并处理后的报文中的iscsi头部和scsi数据进行分离(该处理过程可以称为是iscsipdu定界处理,处理过程与网卡分离iscsi头部和scsi数据的过程相同,只不过使用的上下文信息不相同),获得分离后的iscsi头部和scsi数据,即为第二分离结果。

然后iscsi驱动判断第一分离结果与第二分离结果是否相同,当第一分离结果和第二分离结果相同,则可以确定第一分离结果正确,数据接收端的iscsi驱动可以执行数据页面的交换处理。

当第一分离结果与第二分离结果不相同,则数据接收端的iscsi驱动可以确定第一分离结果不正确,iscsi驱动可以获取第二分离结果中的scsi数据,将第二分离结果获得的scsi数据复制至scsi层数据空间的数据页面,而不执行数据页面的交换。这样,在第一分离结果不正确的情况下,可以采用复制的方式,将tcp报文包含的scsi数据复制至scsi数据空间的数据页面。这样,可以尽可能的保证提交至scsi驱动的scsi数据正确。

另外,在的iscsi驱动确定第一分离结果不正确的情况下,iscsi驱动还可以执行以下处理,使数据接收端的网卡后续分离iscsi头部和scsi数据正确,处理可以为:

数据接收端的处理器向网卡发送目标消息,其中,目标消息中携带有目标上下文信息,目标上下文信息用于分离iscsi头部。数据接收端的网卡将获得第一分离结果的上下文信息替换为目标上下文信息。

本实施例中,数据接收端的iscsi驱动可以生成目标消息,在目标消息中携带目标上下文信息(目标上下文信息是定界上下文信息,与后文提到的命令上下文信息不相同),该目标上下文信息是iscsi驱动分离iscsi头部和scsi数据使用的上下文信息。具体的,目标消息中携带的目标上下文信息可以是tcp序列号,可以用于定位iscsi头部的初始位置等。数据接收端的iscsi驱动向数据接收端的网卡发送目标消息。

数据接收端的网卡接收到目标消息后,可以从中解析到目标上下文信息,然后使用目标上下文信息替换获得第一分离结果的上下文信息。这样,数据接收端的网卡后续可以使用替换后的上下文信息分离iscsi头部,可以尽可能的保证iscsi头部和scsi数据的分离结果正确。

在一种可能的实现方式中,为了使获取到的scsi数据比较准确,iscsi驱动还可以判断存储scsi数据的数据页面中的scsi数据是否符合对齐要求(该对齐要求是4k对齐要求),在符合对齐要求时,执行数据页面的交换处理。这样,在存储scsi数据的数据页面中的scsi数据符合对齐要求的情况下,才会执行数据页面的交换处理,可以使提交至scsi驱动的scsi数据正确。

此处需要说明的是,对齐要求是scsi层的要求,目前很多情况中scsi层是按照逻辑区块地址(logicalblockaddress,lba)来完成对齐。不同的scsi层实现时,可以采用不同的对齐要求。例如,lba地址为1,要求在scsi层数据空间的数据页面中偏移(offset)为512字节的位置开始存放数据。

一般情况下,数据页面中的scsi数据符合对齐要求,只有在少数情况下数据页面中的scsi数据不符合对齐要求,所以从整体上还是可以降低数据接收端的cpu的占用。

另外,数据接收端的iscsi驱动在判断出存储scsi数据的数据页面中的scsi数据不符合对齐要求时,iscsi驱动可以将scsi数据复制至scsi层数据空间的数据页面,这样,在不符合对齐要求的情况下,直接将scsi数据复制至scsi层数据空间的数据页面,而不采用数据页面的交换,可以使scsi数据正确的存储至scsi层数据空间的数据页面。

需要说明的是,在本申请实施例中,在多数场景下,iscsi头部在tcp报文头中,且丢包/乱序等造成不能完成不能聚合(即不能大接收减负)的概率很低,所以网卡可以大概率的实现tcp报文包含的iscsi头部和scsi数据进行分离。而且scsi数据一般都是按照4k对齐的方式进行处理,所以多数场景下能够执行数据页面的交换,进而可以减少scsi数据的复制,减少数据接收端的cpu的占用。

在本申请实施例中,数据接收端的网卡接收tcp报文,数据接收端的网卡对tcp报文包含的iscsi头部和scsi数据进行分离处理,将iscsi头部和scsi数据分别存储至不同数据页面,数据接收端的iscsi驱动根据iscsi头部,获取scsi数据在scsi层数据空间的数据页面。数据接收端的iscsi驱动根据scsi数据在scsi层数据空间的数据页面,采用数据页面交换的方式,将scsi数据存储至scsi层数据空间。这样,由于是数据接收端的网卡将iscsi头部和scsi数据进行分离,存储至内核协议栈提供的数据页面,而且数据接收端的iscsi驱动将scsi数据采用页面交换的方式,提供给数据接收端的scsi驱动,而没有进行数据的复制处理,所以在数据接收方向上,实现数据零拷贝,可以减少数据接收端的cpu的占用,进而可以提升数据接收端的存储性能。

另外,由于数据接收端的iscsi驱动和内核协议栈还是采用软件实现,而未采用tcp卸载引擎和iscsi卸载引擎,所以可以避免复杂的tcp卸载引擎和iscsi卸载引擎(要实现tcp卸载引擎和iscsi卸载引擎,需要重新设计网卡中的逻辑电路,开发周期长),进而可以避免tcp卸载引擎和iscsi卸载引擎兼容性问题,以及可以避免不能使用linux系统下内核协议栈的各种新协议(如拥塞控制(bottleneckbandwidthandround-triptime,bbr)技术)等。

另外,从本申请实施例的上述描述可知,数据接收端的网卡仅需要完成多条tcp报文的聚合,维护定界上下文信息,以及tcp报文包含的iscsi头部和scsi数据的分离,而不需要完成iscsi会话控制(session)、tcp连接(connection)、命令上下文信息的维护,也不需要处理tcp乱序、丢包这些场景,这些都直接提交给内核协议栈处理。iscsisession指数据发送端和数据接收端的一组tcp连接构成一个session。tcp连接指数据发送端和数据接收端之间的一个或多个tcp连接。命令上下文信息指数据发送端和数据接收端之间的一条命令的上下文信息。

另外,对应场景一,为了更好的理解本申请实施例,本申请实施例中还提供了图7所示的数据接收端的信令流程图。

步骤701,网卡接收tcp报文。

步骤702,网卡分离tcp报文的iscsi头部和scsi数据,将iscsi头部和scsi数据分别写入不同的数据页面。例如,iscsi头部写入数据页面3,scsi数据写入数据页面1和数据页面2。

步骤703,网卡向内核协议栈发送中断消息。

步骤704,内核协议栈通知iscsi驱动读取iscsi头部的读取消息。

步骤705,iscsi驱动解析iscsi头部的bhs,获得解析结果。

步骤706,iscsi驱动根据解析结果,向scsi驱动发送cbd和scsi数据的长度。

步骤707,scsi驱动根据cbd和scsi数据的长度,向iscsi驱动发送数据页面。例如,数据页面为数据页面5和数据页面6。

步骤708,iscsi驱动向内核协议栈发送scsi数据所存储的数据页面的获取消息,该获取消息中携带scsi数据在scsi层数据空间的数据页面的指针。

步骤709,内核协议栈获取存储的scsi数据的数据页面1和数据页面2的指针,将scsi数据的数据页面1和数据页面2的指针返回给iscsi驱动。

步骤710,iscsi驱动可以将数据页面1和数据页面2的指针返回scsi驱动。

步骤711,scsi驱动可以执行后续处理。

另外,对应于图7的流程图,本申请实施例中,如图8所示,还提供了更便于理解的数据接收端执行接收数据的示意图。

在接收数据的方法应用于场景二中,数据接收端的网络处理器中可以实现tcp报文的iscsi头部和scsi分离、对tcp进行解析、实现数据页面的交换处理,进而获得tcp报文包含的scsi数据。然后网卡将scsi数据按照页面交换的方式,提交至scsi层数据空间的数据页面,即提交至scsi驱动,所以也可以采用本申请实施例的方式,实现tcp卸载引擎和iscsi卸载引擎,进而可以实现以toe为基础的ioe。

图9是本申请实施例提供的接收数据的装置的结构图。该装置可以通过软件和硬件结合实现成为装置中的部分或者全部。本申请实施例提供的装置可以实现本申请实施例图5所述的流程,该装置包括:接收模块910、存储模块920和获取模块930,其中:所述装置包括:

接收模块910,用于接收tcp报文;所述tcp报文包含iscsi头部和scsi数据,具体可以用于实现步骤501的接收功能以及执行步骤501包含的隐含步骤;

存储模块920,用于将所述scsi数据存储至所述内存中的目标数据页面,具体可以用于实现步骤502的存储功能以及执行步骤502包含的隐含步骤;

获取模块930,用于根据所述iscsi头部,获取所述scsi数据在scsi层数据空间的数据页面,具体可以用于实现步骤503的获取功能以及执行步骤503包含的隐含步骤;

所述存储模块920,还用于根据所述scsi数据在scsi层数据空间的数据页面,采用数据页面交换的方式,将所述scsi数据从所述目标数据页面存储至所述scsi层数据空间,具体可以用于实现步骤504的存储功能以及执行步骤504包含的隐含步骤。

在一种可能的实现方式中,如图10所示,所述装置还包括:

定界模块940,用于基于上下文信息,对所述tcp报文包含的所述scsi数据和所述iscsi头部进行分离处理,获得第一分离结果;

所述存储模块920,还用于确定第一分离结果正确。

在一种可能的实现方式中,所述存储模块920,还用于:

对所述tcp报文包含的所述iscsi头部和所述scsi数据进行分离处理,获得第二分离结果;

当所述第一分离结果与所述第二分离结果相同,则确定所述第一分离结果正确。

在一种可能的实现方式中,所述存储模块,还用于:

当所述第一分离结果与所述第二分离结果不相同,则所述处理器基于所述第二分离结果,将所述tcp报文包含的scsi数据复制至所述scsi层数据空间的数据页面。

在一种可能的实现方式中,如图11所示,所述装置还包括:

发送模块950,用于向所述网卡发送目标消息,其中,所述目标消息中携带有目标上下文信息,所述目标上下文信息用于分离iscsi头部;

替换模块960,用于将获得所述第一分离结果的上下文信息替换为所述目标上下文信息。

在一种可能的实现方式中,所述存储模块920,还用于:

确定所述目标数据页面中的scsi数据符合对齐要求。

在一种可能的实现方式中,所述存储模块920,还用于:

当所述目标数据页面中的scsi数据不符合对齐要求,则将所述scsi数据复制至所述scsi层数据空间的数据页面。

在一种可能的实现方式中,所述存储模块920,用于:

将所述目标数据页面的指针存储至scsi层数据空间,将所述scsi数据在scsi层数据空间的数据页面的指针用于存储所述网卡后续接收到的tcp报文。

本申请实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时也可以有另外的划分方式,另外,在本申请各个实施例中的各功能模块可以集成在一个处理器中,也可以是单独物理存在,也可以两个或两个以上模块集成为一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。本实施例的接收数据的装置具体实现,可以参考本发明方法实施例部分的描述。

本申请实施例中,还提供了一种计算机可读存储介质,计算机可读存储介质存储有计算机指令,当计算机可读存储介质中存储的计算机指令被数据接收设备执行时,使得数据接收设备执行上述所提供的接收数据的方法。

本申请实施例中,还提供了一种包含指令的计算机程序产品,当其在数据接收设备上运行时,使得数据接收设备执行上述所提供的接收数据的方法。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现,当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令,在服务器或终端上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴光缆、光纤、数字用户线)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是服务器或终端能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(如软盘、硬盘和磁带等),也可以是光介质(如数字视盘(digitalvideodisk,dvd)等),或者半导体介质(如固态硬盘等)。

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