一种数据传输方法及装置
技术领域
本申请涉及存储技术领域,尤其涉及一种数据传输方法及装置。
背景技术
互联网用户以及业务数据的激增,对存储系统的数据读写速率的要求越来越高。网间协议存储局域网络(internet protocol storage area network,IP SAN)存储系统由于其能够在高速(百兆、千兆或者万兆等)以太网上快速地进行数据存储、数据备份等操作的优点,被广泛使用。
请参考图1,是IP SAN存储系统的一种示例。如图1所示,该IP SAN存储系统中包括客户端、存储服务器和至少一个存储设备,客户端、存储服务器和至少一个存储设备之间通过IP网络连接,其中,存储服务器和至少一个存储设备构成存储局域网络SAN,客户端基于因特网小型计算机系统接口(internet small computer system interface,iSCSI)协议与存储服务器通信,从而通过存储服务器对至少一个存储设备中的数据进行读写操作等。
作为一种示例,当客户端需要将应用程序A的数据存储在至少一个存储设备时,客户端首先生成将该数据写入存储设备的SCSI指令,将SCSI指令和数据封装成iSCSI协议数据单元,然后,将iSCSI协议数据单元封装成IP报文,通过与存储服务器之间的IP网络发送给存储服务器。存储服务器的网卡在接收到该IP报文后,从该IP报文中得到该应用程序A的数据,然后将该应用程序A的数据存储至对应的存储设备,实现了存储网络与IP网络的无缝融合。
请参考图2,在现有技术中,存储服务器对IP报文的处理过程如下:
存储服务器的网卡在接收到客户端发送的IP报文后,首先通过直接内存存取(direct memory access,DMA)方式,将该IP报文存储到存入存储服务器的至少一个套接字缓冲区(socket buffer,SKB)(可以理解为通过驱动环形缓冲区将该IP报文存储到至少一个SKB),从而提交给存储服务器的内核进行处理。内核首先将SKB中的IP报文进行解封装,解析TCP协议,获取TCP包头中的四元组,然后根据该四元组将每一个SKB中的解析后的报文映射到TCP接收队列,等待处理。当处理到该解析后的报文时,内核根据每个SKB中的解析后的报文对应的四元组,确定该报文是发送给应用程序A的,内核通知存储服务器中的应用程序A。应用程序A通过调用与该应用程序A对应的套接字(socket)接口应答内核。从而,内核在接收该应答后,则对该TCP接收队列中的报文进行协议解析,解析iSCSI协议,得到iSCSI协议数据单元,然后将iSCSI协议数据单元的数据,通过该socket接口将该数据拷贝到该应用程序的缓冲区内,再由应用程序将该缓冲区中的数据存储到存储设备相应的存储空间中。
为了保证数据不乱序,socket接口一般只能利用存储服务器的单个处理器作为内核,将一个应用程序的数据进行缓存到应用程序对应的缓冲区中的处理。这样,当数据较大时,例如,该数据的大小为1兆字节(megabyte,M),由于每个SKB中只能存储固定字节(例如,8千字节(kilobyte,kB))的数据,从而该数据对应有1024/8=128个SKB,则该处理器将不断地重复地从这128个SKB中拷贝数据,该拷贝过程会耗费该处理器大量的处理资源,也就是说处理器需要耗费较长的时间执行该拷贝过程,使得存储服务器到存储设备之间数据的传输速度受限,从而无法适用于高速以太网场景。
发明内容
本申请提供一种数据传输方法及装置,用以提高存储局域网络中数据传输的速度,提升存储局域网络的存储性能。
第一方面,提供一种数据传输方法,该方法可以应用于存储系统的服务器中,该服务器通过多核处理器运行包括第一应用程序在内的至少一个应用程序,在需要向该第一应用程序传输数据时,首先获取该第一应用程序对应的待存储数据,生成M个拷贝请求,每一个拷贝请求用于请求将该待存储数据中的一部分数据拷贝到该第一应用程序对应的接收缓冲区,然后,将该M个拷贝请求提交给N个守护线程进行处理,该N个守护线程中的每一个守护线程与该多核处理器中的一个处理器绑定,以使每个守护线程根据接收到的拷贝请求将该待存储数据中的一部分数据写入该接收缓冲区,M、N为大于1的正整数。
在上述技术方案中,首先为该服务器的多核处理器中的每一个处理建立守护线程,然后,在需要将待存储的数据拷贝到应用程序的接收缓冲区时,可以生成若干个拷贝请求,将每个拷贝请求分配到多个处理器对应的多个守护线程进行拷贝,从而可以利用该多个处理器一起执行该拷贝过程,可以提高数据的传输速度,提升存储局域网络的存储性能,以适应高速以太网场景。
进一步,上述技术方案不需要专用硬件便能提高数据的传输速度,成本低,易于实现。
在一种可能的设计中,首先将与该第一应用程序对应的接收缓冲区分为M份,得到M个接收子缓冲区,然后则根据该待存储数据及该M个接收子缓冲区,生成该M个拷贝请求。
在上述技术方案中,可以通过将应用程序的接收缓冲区进行分区,然后根据该待存储数据的一部分数据与一个接收子缓冲区生成一个拷贝请求,从而将该拷贝过程分成多个拷贝请求,从而可以将该多个拷贝请求分发给多个处理器进行处理。
在一种可能的设计中,先确定该第一应用程序对应的待存储数据的大小是否大于预设阈值,在大于预设阈值时,才将与该第一应用程序对应的接收缓冲区分为M份,然后生成M个拷贝请求。
在上述技术方案中,当待存储的数据较大时,才需要根据该待存储数据生成M个拷贝请求,当待存储的数据较小时,则可以采用现有技术中的方式进行数据拷贝,从而可以根据待存储数据的大小来调整数据拷贝的方式,增加方案的灵活性。
在一种可能的设计中,待存储数据在服务器中会以P个套接字缓冲区SKB的方式进行存储,每个SKB包括由客户端发送的待存储数据以及该待存储数据所属的应用程序的端口号,则可以根据每个SKB包括的应用程序的端口号,从该P个SKB中选择与所述第一应用程序的端口号相同的K个SKB,并将该K个SKB中包括的待存储数据,作为获取的与该第一应用程序对应的待存储数据,P、K为正整数。
在上述技术方案中,在服务器中传输给应用程序的数据是以SKB的形式进行存储的,从而可以直接从该多个SKB中获取待存储的数据,实现方式简单。
在一种可能的设计中,若将与该第一应用程序对应的接收缓冲区分为M份,则可以建立包括该待存储的数据的K个数据页面与该M个接收子缓冲区的映射关系,并基于该映射关系,生成M个拷贝请求,该K个数据页面中的每一个数据页面中包括该K个SKB中的至少一个SKB中的数据,从而使得每个拷贝请求与一个目标接收子缓冲区对应,且每个拷贝请求用于请求将与该拷贝请求对应的目标接收子缓冲区映射的至少一个数据页面中包括的待存储数据拷贝到该目标接收子缓冲区。
在上述技术方案中,处理器可以直接根据该守护线程所分配到的拷贝请求,对至少一个SKB中的数据进行操作,从而可以不用在内核中进行拷贝,可以减少socket的锁冲突时间。
在一种可能的设计中,该包括服务器的存储系统还包括存储设备,则当将M个拷贝请求提交给N个守护线程进行处理后,可以接收该N个守护线程中的一个守护线程发送的用于指示该N个守护线程已经完成该M个拷贝请求第一指示信息,从而,向该第一应用程序发送第二指示信息,以使第一你应用程序根据该第二指示信息,将该第一应用程序对应的缓冲区中缓存的该待存储数据写入该存储设备中与该第一应用程序对应的存储空间中。
在上述技术方案中,每个守护线程在完成分配的拷贝请求后,可以生成拷贝完成的指示信息,当该N个守护线程中最后一个完成拷贝请求的守护线程在完成其拷贝请求后,可以查看其他守护线程是否有生成对应的指示信息,当其他守护线程均生成对应的指示信息后,则最后一个完成拷贝请求的守护线程则可以生成第一指示信息,以告知服务器所有的守护线程已经完成拷贝请求,这样,当检测到第一指示信息后,则向第一应用程序发送该第二指示信息,以将该接收缓冲区中的待存储数据存储到存储设备,方式简单易于实现。
在一种可能的设计中,与该第一应用程序对应的接收缓冲区包括针对该第一应用程序的数据进行输入/输出I/O请求的I/O缓冲区。
在上述技术方案中,对于基于IO进行交互的TCP/IP应用程序,可以直接按照IO请求进行分核拷贝,可以增加方案的通用性。
第二方面,提供一种数据传输装置,该数据传输装置可以是存储系统中的服务器,也可以是存储系统的服务器中的装置,该数据传输装置可以包括通信模块和处理模块,这些模块可以执行上述第一方面任一种设计示例中的方法,具体的:
所述通信模块,用于获取存储系统中的服务器上的第一应用程序对应的待存储数据,所述服务器通过多核处理器运行包括所述第一应用程序在内的至少一个应用程序;
所述处理模块,用于生成M个拷贝请求,每一个拷贝请求用于请求将所述待存储数据中的一部分数据拷贝到所述第一应用程序对应的接收缓冲区,所述M为大于1的整数,以及,
将所述M个拷贝请求提交给N个守护线程进行处理,以使每个所述守护线程根据接收到的拷贝请求将所述待存储数据中的一部分数据写入所述接收缓冲区,所述N个守护线程中的每一个守护线程与所述多核处理器中的一个处理器绑定,所述N为大于1的正整数。
在一种可能的设计中,所述处理模块生成M个拷贝请求时,具体用于:
将与所述第一应用程序对应的接收缓冲区分为M份,得到M个接收子缓冲区;
根据所述待存储数据及所述M个接收子缓冲区,生成所述M个拷贝请求。
在一种可能的设计中,在所述处理模块将与所述第一应用程序对应的接收缓冲区分为M份之前,所述处理模块还用于:
确定所述第一应用程序对应的待存储数据的大小大于预设阈值。
在一种可能的设计中,所述通信模块获取存储系统中的服务器上的第一应用程序对应的待存储数据时,具体用于:
在P个套接字缓冲区SKB选择K个SKB,其中,所述P个SKB中的每个SKB包括由客户端发送的待存储数据以及该待存储数据所属的应用程序的端口号,P、K为正整数,所述K个SKB中的每个SKB包括的应用程序的端口与所述第一应用程序的端口号相同;
将K个SKB中包括的待存储数据,作为获取的与所述第一应用程序对应的待存储数据。
在一种可能的设计中,所述处理模块在生成M个拷贝请求时,具体用于:
建立所述K个数据页面与所述M个接收子缓冲区的映射关系,所述K个数据页面中的每一个数据页面中包括所述K个SKB中的至少一个SKB中的数据;
基于所述映射关系,生成M个拷贝请求,每个拷贝请求与一个目标接收子缓冲区对应,并用于请求将与所述目标接收子缓冲区映射的至少一个数据页面中包括的待存储数据拷贝到所述目标接收子缓冲区。
在一种可能的设计中,所述存储系统还包括存储设备;所述装置还包括:
收发模块,用于接收所述N个守护线程中的一个守护线程发送的第一指示信息,所述第一指示信息用于指示所述N个守护线程已经完成所述M个拷贝请求;以及,
向所述第一应用程序发送第二指示信息,所述第二指示信息用于指示所述第一应用程序将所述第一应用程序对应的缓冲区中缓存的所述待存储数据写入所述存储设备中与所述第一应用程序对应的存储空间中。
在一种可能的设计中,与所述第一应用程序对应的接收缓冲区包括针对所述第一应用程序的数据进行输入/输出I/O请求的I/O缓冲区。
第三方面,提供一种数据传输装置,所述数据传输装置包括处理器,用于实现上述第一方面描述的方法。所述数据存储装置还可以包括存储器,用于存储程序指令和数据。所述存储器与所述处理器耦合,所述处理器可以调用并执行所述存储器中存储的程序指令,用于实现上述第一方面描述的方法中的任意一种方法。
第四方面,提供一种计算机可读存储介质,所述介质上存储有指令,当所述指令在计算机上运行时,使得计算机执行第一方面中任意一项所述的方法。
第五方面,提供一种计算机程序产品,所述计算机程序产品包含有指令,当所述指令在计算机上运行时,使得所述计算机执行第一方面中任意一项所述的方法。
第六方面,提供了一种芯片系统,该芯片系统包括处理器,还可以包括存储器,用于实现第一方面任意一项所述的方法。该芯片系统可以由芯片构成,也可以包含芯片和其他分立器件。
上述第二方面至第六方面及其实现方式的有益效果可以参考对第一方面的方法及其实现方式的有益效果的描述。
附图说明
图1为本申请实施例中IP SAN存储系统的一种示例的示意图;
图2为现有技术中存储服务器对IP报文的处理过程的流程图;
图3为本申请实施例中IP SAN存储系统的另一种示例的示意图;
图4为本申请实施例提供的数据传输方法的一种示例的流程图;
图5为本申请实施例提供的用于在IP SAN存储系统传输的IP报文的一种示意图;
图6为本申请实施例中步骤S408~步骤S409的执行过程的一种示意图;
图7为本申请实施例提供的数据传输方法的另一种示例的流程图;
图8为本申请实施例中步骤S708~步骤S709的执行过程的一种示意图;
图9为本申请实施例中提供的一种数据传输装置的一种示例的结构图;
图10为本申请实施例中提供的一种数据传输装置的另一种示例的结构图。
具体实施方式
为了使本申请实施例的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施例作进一步地详细描述。
在本申请的描述中,“多个”是指两个或两个以上,也可以将“多个”理解为“至少两个”。“至少一个”,可理解为一个或多个,例如理解为一个、两个或更多个,包括至少一个,是指包括一个、两个或更多个,而且不限制包括的是哪几个,例如,包括A、B和C中的至少一个,那么包括的可以是A、B、C、A和B、A和C、B和C、或A和B和C。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,单独存在B,同时存在A和B这三种情况。另外,字符“/”,如无特殊说明,一般表示前后关联对象是一种“或”的关系。
除非有相反的说明,本申请中提及“第一”、“第二”等序数词用于对多个对象进行区分,不用于限定多个对象的顺序、时序、优先级或者重要程度。
本申请实施例提供一种数据传输方法,该方法应用于IP SAN存储系统中。该IPSAN存储系统可以为文件存储系统、块存储系统或者对象存储系统,或者上述存储系统的组合,在本申请实施例中不作限制。
早期的存储系统中,存储设备与存储服务器是直接安装在一个机箱内的,也就是说,某一个存储设备是一个存储服务器独占使用的。然而,随着存储服务器的数量越来越多,对应的存储设备的数量也在增加,且由于多个存储设备是不同的存储服务器独占使用的,因此,当需要查看不同的存储设备的运行状态或者对不同的存储设备进行操作时(例如更换存储设备等),都需要到不同的存储服务器上进行,操作过程复杂。需要说明的是,在本申请实施例中,“存储服务器”和“服务器”可以互换使用。
为了简化上述过程,提出了一种通过网络方式连接至少一个存储设备和至少一个存储服务器的存储构架,该用于连接至少一个存储设备和至少一个存储服务器的网络专用于存储服务器和存储设备之间的访问。当需要存储或读取数据时,该数据可以通过该网络在至少一个存储服务器和至少一个存储设备之间高速传输,该存储架构被称为存储区域网络(storage aera network,SAN)存储系统。
在SAN存储系统中,传输的指令是基于小型计算机系统接口(small computersystem interface,SCSI)协议的数据读写指令,而不是IP报文,因此,SAN存储系统起初是使用光纤通道(fibre channel,FC)技术建立的。随着通信技术的发展,出现了能够在IP网络上运行SCSI协议的通信技术,即互联网小型计算机系统接口(internet small computersystem interface,iSCSI)技术,使SAN存储系统能够在百兆、千兆等高速的以太网上进行快速的数据读写等操作,这种基于IP网络的SAN存储系统被称为IP SAN存储系统。
IP SAN存储系统的另一种示例如图3所示。与图1不同的是,在图3所示的IP SAN存储系统中,多个客户端可以通过IP网络与同一个存储服务器连接,在图3所示的IP SAN存储系统中包括2个客户端,分别为客户端A和客户端B,该2个客户端分别与一个存储服务器连接,该存储服务器与一个集群存储设备连接,这样,可以通过该存储服务器和该集群存储设备为更多的客户端提供服务。
需要说明的是,IP SAN存储系统不限于如图1和图3所示的架构,例如,IP SAN存储系统中可以包括更多的客户端和/或更多的存储服务器,或者,在IP SAN存储系统中还可以包括用于连接存储服务器和存储设备的连接设备等,或者,客户端和存储服务器之间还可以包括网络交换机等,本申请实施例描述的IP SAN存储系统是为了更加清楚的说明本申请实施例的技术方案,并不构成对于本申请实施例提供的技术方案的限定,本领域普通技术人员可知,随着存储技术和存储系统架构的演变,本申请实施例提供的技术方案对于类似的技术问题,同样适用。
如图1和图3所示的IP SAN存储系统中,客户端和存储服务器均可以支持多种操作系统,例如,windows操作系统、unix操作系统、linux操作系统、solaris操作系统等。客户端和存储服务器中可以运行至少一个基于TCP/IP协议的应用程序,例如,提供超文本传输协议(hyperText transfer protocol,HTTP)服务的应用程序、提供文件传输协议(filetransfer protocol,FTP)服务的应用程序、用于测试网络性能(例如,抖动、延时、丢包率等)的iperf应用程序等,在本申请实施例中不对客户端和存储服务器中的操作系统和应用程序进行限制。
操作系统的核心是内核,它负责管理操作系统中的进程、内存、设备驱动程序以及文件等。在操作系统的设计中,往往将一些与硬件紧密相关的(例如,中断处理程序、设备驱动程序等)、基本的、公共的、处理频率较高的模块(例如时钟管理、进程调度等)以及关键性数据独立开来,使这些内容可以常驻内存,并对他们进行保护,通常将这一部分称之为操作系统的内核。内核的实质是一段程序代码,通过处理器调用内核对应的程序代码来实现内核的功能。
需要说明的是,在图1和图3所示的IP SAN存储系统中,存储服务器中的处理器架构为多核处理器架构。多核处理器架构是指,利用多核技术在一枚处理器中集成两个或多个完整的计算引擎,该计算引擎即为处理器核心,多核之间通过芯片内部总线进行通信,共享使用内存。多核处理器中的多个处理器核心可以轮流调用内核对应的程序代码以实现内核的功能,内核可以将要处理的任务分解成多个部分,分别给予不同的处理器核心进行处理,从而得到最终的处理结果。例如,内核收到了用于打开浏览器的操作请求,打开浏览器的操作需要执行代码解析、多媒体播放、脚本解析等一系列任务,这些任务则可以并行地分配到多核处理器中的每个处理器核心进行处理,例如,第一个处理器核心用于执行代码解析的任务,第二个处理器核心用于执行多媒体播放的任务,第三个处理器核心用于执行脚本解析的任务,从而可以加快多核处理器的处理速度,减少响应时延。
在图1和图3所示的IP SAN存储系统中,当存储服务器接收到客户端发送的与某一个应用程序(例如,应用程序A)对应的数据时,存储服务器通过socket接口将该数据拷贝到该应用程序的缓冲区内,具体拷贝方式如图2所示,在此不再赘述。由于socket接口一般只能利用存储服务器的单个处理器进行处理,从而当需要拷贝的数据较大时,该拷贝过程会耗费该处理器大量的处理资源,使得存储服务器到存储设备之间数据的传输速度受限,从而无法适用于高速以太网场景(具体请参照背景技术中的问题介绍)。
在现有技术中,为解决上述问题,采用如下两种处理方式:
第一种处理方式,在存储服务器中增加TCP卸载引擎(TCP offload engine,TOE)芯片,通过该TOE芯片卸载IP报文中的TCP/IP协议,可以极大的减少处理器的开销,提高处理器的处理速度。但是,由于TOE芯片价格较贵,且使用TOE芯片需要专用硬件,且不同的TOE芯片的专用硬件无法通用,导致该处理方式的成本较高。
第二种处理方式,将内核中包括的TCP/IP协议栈及设备驱动部分用户态化,这样,采用用户态化后的内核可以利用存储服务器的多核处理器轮询收包,从而可以提升存储服务器的处理速度。但是,用户态化方法目前还不成熟,可能会导致存储服务器的处理性能不稳定,且存储服务器中需要安装支持用户态化方法的专有硬件,成本较高。
鉴于此,本申请实施例提供一种数据传输方法,在该方法中,该服务器通过多核处理器运行包括第一应用程序在内的至少一个应用程序,在需要向该第一应用程序传输数据时,首先获取该第一应用程序对应的待存储数据,生成M个拷贝请求,每一个拷贝请求用于请求将该待存储数据中的一部分数据拷贝到该第一应用程序对应的接收缓冲区,然后,将该M个拷贝请求提交给N个守护线程进行处理,该N个守护线程中的每一个守护线程与该多核处理器中的一个处理器绑定,以使每个守护线程根据接收到的拷贝请求将该待存储数据中的一部分数据写入该接收缓冲区,M、N为大于1的正整数。
在上述技术方案中,首先为该服务器的多核处理器中的每一个处理建立守护线程,然后,在需要将待存储的数据拷贝到应用程序的接收缓冲区时,可以生成若干个拷贝请求,将每个拷贝请求分配到多个处理器对应的多个守护线程进行拷贝,从而可以利用该多个处理器一起执行该拷贝过程,可以提高数据的传输速度,提升存储局域网络的存储性能,以适应高速以太网场景。
进一步,由于该方法不需要增加专用的芯片或者专用的硬件,因此,该方法的成本较低。
下面结合附图介绍本申请实施例提供的技术方案。
请参考图4,为本申请实施例提供的数据传输方法的流程图。在下面的介绍中,以该方法应用在如图1所示的IP SAN存储系统中为例,也就是说,该方法由如图1所示的IPSAN存储系统的客户端、存储服务器以及存储设备执行。需要说明的是,存储服务器中的内核,应用程序等各个模块的程序代码存储在存储服务器的存储器中,存储服务器的多个处理器核心中任意一个处理器核心通过运行该存储器中对应的程序代码实现各个模块的功能。
S401、客户端发送用于对第一应用程序的数据进行存储的IP报文,存储服务器的通信接口接收该IP报文。
在本申请实施例中,存储服务器通过多核处理器运行至少一个应用程序,该第一应用程序可以为该至少一个应用程序中的任意一个应用程序,在下文中,以该第一应用程序为iperf应用程序或者用于提供HTTP服务或者FTP服务的应用程序为例进行说明,在这种类型的应用程序中,没有明确的I/O交互的概念,从而用于缓存数据的区域统称为接收缓冲区。
客户端首先生成将待存储数据写入IP SAN存储系统的与第一应用程序对应的存储空间的SCSI指令,然后在SCSI指令和该待存储数据之前加上iSCSI报文头、TCP报文头以及IP报文头,得到如图5所示的IP报文,通过该IP SAN存储系统的IP网络发送给存储服务器,存储服务器的通信接口,例如网卡,接收该IP报文。需要说明的是,在TCP报文头中,包括客户端的IP地址,源端口号,存储服务器的IP地址以及目的端口号,在客户端和存储服务器中,通过端口号来标识不同的应用程序,也就是说,每个应用程序与一个端口号对应,源端口号可以指示该IP报文是由客户端的哪个应用程序发送的待存储数据,目的端口号可以指示该IP报文是发送给存储服务器中的哪一个应用程序的,在本申请实施例中,该目的端口号即为第一应用程序对应的端口号。当然,该IP报文还可以包括其他内容,在此不作限制。
S402、存储服务器的通信接口将该IP报文提交给存储服务器的内核进行处理,存储服务器的内核获取该IP报文。
在本申请实施例中,存储服务器的通信接口将该IP报文提交给存储服务网的内核可以包括但不限于如下两种方式:
第一种提交方式:存储服务器的通信接口在接收到客户端发送的IP报文后,解IP协议,去掉该IP报文头,然后通过驱动环形缓冲区将处理后的报文存储到存储服务器的至少一个SKB中,产生一个中断信号,服务器的内核在检测该中断信号后,则对该处理后的报文进行处理。
第二种提交方式:存储服务的通信接口可以先对该IP报文进行解IP协议的处理,将处理后的报文存储到内存中,然后也可以通过中断信号来指示内核对该处理后的报文进行处理,内核在检测该中断信号后,则从内存中获取该处理后的报文。
当然,存储服务器的通信接口也可以采用其他方式将该IP报文提交给内核,在此不作限制。在图4所示的流程图中,以通信接口通过驱动环形缓冲区将该IP报文提交给内核进行处理为例。
需要说明的是,本申请实施例中的内核应该理解为,该存储服务器中的多核处理器,该多核处理器中的一个处理器核心执行内核对应的程序代码来实现内核的功能,作为一种示例,该存储服务器的多核处理器可以为四核处理器,该四个处理器核心可以轮询执行该内核对应的程序代码,或者,该内核对应的程序代码可以由该四个处理器核心中的一个处理器核心来执行,当该处理器核心的负载较大时才切换至其他处理器核心进行处理,在本申请实施例中,不对多核处理器中的多个处理器核心执行内核对应的程序代码的方式进行限制。
S403、内核获取与该第一应用程序对应的待存储数据。
在本申请实施例中,根据存储服务器的通信接口将该IP报文提交给存储服务网的内核的方式不同,内核获取该待存储数据的方式也不一样,下面分别针对S42中的两种提交方式进行说明。
针对第一种提交方式的第一种获取方式:
内核首先将SKB中的处理后的报文进行解封装,解析TCP协议,确定该TCP报文头中的四元组,该四元组为源地址(客户端的IP地址)、源端口号(客户端中的第一应用程序的端口号)、目的地址(存储服务器的IP地址)以及目的端口号(存储服务器中该第一应用程序的端口号),然后根据该四元组中的目的端口号将该多个SKB中的处理后的报文,映射到该存储服务器的TCP接收队列的相应位置中,例如,将四元组中的内容均相同的多个SKB中的处理后的报文存储到TCP接收队列中的一个连续的位置中,等待处理。需要说明的是,该TCP接收队列中可能包括有多个不同应用程序的报文,因此,当将SKB中的处理后的报文映射到TCP接收队列时,可以根据与每个SKB处理后的报文四元组对多个不同应用程序的报文进行排列,例如,将同一个应用程序对应的多个报文映射到TCP接收队列中的一个连续的位置中,当内核处理到与该报文时,对该报文进行协议解析,解析iSCSI协议,得到SCSI指令及待存储数据,从而得到源端口号为客户端中第一应用程序的端口号以及目的端口号存储服务器中第一应用程序的端口号的报文对应的K个数据页面,K为正整数,该K个数据页面中包括的数据,即为由客户端的发送给该第一应用程序的待存储数据。
需要说明的是,由于TCP接收队列中存储有多个SKB中的报文,而内核在对TCP接收队列中的报文进行处理时,每一次可能只能处理其中的一部分SKB中的报文,例如,每一次只能处理5个SKB中的报文,每处理一次则得到一个数据页面,从而当处理该多个SKB中报文时,则可能得到多个数据页面。一个数据页面中包括待存储数据的部分数据。
针对第二种提交方式的第二种获取方式:
内核首先对内存中处理后的报文进行解析,解析TCP协议,然后根据该TCP报文头中的目的端口号确定该处理后的报文为与第一应用程序对应的报文,然后,继续对与第一应用程序对应的报文进行解析,解析iSCSI协议,得到SCSI指令及待存储数据,该待存储数据即为与该第一应用程序对应的待存储数据。
S404、存储服务器的内核向第一应用程序发送第三指示信息,该第一应用程序接收第三该指示信息。
在本申请实施例中,该第三指示信息用于通知该第一应用程序,内核获取了该第一应用程序的待存储数据,在此不对该第三指示信息的具体形式进行限制。存储服务器的内核向第一应用程序发送第三指示信息,可以理解为,运行存储服务器的内核对应的程序代码的处理器核心,向运行第一应用程序对应的程序代码的处理器核心发送该第三指示信息,在下文中,对于相似的内容也可以作相同的理解。
S405、该第一应用程序向存储服务器的内核发送反馈信息,存储服务器的内核接收该反馈信息。
在本申请实施例中,该反馈信息中携带第一应用程序的接收缓冲区所在的位置信息,该反馈信息可以是第一应用程序调用socket接口的信息,第一应用程序通过调用该socket接口应答存储服务器的内核,该反馈信息也可以是其他信息,在下文中,以该反馈信息为第一应用程序调用socket接口的信息为例。
S406、存储服务器的内核生成M个拷贝请求。
在本申请实施例中,每一个拷贝请求用于请求将第一应用程序对应的待存储数据中的一部分数据拷贝到该第一应用程序对应的接收缓冲区,M为大于1的整数。
在本申请实施例中,内核生成M个拷贝请求可以包括但不限于如下几种方式。
第一种生成方式:
存储服务器的内核通过第一应用程序调用该socket接口的信息确定该第一应用程序的接收缓冲区所在的位置后,首先将与该第一应用程序对应的接收缓冲区分为M份,得到M个接收子缓冲区,然后,根据与该第一应用程序对应的待存储数据,以及该M个接收子缓冲区,生成该M个拷贝请求。
作为一种示例,应用程序的接收缓冲区以多个单位缓冲区进行表示,单位缓冲区的大小可以为Linux操作系统的页面大小,例如,可以为4千字节(kilobyte,kB),假设存储服务器的内核确定第一应用程序的接收缓冲区所在的位置为缓冲区1~缓冲区10,则存储服务器可以以每个单位缓冲区为划分单位,将该第一应用程序的接收缓冲区划分为10个接收子缓冲区,第一个接收子缓冲区为缓冲区1,第二接收子缓冲区为缓冲区2,以此类推,在此不一一列举。然后,存储服务器的内核将与第一应用程序对应的待存储数据以单位缓冲区的大小为划分单位,将与第一应用程序对应的待存储数据进行分割,每一份分割后的待存储数据对应一个接收子缓冲区,进而生成10个对应的拷贝请求。
当然,若与第一应用程序对应的待存储数据较大,例如大于40kB,则存储服务器的内核可以在第一应用程序将接收缓冲区中的数据存储在存储设备中与第一应用程序对应的存储空间后,再次采用与上述过程相同的处理方式,对与第一应用程序对应的待存储数据进行处理,在此不再赘述。
第二种生成方式:
存储服务器的内核通过第一应用程序调用该socket接口的信息确定该第一应用程序的接收缓冲区所在的位置后,首先确定与第一应用程序对应的待存储数据的大小是否大于预设阈值,该预设阈值可以是Linux操作系统的页面大小的倍数,例如,该阈值可以为8kB。在存储服务器的内核确定与第一应用程序对应的待存储数据的大小大于该预设阈值时,则将与该第一应用程序对应的接收缓冲区分为M份,得到M个接收子缓冲区,然后,根据与该第一应用程序对应的待存储数据,以及该M个接收子缓冲区,生成该M个拷贝请求。
第二种生成方式与第一种生成方式的区别在于,存储服务器只有在确定与第一应用程序对应的待存储数据较大时,才生成M个拷贝请求,而对于与第一应用程序对应的待存储数据较小时,则可以采用现有技术中的方法进行拷贝,这样,可以根据实际情况灵活调整内核将待存储数据拷贝到应用程序的接收缓冲区的方式,增加存储服务器的灵活性。
第三种生成方式:
若存储服务器的内核是通过TCP接收队列获取与该第一应用程序对应的待存储数据,则存储服务器的内核可以直接对该TCP接收队列进行操作,也就是说,存储服务器的内核通过第一应用程序调用该socket接口的信息确定该第一应用程序的接收缓冲区所在的位置,并将该第一应用程序的接收缓冲区分为M个接收子缓冲区(该过程与前述第一种生成方式或第二种生成方式中的相应内容相同)后,从该TCP接收队列中获取与该待存储数据对应的K个数据页面,建立该K个数据页面与该M个接收子缓冲区的映射关系,然后,基于该映射关系,生成M个拷贝请求,每个拷贝请求与一个目标接收子缓冲区对应,并用于请求将与该目标接收子缓冲区映射的至少一个数据页面中包括的待存储数据拷贝到该目标接收子缓冲区。
作为一种示例,存储服务器的内核可以将多个数据页面中的待存储数据映射到一个接收子缓冲区中,或者也可以将一个数据页面中的待存储数据映射到多个接收子缓冲区中,例如,将一个数据页面中的第一部分数据映射到一个接收子缓冲区,将该数据页面中的第二部分数据映射到另一个接收子缓冲区中,该每个映射关系即为一个拷贝请求。
S407、存储服务器的内核为多核处理器的每个处理器核心生成一个守护线程。
守护线程(Daemon)是一种特殊线程,用于周期性地执行某种任务或等待处理某些发生的事件,在本申请实施例中,将守护线程设置为在接收到拷贝请求时执行该拷贝请求。存储服务器的内核可以通过调用setDaemon()函数,为每个处理器核心生成与该处理器核心对应的守护线程,每一个守护线程与一个处理器核心绑定,可以理解为,该守护线程由于该守护线程对应的处理器核心执行。该多核处理器有多少个处理器核心则生成多少个守护线程,例如,多核处理器有4个处理器核心,则生成4个守护线程,当多核处理器有N个处理器核心,则生成N个守护线程,N为大于1的正整数。在图4所示的实施例中,以生成N个守护线程为例进行说明。
需要说明的是,步骤S407可以是在存储服务器在开机后就执行的,也就是说,可以是在步骤S401之前执行,在本申请实施例中不对步骤S407的执行顺序进行限制,在图4中以在执行步骤406之后执行步骤407为例进行说明。
S408、存储服务器的内核将该M个拷贝请求提交给N个守护线程进行处理。
作为一种示例,M为N的整数倍,则存储服务器的内核可以将M/N个拷贝请求提交给N个守护线程中的一个守护线程处理,在这种情况下,每个守护线程处于的拷贝请求的数量相同。
在另一种示例中,多核处理器中的各个处理器核心的处理能力可能不相同,则存储服务器的内核可以根据每个处理器核心的处理能力为与该处理器核心绑定的守护线程分配不同数量的拷贝请求,例如,M的取值为10,则存储服务器的内核为与第一个处理器核心绑定的守护线程分配10个拷贝请求中的3个拷贝请求,为与第二个处理器核心绑定的守护线程分配10个拷贝请求中的4个拷贝请求,为与第三个处理器核心绑定的守护线程分配10个拷贝请求中的2个拷贝请求,为与第四个处理器核心绑定的守护线程分配10个拷贝请求中的1个拷贝请求。
S409、每个守护线程执行分配的拷贝请求将待存储数据中的一部分数据写入与该拷贝请求对应的接收缓冲区。
每个守护线程执行分配的拷贝请求将待存储数据中的一部分数据写入与该拷贝请求对应的接收缓冲区,可以理解的为,与每个守护线程绑定的处理器核心根据该守护线程分配的拷贝请求将待存储数据中的一部分数据写入与该拷贝请求对应的接收缓冲区。
作为一种示例,与第一个处理器核心绑定的守护线程分配3个拷贝请求,其中第一个拷贝请求用于将数据页面1中的数据拷贝到缓冲区1,第二个拷贝请求用于将数据页面2中的数据拷贝到缓冲区2,第三个拷贝请求用于将数据页面3中的数据拷贝到缓冲区3,则第一处理器核心则依次执行该3个拷贝请求,3个数据页面中的数据分别拷贝到3个缓冲区中。针对其他的处理器核心也是同样的处理过程,在此不再赘述。
请参考图6,为步骤S408~步骤S409的一种示例。在图6中,存储服务器的内核根据每一个数据页面生成一个拷贝请求,例如,与数据页面1对应的拷贝请求为将数据页面1中的数据拷贝到第一个接收子缓冲区(例如缓冲区1),与数据页面2对应的拷贝请求为将数据页面2中的数据拷贝到第二个接收子缓冲区(例如缓冲区2),然后将与每个数据页面对应的拷贝请求提交给其中一个守护线程进行处理,例如,将与数据页面1对应的拷贝请求提交该守护线程1进行处理,将与数据页面2对应的拷贝请求提交该守护线程2进行处理,以此类推,然后通过与每个守护线程对应的处理器核心,将该拷贝请求的数据拷贝到对应的接收子缓冲区中,从而完成该拷贝过程。
S410、该N个守护线程中的一个守护线程向存储服务器的内核发送第一指示信息,存储服务器的内核接收该第一指示信息。
在本申请实施例中,该第一指示信息用于指示该N个守护线程已经完成该M个拷贝请求。
作为一种示例,每个处理器核心完成与该处理器核心绑定的守护线程中分配的至少一个拷贝请求后,则可以生成用于指示处理完成的信息,例如,可以产生一个软件位图标记,该软件位图标记可以置为0或者1,当置为1时,表示该守护线程执行完成其分配的拷贝请求,这样,当最后一个完成拷贝请求的处理器核心在完成与其对应的至少一个拷贝请求后,该处理器核心可以根据检测到的其他处理器核心的软件位图标记的取值,确定其他的守护线程已经完成了拷贝请求,从而通过与该处理器核心绑定的守护线程,向存储服务器的内核发送第一指示信息,例如,该第一指示信息可以为一个中断信号,存储服务器的内核接收该第一指示信息后,则确定已经将与第一应用程序对应的待存储数据拷贝到该应用程序的接收缓冲区中。在图4中,以守护线程1向存储服务器的内核发送该第一指示信息为例。
S411、存储服务器的内核向第一应用程序发送第二指示信息,第一应用程序接收该第二指示信息。
当存储服务器的内核确定已经将与第一应用程序对应的待存储数据拷贝到该应用程序的接收缓冲区后,则向该第一应用程序发送该第二指示信息,该第二指示信息用于指示该第一应用程序将该第一应用程序对应的缓冲区中缓存的待存储数据写入存储设备中与该第一应用程序对应的存储空间中,该第二指示信息可以为一个唤醒信息,也可以是其他形式的信息,在此不作限制。
S412、第一应用程序将待存储数据存储到存储设备中与第一应用程序对应的存储空间中。
作为一种示例,第一应用程序将待存储数据存储到与第一应用程序对应的存储空间可以包括但不限于如下两种方式。
第一种方式,第一应用程序从接收缓冲区中获取该待存储数据后,可以将该待存储的数据复制多份,例如,复制为5份,然后将复制后的数据存储在存储设备中与该第一应用程序对应的存储空间,例如,存储设备中的磁盘1~磁盘5用于存储与该第一应用程序对应的数据,则第一应用程序可以将复制的5份数据分别存储在磁盘1~磁盘5中。这样,当某一个磁盘发生故障导致存储的数据丢失,该数据可以从其他磁盘中获取。
第二种方式,第一应用程序从接收缓冲区中获取该待存储数据后,可以将该待存储数据分割成多份,然后对分割后的每一份数据进行编码,从而得到多份数据分片,并根据该多份数据分片生成校验部分,然后将多份数据分片和校验部分存储到存储设备中与该第一应用程序对应的存储空间中,例如,存储设备中的磁盘1~磁盘5用于存储与该第一应用程序对应的数据,第一应用程序将待存储数据分为3个数据分片,并根据该3个数据分片得到2个校验部分,则第一应用程序可以将该3个数据分片和2个校验部分分别存储在磁盘1~磁盘5,这样,当某一个磁盘发生故障导致存储的数据丢失,第一应用程序可以根据其他磁盘上存储的数据分片和校验部分,重构出该待存储数据。
步骤S412为可选步骤,即不是必须要执行的,在图4中以虚线进行表示。
在上述技术方案中,首先为该服务器的多核处理器中的每一个处理建立守护线程,然后,在需要将待存储的数据拷贝到应用程序的接收缓冲区时,可以生成若干个拷贝请求,将每个拷贝请求分配到多个处理器核心对应的多个守护线程进行拷贝,从而可以利用该多个处理器一起执行该拷贝过程,可以提高数据的传输速度,提升存储局域网络的存储性能,以适应高速以太网场景。
在图4所示的实施例中,以第一应用程序为iperf应用程序或者用于提供HTTP服务或者FTP服务的应用程序为例进行了说明,在实际应用中,第一应用程序还可以是基于I/O操作进行交互的应用程序,针对这种类型的应用程序来说,用于存放待存储数据的缓冲区称为I/O缓冲区,下面,针对这种类型的应用程序的数据传输过程进行说明。
请参考图7,为本申请实施例提供的数据传输方法的流程图。在下面的介绍中,以该方法应用在如图1所示的IP SAN存储系统中为例,也就是说,该方法由如图1所示的IPSAN存储系统的客户端、存储服务器以及存储设备执行。
S701、客户端发送用于对第一应用程序的数据进行存储的IP报文,存储服务器的通信接口接收该IP报文。
S702、存储服务器的通信接口将该IP报文提交给存储服务器的内核进行处理,存储服务器的内核获取该IP报文。
S703、内核获取与该第一应用程序对应的待存储数据。
S704、存储服务器的内核向第一应用程序发送第三指示信息,该第一应用程序接收第三该指示信息。
步骤S701~步骤S704与步骤S401~步骤S404相似,在此不再赘述。
S705、该第一应用程序向存储服务器的内核发送反馈信息,存储服务器的内核接收该反馈信息。
在本申请实施例中,该反馈信息中携带第一应用程序的I/O缓冲区所在的位置信息,该反馈信息可以是第一应用程序调用socket接口的信息,第一应用程序通过调用该socket接口应答存储服务器的内核,该反馈信息也可以是其他信息,在下文中,以该反馈信息为第一应用程序调用socket接口的信息为例。
S706、存储服务器的内核生成M个拷贝请求。
在本申请实施例中,每一个拷贝请求用于请求将第一应用程序对应的待存储数据中的一部分数据拷贝到该第一应用程序对应的I/O缓冲区,M为大于1的整数。
在本申请实施例中,存储服务网的内核可以采用与步骤S406中相似的方式,将该第一应用程序对应的I/O缓冲区分割为多个I/O子缓冲区,从而生成该M个拷贝请求,在此不再赘述。
S707、存储服务器的内核为多核处理器的每个处理器核心生成一个守护线程。
S708、存储服务器的内核将该M个拷贝请求提交给N个守护线程进行处理。
S709、与每个守护线程绑定的处理器核心根据该守护线程分配的拷贝请求将待存储数据中的一部分数据写入与该拷贝请求对应的I/O缓冲区。
请参考图8,为步骤S708~步骤S709的一种示例。在图8中,存储服务器的内核根据每一个数据页面生成一个拷贝请求,例如,与数据页面1对应的拷贝请求为将数据页面1中的数据拷贝到第一个I/O子缓冲区,与数据页面2对应的拷贝请求为将数据页面2中的数据拷贝到第二个I/O子缓冲区,然后将与每个数据页面对应的拷贝请求提交给其中一个守护线程进行处理,例如,将与数据页面1对应的拷贝请求提交该守护线程1进行处理,将与数据页面2对应的拷贝请求提交该守护线程2进行处理,以此类推,然后通过与每个守护线程对应的处理器核心,将该拷贝请求的数据拷贝到对应的I/O子缓冲区中,从而完成该拷贝过程。
S710、该N个守护线程中的一个守护线程向存储服务器的内核发送第一指示信息,存储服务器的内核接收该第一指示信息。
S711、存储服务器的内核向第一应用程序发送第二指示信息,第一应用程序接收该第二指示信息。
S712、第一应用程序将待存储数据存储到存储设备中与第一应用程序对应的存储空间中。
步骤S707~步骤S712与步骤S407~步骤S412相似,在此不再赘述。
在上述技术方案中,基于I/O操作进行交互的应用程序,在需要将待存储的数据拷贝到应用程序的I/O缓冲区时,可以将I/O缓冲区和待存储的数据进行分割,从而根据分割后的I/O缓冲区和待存储的数据,对应生成若干个拷贝请求,每个拷贝请求用于将分割的一部分待存储数据拷贝到一个分割后的I/O缓冲区中,并将每个拷贝请求分配到多个处理器核心对应的多个守护线程进行拷贝,从而可以利用该多个处理器一起执行该拷贝过程,可以提高数据的传输速度,提升存储局域网络的存储性能,以适应高速以太网场景。
上述本申请提供的实施例中,分别从客户端、存储服务器以及存储设备之间交互的角度对本申请实施例提供的方法进行了介绍。为了实现上述本申请实施例提供的方法中的各功能,存储服务器可以包括硬件结构和/或软件模块,以硬件结构、软件模块、或硬件结构加软件模块的形式来实现上述各功能。上述各功能中的某个功能以硬件结构、软件模块、还是硬件结构加软件模块的方式来执行,取决于技术方案的特定应用和设计约束条件。
图9示出了一种数据传输装置900的结构示意图。其中,数据传输装置900可以应用于存储系统,或者是存储系统中的装置,能够实现本申请实施例提供的方法中存储系统的功能;数据传输装置900也可以是能够支持存储系统实现本申请实施例提供的方法中存储系统的功能的装置。数据传输装置900可以是硬件结构、软件模块、或硬件结构加软件模块。数据传输装置900可以由芯片系统实现。本申请实施例中,芯片系统可以由芯片构成,也可以包含芯片和其他分立器件。
数据传输装置900可以包括通信模块901和处理模块902。
通信模块901可以用于执行图4所示的实施例中的步骤S401、步骤S402、步骤S404、步骤S405、步骤S407~步骤S408、步骤S410以及步骤S411,和/或用于执行图7所示的实施例中的步骤S701、步骤S702、步骤S704、步骤S705、步骤S707~步骤S708、步骤S710以及步骤S711,和/或用于支持本文所描述的技术的其它过程。通信模块901用于数据传输装置900和其它模块进行通信,其可以是电路、器件、接口、总线、软件模块、收发器或者其它任意可以实现通信的装置。
处理模块902可以用于执行图4所示的实施例中的步骤S403以及步骤S406,和/或用于执行图7所示的实施例中的步骤S703以及步骤S706,和/或用于支持本文所描述的技术的其它过程。
其中,上述方法实施例涉及的各步骤的所有相关内容均可以援引到对应功能模块的功能描述,在此不再赘述。
本申请实施例中对模块的划分是示意性的,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,另外,在本申请各个实施例中的各功能模块可以集成在一个处理器中,也可以是单独物理存在,也可以两个或两个以上模块集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。
如图10所示为本申请实施例提供的数据传输装置1000,其中,数据传输装置1000可以是图2~图6所示的实施例中的存储服务器,或者是存储服务器的装置,能够实现本申请图2~图6所示的实施例中的存储服务器的功能;数据传输装置1000也可以是能够支持存储服务器实现本申请图4或图7所示的实施例提供的方法中存储服务器的功能的装置。其中,数据传输装置1000可以为芯片系统。本申请实施例中,芯片系统可以由芯片构成,也可以包含芯片和其他分立器件。
数据传输装置1000包括至少一个处理器1020,用于实现或用于支持数据传输装置1000实现本申请图4或图7所示的实施例中的存储服务器的内核的功能。示例性地,处理器1020可以生成M个拷贝请求,具体参见方法示例中的详细描述,此处不做赘述。
数据传输装置1000还可以包括至少一个存储器1030,用于存储程序指令和/或数据。存储器1030和处理器1020耦合。本申请实施例中的耦合是装置、单元或模块之间的间接耦合或通信连接,可以是电性,机械或其它的形式,用于装置、单元或模块之间的信息交互。处理器1020可能和存储器1030协同操作。处理器1020可能执行存储器1030中存储的程序指令。所述至少一个存储器中的至少一个可以包括于处理器中。当处理器1020执行存储器1030中的程序指令时,可以实现图4或图7所示的方法。
数据传输装置1000还可以包括通信接口1010,用于通过传输介质和其它设备进行通信,从而用于数据传输装置1000和其它设备进行通信。示例性地,该其它设备可以是服务器。处理器1020可以利用通信接口1010收发数据。
本申请实施例中不限定上述通信接口1010、处理器1020以及存储器1030之间的具体连接介质。本申请实施例在图10中以存储器1030、处理器1020以及通信接口1010之间通过总线1040连接,总线在图10中以粗线表示,其它部件之间的连接方式,仅是进行示意性说明,并不引以为限。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图10中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。
在本申请实施例中,处理器1020可以是通用处理器、数字信号处理器、专用集成电路、现场可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件,可以实现或者执行本申请实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者任何常规的处理器等。结合本申请实施例所公开的方法的步骤可以直接体现为硬件处理器执行完成,或者用处理器中的硬件及软件模块组合执行完成。该处理器1020为多核处理器。
在本申请实施例中,存储器1030可以是非易失性存储器,比如硬盘(hard diskdrive,HDD)或固态硬盘(solid-state drive,SSD)等,还可以是易失性存储器(volatilememory),例如随机存取存储器(random-access memory,RAM)。存储器是能够用于携带或存储具有指令或数据结构形式的期望的程序代码并能够由计算机存取的任何其他介质,但不限于此。本申请实施例中的存储器还可以是电路或者其它任意能够实现存储功能的装置,用于存储程序指令和/或数据。
本申请实施例中还提供一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行图4或图7所示的实施例中存储服务器执行的方法。
本申请实施例中还提供一种计算机程序产品,包括指令,当其在计算机上运行时,使得计算机执行图4或图7所示的实施例中存储服务器执行的方法。
本申请实施例提供了一种芯片系统,该芯片系统包括处理器,还可以包括存储器,用于实现前述方法中存储服务器的功能。该芯片系统可以由芯片构成,也可以包含芯片和其他分立器件。
本申请实施例提供的方法中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、网络设备、用户设备或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,简称DSL)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机可以存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,数字视频光盘(digital video disc,简称DVD))、或者半导体介质(例如,SSD)等。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。