发明内容
本发明提供基于iSCSI的命令处理方法及装置,以提高基于iSCSI的命令处理效率。
本发明的技术方案是这样实现的:
一种基于因特网小型计算机系统接口iSCSI的命令处理方法,该方法包括:
当存储系统与主机建立iSCSI会话后,存储系统接收主机发来的为本次iSCSI会话针对的各个逻辑单元号LUN设置的业务参数,所述业务参数包括:最大响应时长;
存储系统接收主机发来的iSCSI输入输出IO命令,该命令中设置有业务优化标志,所述业务优化标志为关键数据标志和/或响应时长限制标志;存储系统判断该命令中是否设置了响应时长限制标志,若是,判断该命令中是否设置了关键数据标志,若设置了,确定优先调度该命令,若未设置,则根据该命令的接收时刻以及该命令中的LUN对应的最大响应时长,计算该命令的应完成时刻,计算该命令的应完成时刻与当前时刻的差值,若该差值小于预设阈值,则确定优先调度该命令;否则,确定正常调度该命令。
所述阈值为所述iSCSI IO命令中的LUN对应的最大响应时长除以m所得的商值,其中,m>1。
当所述iSCSI IO命令为读命令时,存储系统判定该命令中设置了响应时长限制标志之后、判断该命令中是否设置了关键数据标志之前进一步包括:
判断是否已对该命令中的LUN对应的存储逻辑单元启用预读功能,若已启用,则确定正常调度该命令;若未启用,则执行所述判断该命令中是否设置了关键数据标志的动作。
当所述iSCSI IO命令为读命令且为顺序读时,所述iSCSI IO命令中进一步包括:顺序读标志;
且,当存储系统处理完该读命令,并向主机返回读响应后,对该读命令中的LUN对应的存储逻辑单元启用并执行预读功能。
当所述iSCSI IO命令为读命令且命令中包含响应时长限制标志时,
当存储系统处理完该读命令,并向主机返回读响应后,根据该读命令的最大响应时长判断读响应是否超时,若超时,判断读命令中的LUN对应的存储逻辑单元是否已启用预读功能,若未启用,则启用;若已启用,则关闭该预读功能,且,当接收到后续读命令时,若该读命令中设置了关键数据标志,则处理该读命令,否则,丢弃该读命令。
一种基于iSCSI的命令处理装置,包括:
第一模块:当与主机建立iSCSI会话后,接收并记录主机发来的为本次iSCSI会话针对的各个LUN设置的业务参数,所述业务参数包括:最大响应时长;
第二模块:接收主机发来的iSCSI IO命令,该命令中设置有业务优化标志,所述业务优化标志为关键数据标志和/或响应时长限制标志,判断该命令中是否设置了响应时长限制标志,若是,判断该命令中是否设置了关键数据标志,若设置了,确定优先调度该命令,若未设置,根据该命令的接收时刻以及第一模块记录的该命令中的LUN对应的最大响应时长,计算该命令的应完成时刻,计算该命令的应完成时刻与当前时刻的差值,若该差值小于预设阈值,则确定优先调度该命令;否则,确定正常调度该命令。
所述第二模块进一步用于,当所述iSCSI IO命令为读命令时,在判定该命令中设置了响应时长限制标志之后,判断是否已对该命令中的LUN对应的存储逻辑单元启用预读功能,若已启用,则确定正常调度该命令;若未启用,则执行所述判断该命令中是否设置了关键数据标志的动作。
所述第二模块进一步用于,当所述iSCSI IO命令为读命令且包含顺序读标志时,当处理完该读命令,并向主机返回读响应后,对该读命令中的LUN对应的存储逻辑单元启用并执行预读功能。
所述第二模块进一步用于,当所述iSCSI IO命令为读命令且命令中包含响应时长限制标志时,当处理完该读命令,并向主机返回读响应后,根据该读命令的最大响应时长判断读响应是否超时,若超时,判断读命令中的LUN对应的存储逻辑单元是否已启用预读功能,若未启用,则启用;若已启用,则关闭该预读功能,且,当接收到后续读命令时,若该读命令中设置了关键数据标志,则处理该读命令,否则,丢弃该读命令。
所述装置位于iSCSI存储系统中。
与现有技术相比,本发明中,可以使得主机控制iSCSI命令的响应,从而提高了基于iSCSI的命令处理效率。
另外,本发明实施例中,当主机的读命令为顺序读时,存储系统可以启动预读功能,或者,当存储系统响应超时后启动预读功能,从而加快了读响应,提高了读性能,进一步提高了基于iSCSI的命令处理效率。
具体实施方式
下面结合附图及具体实施例对本发明再作进一步详细的说明。
图2为本发明实施例提供的基于iSCSI的命令处理方法流程图,如图2所示,其具体步骤如下:
步骤201:当主机与存储系统建立iSCSI会话后,为本次iSCSI会话针对的各个LUN设置业务参数,主机将该本次iSCSI会话针对的各LUN的业务参数发送给存储系统,其中,业务参数包括:IO块大小和/或最大响应时长。
步骤202:主机向存储系统发送iSCSI IO命令,该命令中设置有业务优化标志,其中,业务优化标志为关键数据标志和/或响应时长限制标志。
步骤203:存储系统接收iSCSI IO命令,判断该命令中是否设置了响应时长限制标志,若是,执行步骤204;否则,执行步骤207。
步骤204:存储系统判断该命令中是否设置了关键数据标志,若是,执行步骤208;否则,执行步骤205。
步骤205:存储系统根据该命令的接收时刻以及该命令中的LUN的最大响应时长,计算该命令的应完成时刻。
步骤206:存储系统判断该命令的应完成时刻与当前时刻的差值是否大于或等于预设阈值,若是,执行步骤207;否则,执行步骤208。
这里,预设阈值可取命令中的LUN的最大响应时长/m,其中,m为大于1的整数。
步骤207:存储系统正常调度该命令,本流程结束。
步骤208:存储系统优先调度该命令。
图3为本发明实施例提供的设置业务参数的方法流程图,如图3所示,其具体步骤如下:
步骤301:主机与存储系统建立iSCSI会话,主机将本次会话针对的各LUN的业务参数携带在业务参数设置请求报文中发送给存储系统。
LUN的业务参数包括:IO块大小(Blocksize)、最大响应时长。可由上层应用单元或管理员根据业务需求,在主机上设置本次iSCSI会话针对的各LUN的业务参数,不同LUN的业务参数不一定相同。
本步骤中的业务参数设置请求报文有两个字段为本发明实施例扩展字段:
1、Time-limit:表示最大响应时长。
2、IO Blocksize:IO块大小,即每次读、写操作的数据块大小。
另外,报文中的type字段的取值可为iSCSI协议的任一预留值,这里取0x1c。
步骤302:存储系统接收业务参数设置请求报文,判断报文中的业务参数是否可行,若是,执行步骤304;否则,执行步骤303。
存储系统可根据自身性能规格判断业务参数是否可行。
步骤303:存储系统向主机返回指示失败的业务参数设置响应报文,本流程结束。
步骤304:存储系统向主机返回指示成功的业务参数设置响应报文,同时将各LUN的业务参数记录到本次会话的描述信息中。
对于业务参数设置响应报文,本发明实施例扩展了一个字段:status字段,用于表示业务参数设置成功还是失败,如:取值为1时,表示成功,取值为0时,表示失败。且,其中的type字段的取值可为iSCSI协议的任一预留值,当然,取值也必须与业务参数设置请求报文不同,这里取0x3c。
当业务参数设置成功后,就可进行IO过程了,以下分别给出iSCSI读过程和iSCSI写过程的具体实施方式:
图4为本发明实施例提供的基于iSCSI的读流程图,如图4所示,其具体步骤如下:
步骤401:主机向存储系统发送iSCSI读命令,该命令中携带业务优化标志位。
这里,业务优化标志位包括:顺序读标志位C、响应时长限制标志位T、关键数据标志位。例如,可设定:当C为1时,表示本主机当前发起的iSCSI读命令为顺序读命令,即相邻读命令针对的是相邻的数据块;当C为0时,表示本主机当前发起的iSCSI读命令不为顺序读命令;当T为1时,表示本iSCSI读命令有响应时长限制;当T为0时,表示本iSCSI读命令没有响应时长限制。现有的iSCSI报文中包含attr字段,这里,可将iSCSI读命令中的attr字段的最高位作为关键数据标志位,例如:当其置1时表示本次所读数据为关键数据。
步骤402:存储系统接收iSCSI读命令,根据该读命令中的T,判断该读命令是否有响应时长限制,若是,执行步骤403;否则,执行步骤407。
步骤403:存储系统根据该读命令中的attr,判断本次所读数据是否为关键数据,若是,执行步骤408;否则,执行步骤404。
步骤404:存储系统判断该读命令中的LUN对应存储逻辑单元是否已启用预读功能,若是,执行步骤407;否则,执行步骤405。
步骤405:存储系统根据读命令中的LUN,在自身记录的本次会话描述信息中查找到该LUN对应的最大响应时长,根据该读命令的接收时刻和该最大响应时长,计算出该读命令的应完成时刻。
读命令的应完成时刻=读命令的接收时刻+读命令中的LUN的最大响应时长。
步骤406:存储系统判断读命令的应完成时刻-当前时刻≥读命令中的LUN的最大响应时长/2是否成立,若是,执行步骤407;否则,执行步骤408。
步骤407:存储系统将该读命令的优先级设置为正常,将该读命令和优先级放入本次会话的命令队列中,转至步骤409。
步骤408:存储系统将该读命令的优先级设置为高,将该读命令和优先级放入本次会话的命令队列中,转至步骤409。
步骤409:存储系统根据命令队列中各命令的优先级确定各命令的处理顺序,当存储系统从命令队列中取出上述读命令时,根据读命令中的LUN以及本次会话描述信息中该LUN对应的IO块大小,从对应逻辑存储单元中读取一个IO块大小的数据,将该数据携带在读响应中返回给主机。
步骤410:存储系统根据读命令中的C,判断该读命令是否为顺序读,若是,执行步骤411;否则,本流程结束。
步骤411:存储系统判断该读命令中的LUN对应的存储逻辑单元是否已启用预读功能,若是,执行步骤412;否则,执行步骤413。
步骤412:存储系统对该读命令中的LUN对应的存储逻辑单元执行预读功能即,将当前读取的数据之后一个IO块大小的数据放入读缓存,本流程结束。
步骤413:存储系统对该读命令中的LUN对应的存储逻辑单元启用预读功能,同时将当前读取的数据之后一个IO块大小的数据放入读缓存。
将读取的数据之后一个IO块大小的数据放入读缓存,这样,当此后再收到读命令时,就可直接将读缓存中的数据返回给主机了,而不需再进行从存储逻辑单元中读取数据的操作了,从而提高了读性能。
在步骤406中,只为读命令的应完成时刻与当前时刻的差值设置了一个阈值:读命令中的LUN的最大响应时长/2,若大于该阈值,则确定读命令的优先级为正常;否则,确定读命令的优先级为高。在实际应用中,当存储系统支持多个优先级时,可设置多个阈值,以对优先级进行进一步细分。
在图4所示实施例中,当存储系统向主机返回读响应时,还可进一步判断该读响应返回时刻是否大于步骤405计算出的读命令的应完成时刻,若大于,则通过如下步骤优化后续读性能:
步骤01:判断当前读命令中的LUN对应的存储逻辑单元是否已启用预读功能,若是,执行步骤03;否则,执行步骤02。
步骤02:对该读命令中的LUN对应的存储逻辑单元启用预读功能,本流程结束。
步骤03:在本次会话描述信息中设置读响应超时标志。
步骤04:当接收到后续iSCSI读命令时,发现本次会话描述信息中有读响应超时标志,判断该读命令中的LUN对应的存储逻辑单元是否已启用预读功能,若是,执行步骤05;否则,执行步骤06。
步骤05:关闭该预读功能。
关闭预读功能后,此后当处理完一个iSCSI读命令后,不再将当前读取的数据之后一个IO块大小的数据放入读缓存。
步骤06:根据该后续读命令中的attr,判断当前所读数据是否为关键数据,若是,按照步骤408、409处理该读命令;否则,不处理该读命令,直接向主机返回指示失败的读响应。
图5为本发明实施例提供的基于iSCSI的写流程图,如图5所示,其具体步骤如下:
步骤501:主机向存储系统发送iSCSI写命令,该命令中携带业务优化标志位。
这里,业务优化标志位包括:响应时长限制标志位T、关键数据标志位。例如,可设定:当T为1时,表示本iSCSI写命令有响应时长限制;当T为0时,表示本iSCSI写命令没有响应时长限制。这里,可将iSCSI写命令中的attr字段的最高位作为关键数据位,例如:当其置1来表示本次写入数据为关键数据。
步骤502:存储系统接收iSCSI写命令,根据写命令中的T,判断该写命令是否有响应时长限制,若是,执行步骤503;否则,执行步骤506。
步骤503:存储系统根据该写命令中的attr,判断本次写入数据是否为关键数据,若是,执行步骤507;否则,执行步骤504。
步骤504:存储系统根据写命令中的LUN,在自身记录的本次会话描述信息中查找到该LUN对应的最大响应时长,根据该写命令的接收时刻和该最大响应时长,计算出该写命令的应完成时刻。
写命令的应完成时刻=写命令的接收时刻+写命令中的LUN的最大响应时长。
步骤505:存储系统判断写命令的应完成时刻-当前时刻≥写命令中的LUN的最大响应时长/2是否成立,若是,执行步骤506;否则,执行步骤507。
步骤506:存储系统将该写命令的优先级设置为正常,将该写命令和优先级放入本次会话的命令队列中,转至步骤508。
步骤507:存储系统将该写命令的优先级设置为高,将该写命令和优先级放入本次会话的命令队列中,转至步骤508。
步骤508:存储系统根据命令队列中各命令的优先级确定各命令的处理顺序,当存储系统从命令队列中取出上述写命令时,根据写命令中的LUN,将写命令中的数据写入对应存储逻辑单元,写入完毕,向主机返回指示成功的写响应。
在步骤505中,只为写命令的应完成时刻与当前时刻的差值设置了一个阈值:写命令中的LUN的最大响应时长/2,若大于该阈值,则确定写命令的优先级为正常;否则,确定写命令的优先级为高。在实际应用中,当存储系统支持多个优先级时,可设置多个阈值,以对优先级进行进一步细分。
图6为本发明实施例提供的基于iSCSI的命令处理装置的组成图,如图6所示,其主要包括:第一模块61和第二模块62,其中:
第一模块61:当与主机建立iSCSI会话后,接收并记录主机发来的为本次iSCSI会话针对的各个LUN设置的业务参数,所述业务参数包括:IO块大小和/或最大响应时长。
第二模块62:接收主机发来的iSCSI IO命令,该命令中设置有业务优化标志,所述业务优化标志为关键数据标志和/或响应时长限制标志,判断该命令中是否设置了响应时长限制标志,若是,判断该命令中是否设置了关键数据标志,若设置了,确定优先调度该命令,若未设置,从第一模块61获取该命令中的LUN对应的最大响应时长,根据该命令的接收时刻以及该获取的最大响应时长,计算该命令的应完成时刻,计算该命令的应完成时刻与当前时刻的差值,若该差值小于预设阈值,则确定优先调度该命令;否则,确定正常调度该命令。
第二模块62还可用于,当所述iSCSI IO命令为读命令时,在判定该命令中设置了响应时长限制标志之后,判断是否已对该命令中的LUN对应的存储逻辑单元启用预读功能,若已启用,则确定正常调度该命令;若未启用,则执行所述判断该命令中是否设置了关键数据标志的动作。
第二模块还可用于,当所述iSCSI IO命令为读命令且包含顺序读标志时,当处理完该读命令,并向主机返回读响应后,对该读命令中的LUN对应的存储逻辑单元启用并执行预读功能。
第二模块还可用于,当所述iSCSI IO命令为读命令且命令中包含响应时长限制标志时,当处理完该读命令,并向主机返回读响应后,根据该读命令的最大响应时长判断读响应是否超时,若超时,判断读命令中的LUN对应的存储逻辑单元是否已启用预读功能,若未启用,则启用;若已启用,则关闭该预读功能,且,当接收到后续读命令时,若该读命令中设置了关键数据标志,则处理该读命令,否则,丢弃该读命令。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。