一种数据读取方法、RAID控制器及存储设备与流程

文档序号:12824283阅读:201来源:国知局
一种数据读取方法、RAID控制器及存储设备与流程

本发明涉及存储领域,具体涉及一种数据读取方法、raid控制器及存储设备。



背景技术:

随着固态硬盘(solidstatedrives,ssd)技术的飞速发展,ssd的存储容量越来越大且读写速度越来越快,应用范围越来越广泛。但是ssd在随着颗粒的擦写次数的增加,尤其是闪存芯片nandflash在快达到其磨损值的上限的时候,少量的输入输出(inputoutput,io)要经过多次读重试或是采用ssd内的其它处理措施才能读出正确的数据,此时读io的时延会比正常的读io大很多,此外随着颗粒擦写次数的增加,ssd整体的性能会逐步地变差,此外,由于ssd的单盘的4kb随机读的速率很高。

磁盘阵列(redundantarraysofinexpensivedisks,raid)磁盘阵列是由至少两个磁盘组合成一个具有大容量的磁盘组,利用多个硬盘提供的数据读写加成效果提升整个硬盘系统效能,所述磁盘阵列中的磁盘可以是机械硬盘,也可以是ssd。

不论是ssd组成的raid还是机械硬盘组成的raid,都会存在慢io的情况,该慢io是针对读io来说的,即若针对io请求设定一个返回的时延阈值,超过该时延阈值才返回的io视为慢io,以现有机械硬盘组成的raid为例,解决慢io的方式为在磁盘系统中对于非慢io采用正常读取的方式,对于慢io则是采用降级读的方式,即若为磁盘阵列,在一些磁盘阵列的模式中,对于同一数据会在磁盘阵列中的两个磁盘上同时存储,降级读则是不在慢io指示的磁盘中读取慢io所请求的数据,而是从另外一个存储有与慢io指示的磁盘同样数据的磁盘上读取慢io所请求的数据。现有技术的磁盘阵列系统中仅设置一个时阈延值,并且这个时延阈值一旦确定,在整个运行过程中会一直保持不变。

然而,现有这种在运行过程中时延值一直保持不变的方式,并不会考虑 其他影响因素,在读写io的比例和io的大小分布的变化导致的io的时延分布的变化,这种变化通常导致io的时延值变化较大,因此,不论是机械硬盘构成的磁盘阵列还是ssd构成的磁盘阵列,固定的延时阈值并不能很好的对超时io进行限制达到降低整体读io时延的水平;此外,对于ssd构成的磁盘阵列来说,由于时延值是固定的,在时延值固定的情况下,对一个慢io来说,慢io完成的时延值并不一定慢于该慢io降级读完成的时延值,因此通过降级读慢io减少系统的平均时延的效果并不总是存在;此外,ssd的4kb随机读的速率很高,而io请求一般也都是kb级别的大小,因此,在ssd构成的磁盘阵列中,部分io的降级读并不会对该磁盘阵列中的其他ssd的性能造成明显的影响,因此,固定延时阈值的方式并不能很好的适用在由ssd组成的磁盘阵列中。



技术实现要素:

本发明实施例提供了一种数据读取方法、raid控制器及存储设备,能够有效减小系统平均时延,提升采用本发明实施例的raid的服务质量(quanlityofservice,qos),将ssd的raid性能最大限度的利用,从而提高raid的io性能

有鉴于此,本发明实施例第一方面提供一种数据读取方法,可包括:

预先根据读io请求的大小预先设置至少两个区间,这些区间构成区间集合,并且区间集合中的每个区间均对应设置目标时延阈值;该目标时延阈值并非不变的,而是每隔预设的第一周期按照预设的阈值调整策略调整每个区间对应的目标时延阈值;在一个第一周期内,针对主机在这个周期内下发的读io请求,按照该读io请求的大小确定其对应的区间,并监测所有读io请求的返回时的时延值;当确定读io请求的时延值超出该读io请求所属区间对应的目标时延阈值时,对超出该目标时延阈值的读io请求进行降级读操作。

可以看出,由于在主机一次下发的多个读io请求中,大小近似的读io请求具有近似的时延值,因此通过设置不同的区间对应不同的大小的读io请求,每一区间的读io请求可采用相同的目标时延阈值作为界定是否采用降级 读操作的标准;此外,又由于主机每一次下发读io请求都不相同,例如,相邻两次下发的读io请求即便大小近似,其时延值也不一定近似,导致用于前一次主机下发的读io请求的目标时延阈值在后一次中并能不能很好的对需要降级读的读io请求进行区分,因此本发明实施例中采用每隔预设的第一周期便按照预设的阈值调整策略对目标时延值进行调整,以满足下一第一周期对目标时延值的需求,从而能够使得目标时延阈值能够动态的调整以配合读io请求,进而达到更加合理的界定需要降级读的读io请求,最终提高磁盘阵列的性能。

在一些实施例中,调整目标时延阈值的方式是先对每个区间设置至少两个时延阈值,每一第一周期的目标时延阈值则通过预设的阈值调整策略从至少两个时延阈值中选取。

在一些实施例中,调整目标时延阈值的方式是先对每个区间设置仅一个时延阈值,每一第一周期的目标时延阈值是通过阈值调整策略更新该时延阈值得到的,在整个运行过程中,每个区间对应的时延阈值仅有一个。

其中,上述两种方式均能够实现目标时延阈值的调整,使得每一第一周期的目标时延阈值均为适合该第一周期的目标时延阈值。

在一些实施例中,若采用每个区间设置至少两个时延阈值时,具体阈值调整策略可以是,首先计算当前第一周期内的主机下发的读io请求的时延值的时延平均值,该时延平均值能反应该第一周期内的读io请求的分部情况,该时延平均值是当前第一周期内的主机下发的所有区间的读io请求计算平均值获得,之后,根据该时延平均值为区间集合的每个区间从其对应的至少两个时延阈值中选取目标时延阈值。

在一些实施例中,具体的阈值调整策略是按照两个相邻第一周期的时延平均值的比较结果决定下一第一周期的目标时延阈值;举例来说,每个区间的至少两个时延阈值是按照从小到大排列的,如某一区间的时延阈值t1至时延阈值tm为从小到大排列,m为大于1的整数,即分为1到m共m个级别,此时,区间集合中的其余区间均也包括m个级别的时延阈值,每次进行目标时延阈值调整时,是针对区间集合内的所有区间进行的统一调整;如针对对应时延阈值t1至时延阈值tm的区间来说,具体的调整过程为,首先在第二周 期内的第一个第一周期将区间集合中区间的的至少两个时延阈值中的时延阈值tx确认为目标时延阈值,其中,x大于1且小于m的整数,第二周期包括至少两个第一周期;接着统计时延阈值为时延阈值tx时的第一周期内的读io请求的第一时延平均值,统计完成之后,由于是第一个第一周期,因此直接将时延阈值tx-1作为下一个第一周期的目标时延阈值,相当于把目标时延阈值调小。

在一些实施例中,在上述将时延阈值tx-1作为下一个第一周期的目标时延阈值后,统计时延阈值tx-1时的第一周期内的读io请求的第二时延平均值;接着将该第二时延平均值与第一时延平均值进行比较,若第二时延平均值不大于第一时延平均值时,将区间集合中的区间的至少两个时延阈值中的时延阈值tx-2确认为目标时延阈值。可以看出,若当前第一周期相对于上一第一周期的时延平均值变小或者相等,则表示读io请求的分部情况并未发生恶化,此时会将目标延时阈值调小,以符合当前读io请求分布情况的变化趋势。

在一些实施例中,当上述第二时延平均值大于第一时延平均值时,将区间集合中的区间的至少两个时延阈值中的时延阈值tx确认为下一第一周期的目标时延阈值。可以看出,若当前第一周期相对于上一第一周期的时延平均值变大,则表示读io请求的分部情况发生恶化,此时会将目标延时阈值调大,以符合当前读io请求分布情况的变化趋势。

在一些实施例中,在上述读io请求发生恶化后将时延阈值tx确认为下一第一周期的目标时延阈值后;首先会统计时延阈值tx的第一周期内的第三时延平均值,若该第三实验平均值大于第二时延平均值时,表示读io请求的分部情况连续两次恶化,此时,会将区间集合中的区间的时延阈值中的时延阈值tm或时延阈值tx/2-1/2确认为下一第一周期的时延阈值,其中,对x/2-1/2取整,可见,在连续两次恶化的情况下,并非将目标时延阈值调大一个级别,而是直接调到最大值,或者调整为当前级别至最大级别的中间位置,从而实现快速调整至符合当前读io请求分布情况的变化趋势。

在一些实施例中,每隔第二周期会对区间集合中所有区间的至少两个时延阈值进行更新,区间集合中的区间对应的至少两个时延阈值可按照预设的降级读的读io请求的百分比来确定,举例来说,计算当前第二周期内的每一 区间的确定为降级读的读io请求占所有读io请求的比例以及对应的目标时延阈值的平均值,根据该比例以及目标时延阈值的平均值对下一第二周期的至少两个时延阈值进行设置。

在一些实施例中,每个第二周期会统计主机下发的读io请求的io读写比例和/或io队列深度,当读io请求的io读写比例和/或io队列深度发生变化时,对区间集合中所有区间的至少两个时延阈值进行更新。由于读io请求的io读写比例和/或io队列深度发生变化时可能导致读io请求的时延值变化很大,有时可能是数量级的变化,因此需要将此条件作为区间对应的至少两个时延阈值的设置依据。

在一些实施例中,针对执行降级读的读io请求返回的数据和直接执行该读io请求返回的数据,确定两者之中先返回的数据作为该读io请求的返回时数据。

由于,直接执行该读io请求的时延值并不一定会比通过降级读该读io请求的时延值慢,因此确定两者之中先返回的数据作为该读io请求的返回时数据能够提高数据读取的效率。

本发明实施例第二方面还提供一种raid控制器,可包括:

接收模块,用于接收主机下发的读输入输出io请求;

确定模块,用于根据读io请求的大小确定读io请求所属的区间集合中的区间,区间集合包括至少两个区间,区间集合中的区间为预先根据io请求的大小划分的,区间集合中的每个区间对应目标时延阈值;

调整模块,用于每隔预设的第一周期按照预设的阈值调整策略调整区间集合中的区间的目标时延阈值;

监测模块,用于监测读io请求的返回时的时延值;

降级读模块,用于确定读io请求的时延值超出读io请求所属区间对应的目标时延阈值时,对读io请求进行降级读操作。

可以看出,本发明实施例中,采用确定模块对读io请求区间进行确定,而后会通过监测模块监测该读io请求的返回时的时延值,由于调整模块每个一个第一周期都会对区间的目标时延阈值进行调整,因此在检测模块监测到该读io请求的时延值之后,若该时延值超出该读io请求所属区间对应的目 标时延阈值时,会由降级读模块对该读io请求执行降级读操作。

在一些实施例中,区间集合中的每个区间对应至少两个时延阈值,调整模块具体用于:

每隔预设的第一周期按照预设的阈值调整策略从区间集合中的区间的至少两个时延阈值中所选择出目标时延阈值。

可以看出,此时调整模块执行的调整方式是按照预设的阈值调整策略从至少两个时延阈值选取出目标时延阈值;当然也可采用一个区间仅设置一个时延阈值,而后根据预设的阈值调整策略对该时延阈值进行更新。

在一些实施例中,调整模块具体用于:

计算当前第一周期内的主机下发的读io请求的时延值的时延平均值;

根据时延平均值从区间集合中的区间的至少两个时延阈值中调整目标时延阈值。

可以看出,具体的阈值调整策略可以是先计算当前第一周期内的读io请求的时延值的时延平均值,而后以该时延平均值为基础,从区间的至少两个时延阈值中调整目标时延阈值,由于时延平均值反应读io请求的分部情况,因此按照时延平均值进行调整能够达到符合预期变化的目的。

在一些实施例中,至少两个时延阈值包括从小到大排列中的时延阈值t1至时延阈值tm,m为大于1的整数,调整模块具体用于:

在第二周期内的第一个第一周期将区间集合中区间的至少两个时延阈值中的时延阈值tx确认为目标时延阈值,第二周期包括至少两个第一周期;

统计时延阈值为时延阈值tx时的第一周期内的读io请求的第一时延平均值,x大于1且小于m的整数;

将区间集合中的区间的至少两个时延阈值中的时延阈值tx-1确认为目标时延阈值。

可以看出,上述是针对一个区间进行的说明,在上述区间具有m个时延阈值时,区间集合内其他区间同样具有m个时延阈值,相当于区间集合内的区间的时延阈值均分为了m个级别,每次进行调整时,是对所有区间的时延阈值进行统一调整,如其中一个区间调整至m-3级别,所有区间均调整为m-3级别。

在一些实施例中,调整模块还用于:

统计时延阈值为时延阈值tx-1时的第一周期内的读io请求的第二时延平均值;

当第二时延平均值不大于第一时延平均值时,将区间集合中的区间的至少两个时延阈值中的时延阈值tx-2确认为下一第一周期的目标时延阈值。

可以看出,若当前第一周期相对于上一第一周期的时延平均值变小或者相等,则表示读io请求的分部情况并未发生恶化,此时会将目标延时阈值调小,以符合当前读io请求分布情况的变化趋势。

在一些实施例中,调整模块还用于:

当第二时延平均值大于第一时延平均值时,将区间集合中的区间的至少两个时延阈值中的时延阈值tx确认为下一第一周期的目标时延阈值。

可以看出,若当前第一周期相对于上一第一周期的时延平均值变大,则表示读io请求的分部情况发生恶化,此时会将目标延时阈值调大,以符合当前读io请求分布情况的变化趋势。

本发明实施例第三方面还提供一种raid控制器,包括raid处理器和内存,与raid处理器连接的用于连接硬盘的硬盘接口,与外部主机通信的通信接口,内存中存储有计算机执行指令,raid处理器运行内存中的计算机执行指令以执行第一方面的数据读取方法。

本发明实施例第四方面还提供一种存储设备,包括至少两块硬盘和与至少两块硬盘均通信连接的raid控制器,raid控制器运行存储于raid控制器中的计算机执行指令以执行第一方面的数据读取方法。

从以上技术方案可以看出,本发明实施例具有以下优点:本发明实施例中将读io请求按照大小分别属于不同的区间,区间为该区间内的读io请求的大小的取值范围,每一区间内的读io请求中具有大致类似的大小,而后为每个区间均设置目标时延阈值,该目标时延阈值可以按照预设的阈值调整策略进行调整,如可根据每次的统计的读io请求的时延平均值从至少两个时延阈值中选取一个作为目标时延阈值或者对目标时延阈值直接更新,而后在对一个区间内的读io请求进行判断时,通过该该区间的目标时延阈值丢该读io请求是否进行降级读进行判断,当该读io请求超出该区间的目标时延阈 值时,进行降级读操作,可以看出,目标时延阈值在运行过程中并非一直不变的,而是根据不同的读io请求分布情况选择对应的至少两个时延阈值中确定的目标时延阈值或者直接对目标时延阈值直接更新,从而能够有效减小系统平均时延,提升采用本发明实施例的raid的qos,将ssd的raid性能最大限度的利用,从而提高raid的io性能。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1a是采用磁盘阵列的存储系统的结构示意图;

图1b是现有技术的存储系统的结构示意图;

图1c是现有技术的存储系统的工作流程图;

图2是本发明实施例的数据读取方法的一个实施例图;

图3是本发明实施例的数据读取方法中确定目标时延阈值的流程图;

图4是本发明实施例的raid控制器的一个实施例图;

图5是本发明实施例的raid控制器的一个实施例图;

图6是本发明实施例的存储设备的一个实施例图。

具体实施方式

本发明实施例提供了一种数据读取方法、raid控制器及存储设备,用于通过对读io请求合理分组并动态调整时延阈值,从而有效减小系统平均时延,提升采用本发明实施例的raid的服务质量。

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

以下分别进行详细说明。

本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或模块的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或模块,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或模块。

磁盘阵列包括多种模式,如raid0,将至少两个磁盘合并成一个逻辑磁盘使用,数据读写时对各磁盘同时操作,不同磁盘写入不同数据,提高读写性能;又如raid1,若采用两块磁盘时,两块磁盘上存储的相同的数据,即便其中一个磁盘上的数据损坏,也能通过另一个磁盘进行读取,提高数据可靠性;又例如raid10,该模式相当于结合了raid0和raid1,需要至少四块磁盘,先将两块磁盘组成raid1在将多个raid1组成raid0,同时提高读写性能和数据可靠性,此外,还有一些其他的阵列方式会加入数据校验,在数据损坏时可根据校验码恢复数据。

请参阅图1a,图1a是采用磁盘阵列的存储设备的结构示意图,如图1a所示,采用这种磁盘阵列的系统一般包括主机101、raid系统102和硬盘103,该主机101可以是局域网中的客户端设备,如计算机,也可以是互联网络中的服务器,该raid系统可以是运行在主机或者存储服务器的系统内的软件模块,或者也可以是存储系统中的raid控制器,主机101与raid系统102或者之间一般采用有线方式连接,也有一部分采用无线方式连接形成远程存储的系统,这种raid系统上运行有数据系统,能够响应主机101下发的io请求,如读io请求和写io请求等,返回读io请求所请求的数据或写入写io请求中要写入的数据。

其中,该raid系统用于在软件层面实现raid冗余算法(即将多块硬盘空间拉通成统一空间使用,并且提供空间管理)和控制数据io下发盘的决策。并实现超时io的降级读,还用于提供各个raid系统的降级读功能,提 供超时io的资源释放功能,提供页面替换功能;还可用于对接收的读io请求的超时检测。该raid系统102与硬盘103之间可采用不同的接口进行连接,若为服务器硬盘时,该raid系统102与硬盘之间采用小型计算机系统接口(smallcomputersysteminterface,scsi)连接,raid系统102中设有scsi模块,将用于将读io请求中指示的信息组装成硬盘能够识别的scsi指令通过该scsi接口下发到磁盘阵列中的硬盘103;硬盘103中的底层驱动接收scsi指令,并将根据该scsi指令驱动硬盘103读取数据。

图1b是现有技术的存储系统,该存储系统中raid系统包括raid模块1021,用于接收读io请求;io超时检测模块1022用于检测读io请求是否超时;降级读模块1023,用于对超时的读io请求进行降级读操作,scsi模块1024,用于将读io请求中指示的信息组装成硬盘能够识别的scsi指令通过该scsi接口下发到磁盘阵列中的硬盘103。

该存储系统的工作流程可参见图1c,图1c是现有技术的存储系统的工作流程图,其中,主机101向raid模块1021发送读io请求,raid模块1021执行该读io请求,并由io超时检测模块1022对该读io请求是否超时进行判断,当确定该读io请求超时时,会向raid模块1021发送一个读io请求超时的信息,raid模块1021在接收到该信息后,会将该读io请求发送至降级读模块1023进行降级读处理,由降级读模块1023对该读io请求进行处理,即找到磁盘阵列102中的另外一个存储有读io请求中指示的数据的物理磁盘,并修改读io请求中指示的数据的地址在新的物理磁盘上的地址,将该修改后的读io请求发送至scsi模块1024,由该scsi模块1023将此修改后的读io请求转换成底层驱动能识别的包含该修改后的读io请求的scsi指令,并将该指令发送至对应的硬盘,根据该scsi指令驱动硬盘103读取该修改后的读io请求指示的数据,将该数据作为返回数据依次反馈给scsi模块1024、降级读模块1023和raid模块1021,最终由raid模块1021将该返回数据反馈至主机,完成一次读io请求的降级读的过程。

上述方案中,延时阈值仅有一个且在运行过程中时延值一直保持不变,并不会考虑其他影响因素,例如在读写io的比例和io的大小分布的变化导致的io的时延分布的变化,这种变化通常导致io的时延值变化较大,因此, 不论是机械硬盘构成的磁盘阵列还是ssd构成的磁盘阵列,固定的延时阈值并不能很好的对超时io进行限制达到降低整体读io时延的水平。

并且随着qos要求的增加,时延急剧上升。在ssd组成的磁盘阵列的环境中,ssd的4kb随机读的速率很高,而io请求一般也都是kb级别的大小,因此,在ssd构成的磁盘阵列中,部分io的降级读并不会对该磁盘阵列中的其他ssd的性能造成明显的影响,因此,固定延时阈值的方式并不能很好的适用在由ssd组成的磁盘阵列中,需要根据ssd的特征制定新的超时io识别处理方案以减少超时io对系统的影响。

为解决上述问题,本发明的一个实施例提供一种数据读取方法,请参阅图2,图2是本发明实施例的数据读取方法的一个实施例图,如图2所示,该数据读取方法可包括以下内容:

201、接收主机下发的读io请求。

可以理解的是,本发明实施例应用的场景为主机和磁盘之间的数据交互,当主机需要从磁盘阵列的硬盘中读取数据时,会向raid系统发送读io请求,以使得raid系统根据该读io请求,从磁盘阵列的硬盘中取出对应数据反馈给主机。

202、根据读io请求的大小确定读io请求所属的区间集合中的区间。

其中,区间集合包括至少两个区间,区间集合中的区间为预先根据io请求的大小划分的,区间集合中的每个区间对应目标时延阈值,区间的范围值对区间内读io请求的大小的取值范围。

需要说明的是,每个区间除了对应目标时延阈值之外,还可对应设置至少两个时延阈值。

可以理解的是,raid在接收到一段时间内的读io请求后,会将这段时间内的读io请求按照其大小分配至不同的区间。

举例来说,区间a对应的区间范围的区间是4kb至8kb,区间b对应的区间范围的区间是8kb至12kb,即大小在4kb至8kb之间的读io请求会被划分在区间a内,而大小为8kb至12kb之间的读io请求会被划分在区间b内,可按照此方式依次分配区间c和区间d等区间,直到覆盖到所有的读io请求。

需要说明的是,设置区间范围一般来说除了端点之外没有重复的部分, 并且为了使得区间划分上更加平均,可划分为首尾相连的连续区间,即4kb至8kb的区间、8kb至12kb的区间和12kb至16kb的区间等。当然若是一些读io请求在某一区间内几乎不分布,如没有读io请求的大小20kb至24kb的大小范围,则可不设置区间为20kb至24kb的区间范围。

203、每隔预设的第一周期按照预设的阈值调整策略调整区间集合中的区间的目标时延阈值。

其中,该目标时延阈值是动态调整的,其调整间隔为每隔第一周期调整一次,一种调整方式是采用直接更新目标时延阈值的方式,另外一种则是在区间对应预设了至少两个时延阈值时,采用预设的阈值调整策略进行选取。

可选的,至少两个时延阈值包括至少两个大小不同的时延阈值,该目标时延阈值是从每个区间对应的至少两个大小不同的时延阈值中选取的一个。

可以理解的是,至少两个时延阈值设置的目的在于对应每个区间能够细分延时级别,并按照延时级别调整不同的时延阈值,使得对读io请求的处理更加精确和高效。

举例来说,至少两个时延阈值包括三个从小到大排列的时延阈值m1、m2和m3,m1对应除最慢1%的读io请求之外的99%的读io请求的都返回时,对应该99%的读io请求的时延平均值的两倍,m2对应除最慢0.5%的读io请求之外的99.5%的读io请求的都返回时,对应该99.8%的读io请求的时延平均值的两倍,m2对应除最慢0.2%的读io请求之外的99.8%的读io请求的都返回时,对应该99.8%的读io请求的时延平均值的两倍。

此时,对应m1时,表示要解决最慢1%的读io请求的慢的问题,对应m2时,表示要解决最慢0.5%的读io请求的慢的问题,对应m3时,表示要解决最慢0.2%的读io请求的慢的问题。

作为可选的,该时延阈值为区间中预设百分比的读io请求都返回时对应的时延平均值的两倍。

可以理解的是,该预设百分比是可调的,例如,m1是99%的读io请求都返回时对应的时延平均值的两倍,m2是99.1%的读io请求都返回时对应的时延平均值的两倍,m3是99.2%的读io请求都返回时对应的时延平均值的两倍,若还有m4、m5等则可以按照延时阈值从小到大的规律进行设置, m4是99.3%的读io请求都返回时对应的时延平均值的两倍,m5是99.5%的读io请求都返回时对应的时延平均值的两倍等等。

需要说明的是,每隔第二周期还会对区间集合中的区间对应的至少两个时延阈值进行更新,该更新是将每一个区间的至少两个时延阈值均进行更新;该更新时设置时延阈值的方式包括两种,下面分别进行说明,第一种是区间集合中的区间对应的至少两个时延阈值可按照预设的降级读的读io请求的百分比来确定。

其中,第二周期为包含至少两个第一周期的周期,若第一周期称之为小周期,则第二周期对应可称之为大周期。

举例来说,计算当前第二周期内的每一区间的确定为降级读的读io请求占所有读io请求的比例以及对应的目标时延阈值的平均值,根据该比例以及目标时延阈值的平均值对下一第二周期的至少两个时延阈值进行设置,如上述按照需要解决的最慢的读io请求的百分比设置为不同的级别。

第二种方式是统计主机下发的读io请求的io读写比例和/或io队列深度;

当读io请求的io读写比例和/或io队列深度发生变化时,更新区间的目标时延阈值。

可以看出,影响目标时延阈值的因素还可以是io读写比例和/或io队列深度,当这两个值的变化幅度较大时,也可作为更新目标时延阈值的条件,例如io读写比例变大,表示读io请求的量会增多,此时可适当降低目标延时阈值的等级,又例如,当读io队列深度较深时,表示处理的读io请求量非常大,此时也应当相应降低目标时延阈值的等级。

需要说明的是,区间范围一般可设定为固定的大小,如范围是4kb、8kb等,对于读io请求来说,按照4kb的范围划分时显然每一区间内的读io请求明显要少于按照8kb的范围划分的情况,因此,相对于8kb的范围划分情况,4kb的范围划分情况下的区间可以具有的时延阈值的数量相对8kb的情况可以减少一些,因此可按照区间范围的大小为每一区间范围配置具有不同数量的时延阈值的至少两个时延阈值,即对于大区间范围的至少两个时延阈值的时延阈值的数量较多,对应小区间范围的至少两个时延阈值的时延阈值的 数量较少。

其中,时延平均值是读io请求都返回的时延值的平均值。

需要说明的是,时延平均值对应是读io请求的时延值的分布情况,具体的,该时延平均值越小表示读io请求的分布情况越好,该时延平均值越大表示读io请求的分布情况越差。由于对每个区间的至少两个时延阈值都设置了多个时延阈值,可将这些时延阈值对应到时延平均值上,根据统计获得的时延平均值即可选取对应的时延阈值,选取的原则可以是时延平均值越小则对应越小的时延阈值。

除了简单对应选取之外,对于时延阈值的设置还可采用对比机制,下面进行介绍。

作为可选的,请参阅图3,图3是本发明实施例的处理方法中确定目标时延阈值的流程图,其中,一个至少两个时延阈值包括从小到大排列中的时延阈值t1至时延阈值tm,m为大于1的整数,此时,步骤203中目标时延阈值的调整流程可包括:

301、在第二周期内的第一个第一周期将区间集合中区间的至少两个时延阈值中的时延阈值tx确认为目标时延阈值。

可以理解的是,首次指的是每一个第二周期的第一个第一周期,在此第一周期确定目标时延阈值按照的规则可以有几种,其一是先按照将最大的时延阈值tm作为目标时延阈值,然后再根据延时分布值选择对应的时延阈值,也可直接选取时延阈值t1至时延阈值tm之间某一个值tx作为目标时延阈值,当然,也可以选取最小的时延阈值t1作为目标时延阈值。

302、统计时延阈值为时延阈值tx时的第一周期内的读io请求的第一时延平均值。

其中,x大于1且小于m。

可以理解的是,每一个时延阈值对应一个第一周期,在确定出时延阈值tx后,就会对此第一周期内的读io请求都返回时的时延值进行统计,并计算出这些时延值的平均值得到第一时延平均值,该第一时延平均值是衡量是否需要变更目标时延阈值的依据,由于此第一周期是第一个第一周期,因此上一个周期的时延平均值并不存在,此时默认相对上一周期并未发生时延平均 值对应的读io请求的分布恶化的情况,此时延阈值tx作为此第一周期内读io请求是否为需要降级读的依据,即将时延阈值tx作为时延阈值并对所有时延值超过该时延阈值tx的读io请求都确定为慢io,并对这些读io请求都进行降级读操作。

303、将区间集合中的区间的至少两个时延阈值中的时延阈值tx-1确认为目标时延阈值;

可以看出,在完成时延阈值为tx时的第一时延平均值的统计后,可将时延阈值tx-1确认为目标时延阈值,该时延阈值tx-1可作为下一第一周期的目标时延阈值。

作为可选的,目标时延阈值的确定流程还可包括:

304、统计时延阈值为时延阈值tx-1时的第一周期内的读io请求的第二时延平均值;

可以理解的是,在时延阈值tx-1时,相当于经过了一个第一周期,读io请求的时延值发生了变化,此时再次统计得到第二时延平均值,该第二时延平均值是此第一周期中读io请求都返回的时延值的平均值,此时延阈值tx-1作为此第一周期内读io请求是否需要降级读的依据,即将时延阈值tx-1作为时延阈值并对所有时延值超过该时延阈值tx-1的读io请求都确定需要进行降级读,并对这些读io请求都进行降级读操作。

305、将区间集合中的区间的至少两个时延阈值中的时延阈值tx-2确认为目标时延阈值。

其中,当第二时延平均值不大于第一时延平均值时,将区间的至少两个时延阈值中的时延阈值tx-2确认为目标时延阈值。

可以理解的是,在获得第二时延平均值后,为了确认下一第一周期的时延阈值,可将该第二时延平均值与第一时延平均值进行比较,并根据比较的结果对时延阈值进行调整,比如,当第一时延平均值不大于第二时延平均值时,即相对于上一个第一周期,此第一周期中读io请求的时延值的平均值没有增加,而是保持相等或者有所减小,表示整体上来看读io请求的分布情况变好,此时可将时延阈值上调一个等级,即调整为比上一个第一周期更小的时延阈值,如将此第一周期的时延阈值tx-1调整为时延阈值tx-2,将时延阈 值tx-2作为下一个第一周期的时延阈值。

需要说明的是,当第二时延平均值大于第一时延平均值时,需要进行另外的阈值调整策略。

可选的,该方法还包括:

306、将区间集合中的区间的至少两个时延阈值中的时延阈值tx确认为目标时延阈值。

可以看出,当第二时延平均值大于第一时延平均值时,表示当前第一周期相对于上一第一周期的情况是恶化的,需要对时延阈值的等级进行下调,即调整为比上一个第一周期的更大的时延阈值。

作为可选的,目标时延阈值的确定流程还可包括:

307、统计时延阈值为时延阈值tx时的读io请求的第三时延平均值;

308、将区间集合中的区间的目标时延阈值确认为tm或tx/2-1/2。

其中,对x/2-1/2取整。当第三时延平均值大于第二时延平均值时,表示相对上一个第一周期情况出现恶化。

可以理解的是,此时连续两次出现读io请求的时延值的分布情况都是恶化时,表示恶化比较严重,此时不会直接将时延阈值仅仅下调一个等级,而是将其调整为最低等级,即至少两个时延阈值中的最大的时延阈值或者是当前时延阈值与最大的时延阈值的中间等级,以期能够更快的调整至实际的时延阈值。

需要说明的是,由于每个区间对应的至少两个时延阈值中的时延阈值的数量是相同的,即具有相同的时延阈值级别数量,在每次更新时延阈值时,调整对象是所有区间,调整的时延阈值的级别的全部按照相同的级别进行调整,举例来说,假设每个至少两个时延阈值具有五个时延阈值,一个区间调整为时延阈值第三时延阈值的级别,则其他所有区间均调整为第三时延阈值的级别。

309、当第三时延平均值不大于第二时延平均值时,将区间集合中区间的目标时延阈值确认为tx-1。

可以看出,上调目标时延阈值时,不论是连续多少次读io请求分布情况好于上一第一周期,每次调整仅上调一个级别。

204、监测读io请求的返回时的时延值。

其中,在设定好各个区间的目标时延阈值后,即可对区间集合的读io请求进行监控,该监控是以第一周期为单位或者第二周期为单位进行的。

205、读io请求进行降级读操作。

可以理解是,在确定出目标时延阈值后,即可对超出该目标时延阈值的读io请求进行判断,将读io请求的时延值超出该读io所属区间对应的目标时延阈值时,该读io请求确定为超时io请求,在确定出这些超时io请求之后,即可对这些超时io请求进行降级读操作。

作为可选的,步骤205具体可包括:

根据降级读的读io请求的指示从存储设备中的硬盘读取数据。

其中,硬盘中存储有超时io请求指示的数据,该硬盘与超时io请求中指示的raid中的硬盘不相同。

可以理解的是,对于raid0和raid10来说,raid存储方式每一数据在raid中的至少两块硬盘上存储,该硬盘可以是机械硬盘,也可以是ssd,在读io请求被确定为需要降级读时,则从存储设备中另外一个存储有该读io请求指示的数据的硬盘上读取数据,由于读取的路径发生改变,一般来说读取数据会先于正常执行读io请求,但是实际情况受限于降级读指示的硬盘的负荷,降级读也不一定先于正常读。

可以看出,本发明实施例中将读io请求按照大小分别属于不同的区间,区间为该区间内的读io请求的大小的取值范围,每一区间内的读io请求中具有大致类似的大小,而后为每个区间均设置目标时延阈值,该目标时延阈值可以按照预设的阈值调整策略进行调整,如可根据每次的统计的读io请求的时延平均值从至少两个时延阈值中选取一个作为目标时延阈值或者对目标时延阈值直接更新,而后在对一个区间内的读io请求进行判断时,通过该该区间的目标时延阈值丢该读io请求是否进行降级读进行判断,当该读io请求超出该区间的目标时延阈值时,进行降级读操作,可以看出,目标时延阈值在运行过程中并非一直不变的,而是根据不同的读io请求分布情况选择对应的至少两个时延阈值中确定的目标时延阈值或者直接对目标时延阈值直接更新,从而能够有效减小系统平均时延,提升采用本发明实施例的raid的 qos,将ssd的raid性能最大限度的利用,从而提高raid的io性能。

需要说明的是,读io请求之中的超时io请求虽然会延时一段时间返回数据,但是仍旧会通过正常读取数据,该降级读操作会通过另外一条途径读取同样的数据,对于系统来说,需要对两种途径读取的数据进行取舍。

作为可选的,方法还包括:

将执行读io请求返回的数据和通过降级读该读io请求返回的数据中先返回的数据确定为慢io的返回数据。

可以理解的是,本发明实施例采取的方式是,两者时间上先返回作为返回数据,而另外一个则采用忽略或者丢弃的方式进行处理,能够避免资源的浪费,同时提高系统响应速度。

上面对本发明实施例的数据读取方法进行了介绍,下面以一个具体的例子对数据读取方法进行介绍。

在接收到主机下发的读io请求后,按照区间范围4kb对所有的读io请求进行区间划分,例如划分为10个区间,即区间1至区间10,此时划分的区间1至区间10的区间范围依次为0kb至4kb、4kb至8kb、8kb至12kb、12kb至16kb、16kb至20kb、20kb至24kb、24kb至28kb、28kb至32kb、32kb至36kb、36kb至40kb等等。

针对区间范围4kb,可设置时延阈值数量为10个的至少两个时延阈值,按照从小到大进行排列,具体对应到t1至t10共十个级别,例如对于区间1来说,设置a1至a10共10个时延阈值,对于区间2来说,设置b1至b10共10个时延阈值,对于区间3来说,设置c1至c10共10个时延阈值,对于区间4来说,设置d1至d10共10个时延阈值,对于区间5来说,设置e1至e10共10个时延阈值,对于区间6来说,设置f1至f10共10个时延阈值,对于区间7来说,设置g1至g10共10个时延阈值,对于区间8来说,设置h1至h10共10个时延阈值,对于区间9来说,设置i1至i10共10个时延阈值,对于区间10来说,设置j1至j10共10个时延阈值,具体可参见下表1:

表1

其中,t1至t10共十个级别分别对应0.1%至1%的慢io,其中t10对应99.9%的io都返回时对应的时延平均值的2倍,t9对应99.8%的io都返回时对应的时延的2倍;t8对应99.7%的io都返回时对应的时延的2倍;t7对应99.6%的io都返回时对应的时延平均值的2倍,t6对应99.5%的io都返回时对应的时延的2倍;t5对应99.4%的io都返回时对应的时延的2倍;t4对应99.3%的io都返回时对应的时延平均值的2倍,t3对应99.2%的io都返回时对应的时延的2倍;t2对应99.1%的io都返回时对应的时延的2倍;ti对应99.0%的io都返回时对应的时延的2倍。

可以理解的是,具体时延阈值可根据实测数据,在2倍微调的基础上做微调:x+*%的io均返回对应的时延*2。注:这里x表示2倍的基础值,是一个固定值。

具体的一个区间对应具有多少个时延阈值的至少两个时延阈值可按照一个大周期进行刷新,即相当于系统中为每一种区间划分均对应设置了多个至少两个时延阈值,每一至少两个时延阈值中的时延阈值的数量可以相同或者不相同。

下面对具体的调整过程进行介绍,以单个区间的读io请求的调整为例,多个区间的调整为同时调整同一级别的时延阈值,与单个区间的调整类似,对于单个区间的io,其时延阈值先采用最大的时延阈值,比如时延阈值t10,先把大于t10这个阈值没返回的读io请求识别为慢io(t10对应0.1%的io),经过一定周期后,此处为一个第一周期,得到该周期内所有读io请 求都返回的一个延时分布情况,以及读io请求都返回的时延值的平均值,即t10的时延平均值,该t10的时延平均值能够反映t10时的延时分布情况,并将下一个第一周期的时延阈值调整为t9。在下一个第一周期,即时延阈值t9的第一周期内,重复上面的过程,并统计该周期内所有io的时延分布情况以及t9的时延平均值:如果t9的时延平均值不大于t10的时延平均值,即分布情况变好好或者没有明显的变化,可以将接下来一个第一周期的时延阈值设置为时延阈值t8,继续接下来一个第一周期的处理,重复上述处理过程,得到分布情况以及t8的时延平均值。

如果t8的时延平均值大于t9的时延平均值时,表示这个第一周期的时延分布情况明显比上一个周期恶化,则将下一个第一周期的时延阈值调整为时延阈值t9;在下一个第一周期,重复上述处理过程,得到分布情况以及第二个t9的时延平均值,并将下一个第一周期的时延阈值调整为时延阈值t8。下一个第一周期内,统计该周期内所有io的时延分布情况以及第二个t8的时延平均值。如果第二个t8的时延平均值大于第二个t9的时延平均值,表示这个第一周期的时延分布情况明显比t9周期恶化,则此时重新从t10开始慢io的识别处理或者折半处理,折半处理即如果当前的阈值是t1,则回退到t5。此时最优的时延阈值就是t9,在继续从t10到t1周期轮转过程中,如果没有找到比t9更优的阈值,就一直使用该阈值t9。如果找到更优的阈值,则更新识别慢io的基准值为该更优的阈值。若极端情况下,t8的时延分布情况一直比t9的恶化,那么将一直使用t9作为判断慢io的基准值。以此方式完成预定次数的时延阈值的变更次数值,完成一个第二周期。

上面对本发明实施例的数据读取方法进行了介绍,下面对本发明实施例的raid控制器进行介绍,请参阅图4,图4是本发明实施例的raid控制器的一个实施例图,该raid控制器4可包括:

接收模块401,用于接收主机下发的读输入输出io请求;

其中,该接收模块401可以实现图2所示实施例中步骤201。

确定模块402,用于根据读io请求的大小确定读io请求所属的区间集合中的区间,区间集合包括至少两个区间,区间集合中的区间为预先根据io请求的大小划分的,区间集合中的每个区间对应目标时延阈值;

其中,该确定模块402可以实现图2所示实施例中步骤202,具体的读io请求的区间分配与图2所示实施例中针对步骤202的说明类似,此处不再赘述。

调整模块403,用于每隔预设的第一周期按照预设的阈值调整策略调整区间集合中的区间的目标时延阈值;

其中,调整模块403可以实现图2所示实施例中步骤203,具体的目标时延阈值的调整方式与图2所示实施例中步骤203类似,此处不再赘述。

监测模块404,用于监测读io请求的返回时的时延值;

其中,该监测模块404可以实现图2所示实施例中步骤204,该监控是以第一周期为单位或者第二周期为单位进行的。

降级读模块405,用于确定读io请求的时延值超出读io请求所属区间对应的目标时延阈值时,对读io请求进行降级读操作。

其中,该监测模块405可以实现图2所示实施例中步骤205,即可对超出该目标时延阈值的读io请求进行判断,将读io请求的时延值超出该读io所属区间对应的目标时延阈值时,该读io请求确定为超时io请求,在确定出这些超时io请求之后,即可对这些超时io请求进行降级读操作。

可以看出,首先通过接收模块401接收主机下发的读io请求,而后由确定模块402确定该读io请求具体所属的区间,该区间对应有目标时延阈值,该目标时延阈值是由调整模块403按照每隔预设的第一周期根据预设的阈值调整策略进行调整得到的,而后监测模块404会对该读io请求的返回时的时延值进行监测,当该时延值超过该读io请求所属区间对应的目标时延值时,标识该由降级读模块405对该读io请求进行降级读操作,可以看出,目标时延阈值在运行过程中并非一直不变的,而是根据不同的读io请求分布情况选择对应的至少两个时延阈值中确定的目标时延阈值或者直接对目标时延阈值直接更新,从而能够有效减小系统平均时延,提升采用本发明实施例的raid的qos,将ssd的raid性能最大限度的利用,从而提高raid的io性能。

可选的,区间集合中的每个区间对应至少两个时延阈值,此时调整模块403可具体用于:

每隔预设的第一周期按照预设的阈值调整策略从区间集合中的区间的至少两个时延阈值中所选择出目标时延阈值。

其中,调整模块403的具体调整方式可以是按照预设的阈值调整策略从每个区间对应的至少两个大小不同的时延阈值中选取的一个作为目标时延阈值,具体的两种调整方式与图2所示实施例步骤203中的两种调整方式类似,此处不再赘述。

需要说明的是,除了上述预设至少两个时延阈值,并选择选取一个作为目标时延阈值之外,还可按照预设的阈值调整策略直接更新目标时延阈值,而非实现预设多个并从中选择。

可选的,调整模块403还具体用于:

计算当前第一周期内的主机下发的读io请求的时延值的时延平均值;

根据时延平均值从区间集合中的区间的至少两个时延阈值中调整目标时延阈值。

可以看出,具体的阈值调整策略可以是先计算当前第一周期内的读io请求的时延值的时延平均值,而后以该时延平均值为基础,从区间的至少两个时延阈值中调整目标时延阈值,由于时延平均值反应读io请求的分部情况,因此按照时延平均值进行调整能够达到符合预期变化的目的。具体的时延平均值的调整策略与图2所示实施例中步骤203的说明中时延平均值的调整策略类似,此处不再赘述。

可选的,至少两个时延阈值包括从小到大排列中的时延阈值t1至时延阈值tm,m为大于1的整数,调整模块403还具体用于:

在第二周期内的第一个第一周期将区间集合中区间的至少两个时延阈值中的时延阈值tx确认为目标时延阈值,第二周期包括至少两个第一周期;

统计时延阈值为时延阈值tx时的第一周期内的读io请求的第一时延平均值,x大于1且小于m的整数;

将区间集合中的区间的至少两个时延阈值中的时延阈值tx-1确认为目标时延阈值。

可以看出,上述是针对一个区间进行的说明,在上述区间具有m个时延阈值时,区间集合内其他区间同样具有m个时延阈值,相当于区间集合内的 区间的时延阈值均分为了m个级别,每次进行调整时,是对所有区间的时延阈值进行统一调整,如其中一个区间调整至m-3级别,所有区间均调整为m-3级别。具体的通过时延平均值对比的调整策略与图3所示实施例中步骤301、步骤302和步骤303的中通过时延平均值对比的调整策略类似,此处不再赘述。

可选的,调整模块403还可用于:

统计时延阈值为时延阈值tx-1时的第一周期内的读io请求的第二时延平均值;

当第二时延平均值不大于第一时延平均值时,将区间集合中的区间的至少两个时延阈值中的时延阈值tx-2确认为下一第一周期的目标时延阈值。

可以看出,若当前第一周期相对于上一第一周期的时延平均值变小或者相等,则表示读io请求的分部情况并未发生恶化,此时会将目标延时阈值调小,以符合当前读io请求分布情况的变化趋势。具体的通过时延平均值对比的调整策略与图3所示实施例中步骤304和步骤305的中通过时延平均值对比的调整策略类似,此处不再赘述。

可选的,调整模块403还可用于:

当第二时延平均值大于第一时延平均值时,将区间集合中的区间的至少两个时延阈值中的时延阈值tx确认为下一第一周期的目标时延阈值。

可以看出,若当前第一周期相对于上一第一周期的时延平均值变大,则表示读io请求的分部情况发生恶化,此时会将目标延时阈值调大,以符合当前读io请求分布情况的变化趋势。具体的通过时延平均值对比的调整策略与图3所示实施例中步骤306的中通过时延平均值对比的调整策略类似,此处不再赘述。

下面对本发明实施例中raid控制器的结构进行描述,请参阅图5,图5是本发明实施例的raid控制器的一个实施例图,其中,raid控制器5可包括均与总线相连接的至少一个raid处理器501、至少一个通信接口502和至少一个硬盘接口503,本发明实施例涉及的raid控制器5可以具有比图5所示出的更多或更少的部件,可以组合两个或更多个部件,或者可以具有不同的部件配置或设置,各个部件可以在包括一个或多个信号处理和/或专用集成 电路在内的硬件、软件或硬件和软件的组合实现。

具体的,对于图4所示的实施例来说,该raid处理器501能实现图4所示实施例中确定模块402、调整模块403、监测模块404和降级读模块405的功能,该通信接口502能实现图4所示实施例中的接收模块401的功能,该硬盘接口503能实现该raid控制器向磁盘发送降级读的指令或者读io请求的正常读取指令。其中,硬盘接口503可包括多种类型,例如scsi接口、和串行高级技术附件(serialadvancedtechnologyattachment,sata)接口等。

上面对采用本发明实施例的raid控制器进行了介绍,下面对采用本发明实施例的raid控制器的存储设备进行介绍,请参阅图6,图6是本发明实施例的存储设备的一个实施例图,该存储设备可包括至少两块硬盘602与至少两块硬盘均通信连接的raid控制器601,其中,该raid控制器601能够运行存储于该raid控制器601中的计算机执行指令以实现图2所示实施例中步骤201至步骤205。

其中,在上述存储设备6中,raid控制器601还会对硬盘602进行识别,若发现并非预设的硬盘,例如硬盘602上设置一个识别码,raid控制器601对应有识别码范围,只要发现接入的硬盘602没有这种识别码或者识别码不在raid控制器601的识别码范围内,则该硬盘602无法接入磁盘阵列中。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作 为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

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