CN104598409A - 一种处理输入输出请求的方法及设备 - Google Patents
一种处理输入输出请求的方法及设备 Download PDFInfo
- Publication number
- CN104598409A CN104598409A CN201310535656.9A CN201310535656A CN104598409A CN 104598409 A CN104598409 A CN 104598409A CN 201310535656 A CN201310535656 A CN 201310535656A CN 104598409 A CN104598409 A CN 104598409A
- Authority
- CN
- China
- Prior art keywords
- request
- parameter
- lun
- instruction
- main
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F13/00—Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
- G06F13/10—Program control for peripheral devices
- G06F13/105—Program control for peripheral devices where the programme performs an input/output emulation function
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/061—Improving I/O performance
- G06F3/0613—Improving I/O performance in relation to throughput
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Human Computer Interaction (AREA)
- Bus Control (AREA)
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种处理输入输出请求的方法及设备,属于计算机领域。所述方法包括:获取多个输入输出IO请求;根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,所述多个IO请求中的每一个IO请求的参数至少包括IO请求对应的LUN、IO请求的优先级和IO请求的命令描述字;将IO指令发送给存储系统,使存储系统从IO指令中解析出所述多个IO请求,并对所述多个IO请求分别进行处理。所述设备包括:获取模块、封装模块和第一发送模块。本发明减少了主机与存储系统之间的IO指令数,提高了存储系统的读写性能和吞吐量。
Description
技术领域
本发明涉及计算机领域,特别涉及一种处理输入输出请求的方法及设备。
背景技术
随着计算机技术的快速发展,在一个主机上可以模拟出多个虚拟机。每个虚拟机上会运行多个应用程序,当该应用程序需要存储系统执行某个操作时,该应用程序向该存储系统发送一个IO(input/output,输入/输出)请求,虚拟机通过该主机上的虚拟机监视器将该IO请求发送给存储系统。
其中,一个虚拟机对应多个虚拟磁盘,虚拟磁盘保存在存储系统上。由于虚拟机执行操作时以虚拟磁盘为操作粒度,而存储系统执行操作时以LUN(Logical Unit Number,逻辑单元号)为操作粒度,所以为了保证虚拟机的操作粒度与存储系统的操作粒度一致,存储系统为每个虚拟磁盘分配一个LUN。由于主机和存储系统之间是通过SCSI(Small Computer System Interface,小型计算机系统接口)协议进行IO通信的,而SCSI协议要求一个IO指令只能对一个LUN进行操作,所以虚拟机监视器获取同一个LUN对应的IO请求,根据该LUN对应的IO请求需要访问的逻辑地址和该LUN对应的IO请求的优先级,对该LUN对应的IO请求进行IO排序和合并,将IO排序和合并之后得到的IO指令发送给存储系统。存储系统接收该IO指令,对该IO指令进行处理。
由于虚拟磁盘与LUN是一一对应的关系,因此虚拟机监视器只能将一个虚拟磁盘发出的IO请求进行IO排序和合并,无法做到将一个虚拟机的IO请求进行整体IO排序和合并,更无法做到对多个虚拟机的IO请求进行整体IO排序和合并。如此,导致存储系统会面对大量的IO指令,大大降低了存储系统的读写性能和吞吐量。
发明内容
为了解决现有技术的问题,本发明实施例提供了一种处理输入输出请求的方法及设备。所述技术方案如下:
第一方面,提供了一种处理输入输出请求的方法,所述方法包括:
获取多个输入输出IO请求;
根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,所述多个IO请求中的每一个IO请求的参数至少包括IO请求对应的LUN、IO请求的优先级和IO请求的命令描述字;
将所述IO指令发送给存储系统,使所述存储系统从所述IO指令中解析出所述多个IO请求,并对所述多个IO请求分别进行处理。
结合第一方面,在上述第一方面的第一种可能的实现方式中,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将每个IO请求对应的LUN填充在IO指令的LUN字段中;
根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的优先级填充在所述IO指令的优先级字段中;
根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的命令描述字填充在所述IO指令的命令描述字字段中;
将所述LUN字段、所述优先级字段和所述命令描述字段封装成一个IO指令。
结合第一方面,在上述第一方面的第二种可能的实现方式中,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将每个IO请求对应的LUN、所述每个IO请求的优先级和所述每个IO请求的命令描述字,分别填充在所述每个IO请求对应的信息字段中,所述信息字段包括LUN字段、优先级字段和命令描述字字段;
将所述每个IO请求对应的信息字段封装成一个IO指令。
结合第一方面、第一方面的第一种可能的实现方式或第一方面的第二种可能的实现方式,在上述第一方面的第三种可能的实现方式中,所述IO指令中还包括所述获取的多个IO请求的数量。
结合第一方面,在上述第一方面的第四种可能的实现方式中,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将所述获取的多个IO请求划分为多个IO请求组;
对于所述多个IO请求组中的任一个IO请求组,为所述IO请求组选择一个主请求;
将所述IO请求组中除所述主请求之外的其他IO请求确定为所述IO请求组的从请求,并将所述从请求封装在所述主请求的IO请求参数页中;
根据所述主请求对应的LUN、所述主请求的优先级和所述主请求的命令描述字,将所述主请求封装成一个IO指令,所述IO指令中携带所述主请求的IO请求参数页。
结合第一方面的第四种可能的实现方式,在上述第一方面的第五种可能的实现方式中,所述将所述获取的多个IO请求划分为多个IO请求组,包括:
判断获取的多个IO请求中是否存在携带参数的IO请求;
如果存在,则根据携带参数的IO请求的数量,将所述获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求;
如果不存在,则将所述获取的多个IO请求划分为多个IO请求组。
结合第一方面的第四种可能的实现方式或第一方面的第五种可能的实现方式,在上述第一方面的第六种可能的实现方式中,所述为所述IO请求组选择一个主请求,包括:
如果所述IO请求组中包括携带参数的IO请求,则将携带参数的IO请求确定为所述IO请求组的主请求;
如果所述IO请求组中没有包括携带参数的IO请求,则从所述IO请求组中随机选择一个IO请求,将选择的IO请求确定为所述IO请求组的主请求。
结合第一方面的第四种可能的实现方式,在上述第一方面的第七种可能的实现方式中,所述将所述从请求封装在所述主请求的IO请求参数页中,包括:
将每个从请求对应的LUN、所述每个从请求的优先级和所述每个从请求的命令描述字分别填充在所述每个从请求对应的IO参数列表中;
为所述主请求的IO请求参数页设置页码和子页码,将所述页码、所述子页码和所述每个从请求对应的IO参数列表封装在所述主请求的IO请求参数页中。
结合第一方面的第四种可能的实现方式,在上述第一方面的第八种可能的实现方式中,所述根据所述主请求对应的LUN、所述主请求的优先级和所述主请求的命令描述字,将所述主请求封装成一个IO指令,所述IO指令中携带所述主请求的IO请求参数页之前,还包括:
如果所述主请求的命令描述字中包括参数列表长度字段,则将所述参数列表长度字段修改为所述主请求的IO请求参数页的长度;
如果所述主请求的命令描述字中不包括参数列表长度字段,则在所述主请求的命令描述字中增加参数列表长度字段,并设置所述参数列表长度字段为所述主请求的IO请求参数页的长度。
第二方面,提供了一种处理输入输出请求的设备,所述设备包括:
获取模块,用于获取多个输入输出IO请求;
封装模块,用于根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,所述多个IO请求中的每一个IO请求的参数至少包括IO请求对应的LUN、IO请求的优先级和IO请求的命令描述字;
第一发送模块,用于将所述IO指令发送给存储系统,使所述存储系统从所述IO指令中解析出所述多个IO请求,并对所述多个IO请求分别进行处理。
结合第二方面,在上述第二方面的第一种可能的实现方式中,所述封装模块包括:
第一填充单元,用于将每个IO请求对应的LUN填充在IO指令的LUN字段中;
第二填充单元,用于根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的优先级填充在所述IO指令的优先级字段中;
第三填充单元,用于根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的命令描述字填充在所述IO指令的命令描述字字段中;
第一封装单元,用于将所述LUN字段、所述优先级字段和所述命令描述字段封装成一个IO指令。
结合第二方面,在上述第二方面的第二种可能的实现方式中,所述封装模块包括:
第四填充单元,用于将每个IO请求对应的LUN、所述每个IO请求的优先级和所述每个IO请求的命令描述字,分别填充在所述每个IO请求对应的信息字段中,所述信息字段包括LUN字段、优先级字段和命令描述字字段;
第二封装单元,用于将所述每个IO请求对应的信息字段封装成一个IO指令。
结合第二方面、第二方面的第一种可能的实现方式或第二方面的第二种可能的实现方式,在上述第二方面的第三种可能的实现方式中,所述IO指令中还包括所述获取的多个IO请求的数量。
结合第二方面,在上述第二方面的第四种可能的实现方式中,所述封装模块包括:
划分单元,用于将所述获取的多个IO请求划分为多个IO请求组;
选择单元,用于对于所述多个IO请求组中的任一个IO请求组,为所述IO请求组选择一个主请求;
第三封装单元,用于将所述IO请求组中除所述主请求之外的其他IO请求确定为所述IO请求组的从请求,并将所述从请求封装在所述主请求的IO请求参数页中;
第四封装单元,用于根据所述主请求对应的LUN、所述主请求的优先级和所述主请求的命令描述字,将所述主请求封装成一个IO指令,所述IO指令中携带所述主请求的IO请求参数页。
结合第二方面的第四种可能的实现方式,在上述第二方面的第五种可能的实现方式中,所述划分单元包括:
判断子单元,用于判断获取的多个IO请求中是否存在携带参数的IO请求;
第一划分子单元,用于如果存在,则根据携带参数的IO请求的数量,将所述获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求;
第二划分子单元,用于如果不存在,则将所述获取的多个IO请求划分为多个IO请求组。
结合第二方面的第四种可能的实现方式或第二方面的第五种可能的实现方式,在上述第二方面的第六种可能的实现方式中,所述选择单元包括:
第一确定子单元,用于如果所述IO请求组中包括携带参数的IO请求,则将携带参数的IO请求确定为所述IO请求组的主请求;
选择子单元,用于如果所述IO请求组中没有包括携带参数的IO请求,则从所述IO请求组中随机选择一个IO请求,将选择的IO请求确定为所述IO请求组的主请求。
结合第二方面的第四种可能的实现方式,在上述第二方面的第七种可能的实现方式中,所述第三封装单元包括:
第二确定子单元,用于将所述IO请求组中除所述主请求之外的其他IO请求确定为所述IO请求组的从请求;
填充子单元,用于将每个从请求对应的LUN、所述每个从请求的优先级和所述每个从请求的命令描述字分别填充在所述每个从请求对应的IO参数列表中;
设置子单元,用于为所述主请求的IO请求参数页设置页码和子页码,将所述页码、所述子页码和所述每个从请求对应的参数封装在所述主请求的IO请求参数页中。
结合第二方面的第四种可能的实现方式,在上述第二方面的第八种可能的实现方式中,所述封装模块还包括:
修改单元,用于如果所述主请求的命令描述字中包括参数列表长度字段,则将所述参数列表长度字段修改为所述主请求的IO请求参数页的长度;
设置单元,用于如果所述主请求的命令描述字中不包括参数列表长度字段,则在所述主请求的命令描述字中增加参数列表长度字段,并设置所述参数列表长度字段为所述主请求的IO请求参数页的长度。
第三方面,提供了一种处理输入输出请求的设备,所述设备包括存储器和处理器,用于执行所述一种处理输入输出请求的方法。
在本发明实施例中,当虚拟机发出的IO请求时,获取多个IO请求;根据每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,将获取的多个IO请求封装成一个IO指令,避免了将每个LUN对应的IO请求分别封装成一个IO指令,减少了主机与存储系统之间的IO指令数,从而避免了为大量IO指令建立连接和断开连接,提高了存储系统的读写性能和吞吐量。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例一提供的一种处理输入输出请求的方法流程图;
图2是本发明实施例二提供的一种处理输入输出请求的系统结构示意图;
图3是本发明实施例二提供的一种处理输入输出请求的方法流程图;
图4是本发明实施例三提供的一种处理输入输出请求的方法流程图;
图5是本发明实施例四提供的一种处理输入输出请求的设备结构示意图;
图6是本发明实施例五提供的一种处理输入输出请求的设备结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
实施例一
本发明实施例提供了一种处理输入输出请求的方法,参见图1,该方法包括:
步骤101:获取多个输入输出IO请求;
步骤102:根据获取的多个IO请求的参数,将获取的多个IO请求封装成一个IO指令,该多个IO请求中的每一个IO请求的参数至少包括IO请求对应的LUN、IO请求的优先级和IO请求的命令描述字;
步骤103:将该IO指令发送给存储系统,使该存储系统从该IO指令中解析出该多个IO请求,并对该多个IO请求分别进行处理。
其中,根据获取的多个IO请求的参数,将获取的多个IO请求封装成一个IO指令,包括:
将每个IO请求对应的LUN填充在IO指令的LUN字段中;
根据该LUN字段中LUN对应的IO请求的顺序,将每个IO请求的优先级填充在该IO指令的优先级字段中;
根据该LUN字段中LUN对应的IO请求的顺序,将每个IO请求的命令描述字填充在该IO指令的命令描述字字段中;
将LUN字段、优先级字段和命令描述字段封装成一个IO指令。
可选地,根据获取的多个IO请求的参数,将获取的多个IO请求封装成一个IO指令,包括:
将每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,分别填充在每个IO请求对应的信息字段中,该信息字段包括LUN字段、优先级字段和命令描述字字段;
将每个IO请求对应的信息字段封装成一个IO指令。
其中,该IO指令中还包括获取的多个IO请求的数量。
其中,根据获取的多个IO请求的参数,将获取的多个IO请求封装成一个IO指令,包括:
将获取的多个IO请求划分为多个IO请求组;
对于该多个IO请求组中的任一个IO请求组,为该IO请求组选择一个主请求;
将该IO请求组中除该主请求之外的其他IO请求确定为该IO请求组的从请求,并将该从请求封装在该主请求IO请求参数页中;
根据该主请求对应的LUN、该主请求的优先级和该主请求的命令描述字,将该主请求封装成一个IO指令,该IO指令中携带该主请求的IO请求参数页。
其中,将获取的多个IO请求划分为多个IO请求组,包括:
判断获取的多个IO请求中是否存在携带参数的IO请求;
如果存在,则根据携带参数的IO请求的数量,将获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求;
如果不存在,则将获取的多个IO请求划分为多个IO请求组。
其中,为该IO请求组选择一个主请求,包括:
如果该IO请求组中包括携带参数的IO请求,则将携带参数的IO请求确定为该IO请求组的主请求;
如果该IO请求组中没有包括携带参数的IO请求,则从该IO请求组中随机选择一个IO请求,将选择的IO请求确定为该IO请求组的主请求。
其中,将该从请求封装在该主请求的IO请求参数页中,包括:
将每个从请求对应的LUN、每个从请求的优先级和每个从请求的命令描述字分别填充在每个从请求对应的IO参数列表中;
为该主请求的IO请求参数页设置页码和子页码,将设置的页码、子页码和每个从请求对应的参数封装在该主请求的IO请求参数页中。
进一步地,根据该主请求对应的LUN、该主请求的优先级和该主请求的命令描述字,将该主请求封装成一个IO指令,该IO指令中携带该主请求的IO请求参数页之前,还包括:
如果该主请求的命令描述字中包括参数列表长度字段,则将该参数列表长度字段修改为该主请求的IO请求参数页的长度;
如果该主请求的命令描述字中不包括参数列表长度字段,则在该主请求的命令描述字中增加参数列表长度字段,并设置该参数列表长度字段为该主请求的IO请求参数页的长度。
在本发明实施例中,当虚拟机发出的IO请求时,获取多个IO请求;根据每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,将获取的多个IO请求封装成一个IO指令,避免了将每个LUN对应的IO请求封装成一个IO指令,减少了主机与存储系统之间的IO指令数,从而避免了为大量IO指令建立连接和断开连接,提高了存储系统的读写性能和吞吐量。
实施例二
本发明实施例提供了一种处理输入输出请求的方法。其中,参见图2所示的处理输入输出请求的结构示意图,该系统包括虚拟机、虚拟机监视器和存储系统,虚拟机监视器和存储系统分别包括SCSI驱动模块,且存储系统还包括多个LUN。其中,一个虚拟机对应一个或多个LUN。
参见图3,该方法包括:
步骤201:当虚拟机发出IO请求时,虚拟机监视器获取多个IO请求;
进一步地,当该虚拟机发出IO请求时,该虚拟机监视器可以获取预设时间段内的多个IO请求。
其中,虚拟机监视器获取的预设时间段内的IO请求可以是一个虚拟机发出的请求,也可以是多个虚拟机发出的请求。
由于一个虚拟机对应一个或多个LUN,所以虚拟机发出的IO请求可以是发向多个LUN的请求,也可以是发向同一个LUN请求的。
其中,在本发明实施例中,IO请求可以是虚拟机发出的,也可以是个人计算机,还可以是集群式服务器系统,所以本发明实施例对发出IO请求的主体不做具体限定。
步骤202:虚拟机监视器根据每个LUN对应的IO请求需要访问的逻辑地址和每个LUN对应的IO请求的优先级,分别对每个LUN对应的IO请求进行IO排序和合并,得到多个合并后的IO请求;
具体地,虚拟机监视器获取同一个LUN对应的IO请求,根据该LUN对应的IO请求需要访问的逻辑地址,对该LUN对应的IO请求进行IO排序,得到该LUN对应的IO请求的顺序。根据该LUN对应的IO请求的顺序、该LUN对应的IO请求对应的操作类型和该LUN对应的IO请求的优先级,对该LUN对应的IO请求进行合并,得到一个或多个合并后的IO请求。
其中,针对其他的LUN也根据上述步骤得到一个或多个合并后的IO请求。
其中,根据该LUN对应的IO请求的顺序、该LUN对应的IO请求对应的操作类型和该LUN对应的IO请求的优先级,对该LUN对应的IO请求进行合并,具体操作为:将IO请求对应的操作类型相同且IO请求的顺序相连的IO请求进行合并,得到一个合并后的IO请求;以及将IO请求需要访问的逻辑地址相同、IO请求对应的操作类型不同且IO请求的顺序相连的IO请求进行合并,得到一个合并后的IO请求。
比如,IO请求的顺序相连的3个IO请求对应的操作类型均为读操作或者写操作,则将这3个IO请求进行合并后得到一个合并后的IO请求。当对该存储系统进行操作时,可以一次性地读取或者写入这3个IO请求访问的逻辑地址中的数据,如此降低了对该存储系统进行读操作和写操作的次数,提高了该存储系统的寿命。
再比如,IO请求的顺序相连的2个IO请求需要访问的逻辑地址相同,顺序在先的IO请求对应的操作类型为写操作,顺序在后的IO请求对应的操作类型为读操作,则将这2个IO请求进行合并后得到一个合并后的IO请求。当对该存储系统进行操作时,可以直接将写操作需要写入的数据直接作为读操作读出的数据,如此降低了对该存储系统进行读操作和写操作的次数,提高了该存储系统的寿命。
其中,在本发明实施例中,步骤202为可选步骤,本发明实施例可以对获取的多个IO请求进行排序和合并后,对合并后的IO请求按照如下的方法进行封装,也可以不对获取的多个IO请求进行排序和合并,直接对获取的多个IO请求按照如下的方法进行封装。
步骤203:虚拟机监视器每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,将获取的多个IO请求封装成一个IO指令;
具体地,本步骤可以通过如下(1)-(5)的步骤来实现,包括:
(1)、虚拟机监视器将每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字发送给该虚拟机监视器包括的SCSI驱动模块;
(2)、该虚拟机监视器包括的SCSI驱动模块将该多个IO请求对应的LUN填充在LUN字段中;
进一步地,该虚拟机监视器包括的SCSI驱动模块获取IO请求的数量,将该IO请求的数量填充在该IO指令的IO请求数量字段中。
(3)、根据LUN字段中LUN对应的IO请求的顺序,将每个IO请求的优先级填充在该IO指令的优先级字段中;
(4)、根据LUN字段中LUN对应的IO请求的顺序,将每个IO请求的命令描述字填充在该IO指令的命令描述字字段中;
其中,命令描述字中包括该IO请求对应的操作类型和该IO请求需要访问的逻辑地址。比如,该操作类型为读、写和格式化等操作类型,逻辑地址包括起始逻辑地址和终止逻辑地址。
(5)、将LUN字段、优先级字段和命令描述字字段封装成一个IO指令。
进一步地,将IO请求数量字段、LUN字段、优先级字段和命令描述字字段封装成一个IO指令。
其中,LUN字段、优先级字段和命令描述字字段中对应的IO请求的顺序相同。
例如,IO请求的数量为3,IO请求1对应的LUN为LUN1,IO请求1的优先级为优先级1,IO请求1的命令描述字为命令描述字1;IO请求2对应的LUN为LUN2,IO请求2的优先级为优先级2,IO请求2的命令描述字为命令描述字2;IO请求3对应的LUN为LUN3,IO请求3的优先级为优先级3,IO请求3的命令描述字为命令描述字3。将IO请求的数量3填充在如下表1所示的IO请求数量字段中,将IO请求1、IO请求2和IO请求3对应的LUN分别填充在如下表1中的LUN字段中;根据LUN字段中该3个IO请求对应的LUN的顺序,将该3个IO请求的优先级填充在如下表1的优先级字段中;根据LUN字段中该3个IO请求对应的LUN的顺序,将该3个IO请求的命令描述字填充在如下表1的命令描述字字段中,将IO请求数量字段、LUN字段、优先级字段和命令描述字字段封装成一个IO指令。
表1
可选地,虚拟机监视器每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,将获取的多个IO请求封装成一个IO指令的操作可以通过如下(1)-(3)的步骤来实现,包括:
(1)、虚拟机监视器将每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字发送给该虚拟机监视器包括的SCSI驱动模块;
(2)、该虚拟机监视器包括的SCSI驱动模块接收每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字;
(3)、将每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,分别填充在每个IO请求对应的信息字段中,该信息字段包括LUN字段、优先级字段和命令描述字字段;
进一步地,该虚拟机监视器包括的SCSI驱动模块获取IO请求的数量,并将IO请求的数量填充在IO请求数量字段中。
(4)、将每个IO请求对应的信息字段封装成一个IO指令。
进一步地,将IO请求数量字段和每个IO请求对应的信息字段封装成一个IO指令。
例如,IO请求的数量为3,IO请求1对应的LUN为LUN1,IO请求1的优先级为优先级1,IO请求1的命令描述字为命令描述字1;IO请求2对应的LUN为LUN2,IO请求2的优先级为优先级2,IO请求2的命令描述字为命令描述字2;IO请求3对应的LUN为LUN3,IO请求3的优先级为优先级3,IO请求3的命令描述字为命令描述字3。将IO请求的数量3填充在如下表2所示的IO请求数量字段中,将IO请求1对应的LUN、优先级和命令描述字填充在如下表2中IO请求1对应的信息字段1中;将IO请求2对应的LUN、优先级和命令描述字填充在如下表2中IO请求2对应的信息字段2中;将IO请求3对应的LUN、优先级和命令描述字填充在如下表2中IO请求3对应的信息字段3中,将IO请求数量字段、信息字段1、信息字段2和信息字段3封装成一个IO指令。
表2
优选地,在执行步骤203之前,虚拟机监视器根据获取的多个IO请求的顺序和获取的多个IO请求对应的LUN,将获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括第一预设数值个LUN对应的IO请求,并根据步骤203将每个IO请求组封装成一个IO指令。其中,第一预设数值为一条IO指令中最多可包括LUN的数量。
步骤204:将该IO指令发送给存储系统;
具体地,虚拟机监视器包括的SCSI驱动模块将该IO指令发送给存储系统。
步骤205:存储系统接收该IO指令,从该IO指令中解析出每个IO请求对应的LUN、优先级和命令描述字;
具体地,该存储系统包括的SCSI驱动模块接收该IO指令,从该IO指令中解析出每个IO请求对应的LUN号、优先级和命令描述字。
进一步地,该存储系统包括的SCSI驱动模块接收该IO指令,根据该IO指令中IO请求的数量,从该IO指令中解析出每个IO请求对应的LUN号、优先级和命令描述字。
步骤206:存储系统根据解析出的每个IO请求对应的LUN、优先级和命令描述字,对每个IO请求分别进行处理。
在本发明实施例中,当虚拟机发出的IO请求时,获取多个IO请求;根据每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,将获取的多个IO请求封装成一个IO指令,避免了将每个LUN对应的IO请求封装成一个IO指令,减少了主机与存储系统之间的IO指令数,从而避免了为大量IO指令建立连接和断开连接,提高了存储系统的读写性能和吞吐量。
实施例三
本发明实施例提供了一种处理输入输出请求的方法,参见图4,该方法包括:
步骤301:当虚拟机发出IO请求时,虚拟机监视器获取多个IO请求;
进一步地,当虚拟机发出IO请求时,虚拟机监视器获取预设时间段内的多个IO请求;
其中,虚拟机监视器获取的预设时间段内的IO请求可以是一个虚拟机发出的请求,也可以是多个虚拟机发出的请求。
由于一个虚拟机对应一个或多个LUN,所以虚拟机发出的IO请求可以是发向多个LUN的请求,也可以是发向同一个LUN请求的。
其中,在本发明实施例中,IO请求可以是虚拟机发出的,也可以是个人计算机,还可以是集群式服务器系统,所以本发明实施例对发出IO请求的主体不做具体限定。
步骤302:虚拟机监视器根据每个LUN对应的IO请求需要访问的逻辑地址和每个LUN对应的IO请求的优先级,分别对每个LUN对应的IO请求进行IO排序和合并,得到多个合并后的IO请求;
具体地,虚拟机监视器获取同一个LUN对应的IO请求,根据该LUN对应的IO请求需要访问的逻辑地址,对该LUN对应的IO请求进行IO排序,得到该LUN对应的IO请求的顺序。根据该LUN对应的IO请求的顺序、该LUN对应的IO请求对应的操作类型和该LUN对应的IO请求的优先级,对该LUN对应的IO请求进行合并,得到一个或多个合并后的IO请求。
其中,针对其他的LUN也根据上述步骤得到一个或多个合并后的IO请求。
其中,根据该LUN对应的IO请求的顺序、该LUN对应的IO请求对应的操作类型和该LUN对应的IO请求的优先级,对该LUN对应的IO请求进行合并,具体操作为:将IO请求对应的操作类型相同且IO请求的顺序相连的IO请求进行合并,得到一个合并后的IO请求;以及将IO请求需要访问的逻辑地址相同、IO请求对应的操作类型不同且IO请求的顺序相连的IO请求进行合并,得到一个合并后的IO请求。
比如,IO请求的顺序相连的3个IO请求对应的操作类型均为读操作或者写操作,则将这3个IO请求进行合并后得到一个合并后的IO请求。当对该存储系统进行操作时,可以一次性地读取或者写入这3个IO请求访问的逻辑地址中的数据,如此降低了对该存储系统进行读操作和写操作的次数,提高了该存储系统的寿命。
再比如,IO请求的顺序相连的2个IO请求需要访问的逻辑地址相同,顺序在先的IO请求对应的操作类型为写操作,顺序在后的IO请求对应的操作类型为读操作,则将这2个IO请求进行合并后得到一个合并后的IO请求。当对该存储系统进行操作时,可以直接将写操作需要写入的数据直接作为读操作读出的数据,如此降低了对该存储系统进行读操作和写操作的次数,提高了该存储系统的寿命。
步骤303:虚拟机监视器将获取的多个IO请求划分为多个IO请求组;
具体地,本步骤可以通过如下(1)-(4)的步骤来实现,包括:
(1)、虚拟机监视器将每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字发送给该虚拟机监视器包括的SCSI驱动模块;
(2)、该虚拟机监视器包括的SCSI驱动模块判断获取的多个IO请求中是否存在携带参数的IO请求。
其中,有的IO请求需要携带参数,比如LOG SELECT请求和MODESELECT请求中需要携带参数。
(3)、如果存在,则根据携带参数的IO请求的数量,将获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求;
具体地,如果获取的多个IO请求中存在携带参数的IO请求,则将该IO请求的数量除以携带参数的IO请求的数量,得到第一数值,如果第一数值为整数,则将获取的多个IO请求划分为第一数值个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求。如果第一数值不为整数,则将第一数值向上取整,得到第二数值,将获取的多个IO请求划分为第二数值个IO请求组,此时,该第二数值个IO请求组中包括一个没有携带参数的IO请求组。
优选地,如果获取的多个IO请求中存在携带参数的IO请求,则根据IO请求的数量、携带参数的IO请求的数量和第二预设数值,将获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括第二预设数值个IO请求且每个IO请求组中最多包括一个携带参数的IO请求。
其中,根据IO请求的数量、携带参数的IO请求的数量和第二预设数值,将获取的多个IO请求划分为多个IO请求组的具体操作为:将该IO请求的数量除以携带参数的IO请求的数量,得到第一数值,如果第一数值为整数,则将获取的多个IO请求划分为第一数值个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求。判断第一数值个IO请求组中包括的IO请求的数量是否大于第二预设数值,如果存在大于第二预设数值的IO请求组,则将该IO请求组再进行划分,使划分后的每个IO请求组包括的IO请求的数量小于或等于第二预设数值。如果第一数值不为整数,则将第一数值向上取整,得到第二数值,将获取的多个IO请求划分为第二数值个IO请求组,此时,该第二数值个IO请求组中包括一个没有携带参数的IO请求组。判断第二数值个IO请求组中包括的IO请求的数量是否大于第二预设数值,如果存在大于第二预设数值的IO请求组,则将该IO请求组再进行划分,使划分后的每个IO请求组包括的IO请求的数量小于或等于第二预设数值。
其中,由于读写请求不携带参数,而在实际应用中,大多数的IO请求都是读写请求,所以携带参数的IO请求的数量较少,所以将获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求,不会使IO请求组的个数较多。
(4)、如果不存在,则将获取的多个IO请求划分为多个IO请求组。
具体地,如果获取的多个IO请求中不存在携带参数的IO请求,则根据获取的多个IO请求的数量,将获取的多个IO请求划分为多个IO请求组。
优选地,如果获取的多个IO请求中不存在携带参数的IO请求,则根据IO请求的数量和第二预设数值,将获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括第二预设数值个IO请求。
步骤304:对于该多个IO请求组中的任一个IO请求组,为该IO请求组选择一个主请求;
具体地,对于该多个IO请求组中的任一个IO请求组,如果该IO请求组中包括携带参数的IO请求,则将携带参数的IO请求确定为该IO请求组的主请求;如果该IO请求组中没有包括携带参数的IO请求,则从该IO请求组中随机选择一个IO请求,将选择的IO请求确定为该IO请求组的主请求。
步骤305:将该IO请求组中除该主请求之外的其他IO请求确定为该IO请求组的从请求,并将该从请求封装在该主请求的IO请求参数页中;
具体地,将该IO请求组中除该主请求之外的其他IO请求确定为该IO请求组的从请求,并将每个从请求对应的LUN、每个从请求的优先级和每个从请求的命令描述字分别填充在每个从请求对应的IO参数列表中;为该主请求的IO请求参数页设置页码和子页码,将设置的页码、子页码和每个从请求对应的IO参数列表封装在该主请求的IO请求参数页中。
其中,将该从请求封装在该主请求的IO请求参数页中之后,该主请求的IO请求参数页中不仅包括该主请求原本携带的参数,还包括每个从请求对应的LUN、每个从请求的优先级和每个从请求的命令描述字。
其中,在SCSI协议中,不同的参数页用不同的页码和子页码组合来唯一识别,所以在本发明实施例中事先为该主请求的IO请求参数页设置页码和子页码,并将设置的页码和子页码发送给存储系统。当存储系统接收到该主请求的IO请求参数页时,可以通过该页码和子页码识别该主请求的IO请求参数页。例如,设置页码为0x08h,以及设置子页码为0x00h。
例如,该主请求的IO请求参数页可以为如下表3所示的格式,该主请求的IO请求参数页中包括页码、子页码、页长度、从请求1对应的IO参数列表1、从请求2对应的IO参数列表2和从请求3对应的IO参数列表3。
表3
页码 |
子页码 |
页长度 |
IO参数列表1 |
IO参数列表2 |
IO参数列表3 |
步骤306:如果该主请求的命令描述字中包括参数列表长度字段,则将该参数列表长度字段修改为该主请求的IO请求参数页的长度;
其中,如果该主请求为携带参数的IO请求,则该主请求的命令描述字中包括参数列表长度字段,如果该主请求不为携带参数的IO请求,则该主请求的命令描述字中不包括参数列表长度字段。
步骤307:如果该主请求的命令描述字中不包括参数列表长度字段,则在该主请求的命令描述字中增加参数列表长度字段,并设置该参数列表长度字段的为该主请求的IO请求参数页的长度;
步骤308:根据该主请求对应的LUN、该主请求的优先级和该主请求的命令描述字,将该主请求封装成一个IO指令;
步骤309:将该IO指令和该主请求的IO请求参数页发送给存储系统;
步骤310:该存储系统接收该IO指令,根据该IO指令的命令描述字确定该IO指令携带主请求的IO请求参数页,接收该主请求的IO请求参数页;
具体地,该存储系统包括的SCSI驱动模块接收该IO指令,根据该IO指令的命令描述字中包括的参数列表长度字段,确定该IO指令携带主请求的IO请求参数页,接收该主请求的IO请求参数页。
步骤311:根据该主请求的IO请求参数页的页码和子页码,确定该主请求的IO请求参数页中包括多个从请求,根据该主请求的IO请求参数页的长度,从该主请求的IO请求参数页中解析出该多个从请求,并对该主请求和从请求分别进行处理。
具体地,根据该主请求的IO请求参数页的页码和子页码,确定该主请求的IO请求参数页是携带从请求的参数页,根据该主请求的IO请求参数页的长度,从该主请求的IO请求参数页中解析出该多个从请求,并根据该主请求对应的LUN、该主请求的优先级和该主请求的命令描述字对该主请求进行处理,以及根据该多个从请求对应的LUN、该多个从请求的优先级和该多个从请求的命令描述字,分别对该多个从请求进行处理。
在本发明实施例中,当虚拟机发出的IO请求时,获取多个IO请求;将获取的多个IO请求划分为多个IO请求组,并为每个IO请求组选择一个主请求,将每个IO请求组中的从请求封装在该主请求的IO请求参数页中;将该主请求封装成一个IO指令并发送给存储系统,该IO指令携带该IO请求参数页。如此,避免了将每个LUN对应的IO请求封装成一个IO指令,减少了主机与存储系统之间的IO指令数,从而避免了为大量IO指令建立连接和断开连接,提高了存储系统的读写性能和吞吐量。
实施例四
参见图5,本发明实施例提供了一种处理输入输出请求的设备,该设备包括:
获取模块401,用于获取多个输入输出IO请求;
封装模块402,用于根据获取的多个IO请求的参数,将获取的多个IO请求封装成一个IO指令,该多个IO请求中的每一个IO请求的参数至少包括IO请求对应的LUN、IO请求的优先级和IO请求的命令描述字;
第一发送模块403,用于将该IO指令发送给存储系统,使该存储系统从该IO指令中解析出多个IO请求,并对解析的多个IO请求分别进行处理。
其中,封装模块402包括:
第一填充单元,用于将每个IO请求对应的LUN填充在该IO指令的LUN字段中;
第二填充单元,用于根据LUN字段中LUN对应的IO请求的顺序,将每个IO请求的优先级填充在该IO指令的优先级字段中;
第三填充单元,用于根据LUN字段中LUN对应的IO请求的顺序,将每个IO请求的命令描述字填充在该IO指令的命令描述字字段中;
第一封装单元,用于将LUN字段、优先级字段和命令描述字段封装成一个IO指令。
可选地,封装模块403包括:
第四填充单元,用于将每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,分别填充在每个IO请求对应的信息字段中,该信息字段包括LUN字段、优先级字段和命令描述字字段;
第二封装单元,用于将每个IO请求对应的信息字段封装成一个IO指令。
其中,该IO指令中还包括获取的多个IO请求的数量。
其中,封装模块403包括:
划分单元,用于将获取的多个IO请求划分为多个IO请求组;
选择单元,用于对于该多个IO请求组中的任一个IO请求组,为该IO请求组选择一个主请求;
第三封装单元,用于将该IO请求组中除主请求之外的其他IO请求确定为该IO请求组的从请求,并将从请求封装在该主请求的IO请求参数页中;
第四封装单元,用于根据主请求对应的LUN、主请求的优先级和主请求的命令描述字,将主请求封装成一个IO指令,该IO指令中携带该主请求的IO请求参数页。
其中,划分单元包括:
判断子单元,用于判断获取的多个IO请求中是否存在携带参数的IO请求;
第一划分子单元,用于如果存在,则根据携带参数的IO请求的数量,将获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求;
第二划分子单元,用于如果不存在,则将获取的多个IO请求划分为多个IO请求组。
其中,选择单元包括:
第一确定子单元,用于如果该IO请求组中包括携带参数的IO请求,则将携带参数的IO请求确定为该IO请求组的主请求;
选择子单元,用于如果该IO请求组中没有包括携带参数的IO请求,则从该IO请求组中随机选择一个IO请求,将选择的IO请求确定为IO请求组的主请求。
其中,第三封装单元包括:
第二确定子单元,用于将该IO请求组中除主请求之外的其他IO请求确定为该IO请求组的从请求;
填充子单元,用于将每个从请求对应的LUN、每个从请求的优先级和每个从请求的命令描述字分别填充在每个从请求对应的IO参数列表中;
设置子单元,用于为该主请求的IO请求参数页设置页码和子页码,将设置的页码、子页码和每个从请求对应的参数封装在该主请求的IO请求参数页中。
进一步地,封装模块403还包括:
修改单元,用于如果主请求的命令描述字中包括参数列表长度字段,则将该参数列表长度字段修改为该主请求的IO请求参数页的长度;
设置单元,用于如果主请求的命令描述字中不包括参数列表长度字段,则在主请求的命令描述字中增加参数列表长度字段,并设置参数列表长度字段为该主请求的IO请求参数页的长度。
在本发明实施例中,当虚拟机发出的IO请求时,获取多个IO请求;根据每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,将获取的多个IO请求封装成一个IO指令,避免了将每个LUN对应的IO请求封装成一个IO指令,减少了主机与存储系统之间的IO指令数,从而避免了为大量IO指令建立连接和断开连接,提高了存储系统的读写性能和吞吐量。
实施例五
参见图6,本发明实施例提供了一种处理输入输出请求的设备,该设备包括存储器501和处理器502,用于执行如下一种处理输入输出请求的方法,包括:
获取多个输入输出IO请求;
根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,所述多个IO请求中的每一个IO请求的的参数至少包括IO请求对应的LUN、IO请求的优先级和IO请求的命令描述字;
将所述IO指令发送给存储系统,使所述存储系统从所述IO指令中解析出所述多个IO请求,并对所述多个IO请求分别进行处理。
其中,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将每个IO请求对应的LUN填充在IO指令的LUN字段中;
根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的优先级填充在所述IO指令的优先级字段中;
根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的命令描述字填充在所述IO指令的命令描述字字段中;
将所述LUN字段、所述优先级字段和所述命令描述字段封装成一个IO指令。
可选地,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将每个IO请求对应的LUN、所述每个IO请求的优先级和所述每个IO请求的命令描述字,分别填充在所述每个IO请求对应的信息字段中,所述信息字段包括LUN字段、优先级字段和命令描述字字段;
将所述每个IO请求对应的信息字段封装成一个IO指令。
其中,所述IO指令中还包括所述获取的多个IO请求的数量。
其中,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将所述获取的多个IO请求划分为多个IO请求组;
对于所述多个IO请求组中的任一个IO请求组,为所述IO请求组选择一个主请求;
将所述IO请求组中除所述主请求之外的其他IO请求确定为所述IO请求组的从请求,并将所述从请求封装在所述主请求的IO请求参数页中;
根据所述主请求对应的LUN、所述主请求的优先级和所述主请求的命令描述字,将所述主请求封装成一个IO指令,所述IO指令中携带所述主请求的IO请求参数页。
其中,所述将所述获取的多个IO请求划分为多个IO请求组,包括:
判断获取的多个IO请求中是否存在携带参数的IO请求;
如果存在,则根据携带参数的IO请求的数量,将所述获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求;
如果不存在,则将所述获取的多个IO请求划分为多个IO请求组。
其中,所述为所述IO请求组选择一个主请求,包括:
如果所述IO请求组中包括携带参数的IO请求,则将携带参数的IO请求确定为所述IO请求组的主请求;
如果所述IO请求组中没有包括携带参数的IO请求,则从所述IO请求组中随机选择一个IO请求,将选择的IO请求确定为所述IO请求组的主请求。
其中,所述将所述从请求封装在所述主请求的IO请求参数页中,包括:
将每个从请求对应的LUN、所述每个从请求的优先级和所述每个从请求的命令描述字分别填充在所述每个从请求对应的IO参数列表中;
为所述主请求的IO请求参数页设置页码和子页码,将所述页码、所述子页码和所述每个从请求对应的IO参数列表封装在所述主请求的IO请求参数页中。
进一步地,所述根据所述主请求对应的LUN、所述主请求的优先级和所述主请求的命令描述字,将所述主请求封装成一个IO指令,所述IO指令中携带所述主请求的IO请求参数页之前,还包括:
如果所述主请求的命令描述字中包括参数列表长度字段,则将所述参数列表长度字段修改为所述主请求的IO请求参数页的长度;
如果所述主请求的命令描述字中不包括参数列表长度字段,则在所述主请求的命令描述字中增加参数列表长度字段,并设置所述参数列表长度字段为所述主请求的IO请求参数页的长度。
在本发明实施例中,当虚拟机发出的IO请求时,获取多个IO请求;根据每个IO请求对应的LUN、每个IO请求的优先级和每个IO请求的命令描述字,将获取的多个IO请求封装成一个IO指令,避免了将每个LUN对应的IO请求封装成一个IO指令,减少了主机与存储系统之间的IO指令数,从而避免了为大量IO指令建立连接和断开连接,提高了存储系统的读写性能和吞吐量。
本发明实施例中以虚拟机为应用场景进行描述,但是本发明公开的技术方案不仅仅限于虚拟机访问LUN时IO请求处理场景,对于物理服务器访问LUN的环境也适用本发明公开的技术方案;同时不仅仅限于一台虚拟机或服务器访问多个LUN或一个LUN时IO请求处理场景,也适用多台虚拟机或服务器访问多个LUN或一个LUN时IO请求处理场景。
需要说明的是:上述实施例提供的处理输入输出请求的设备在处理输入输出请求时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将设备的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的处理输入输出请求的设备与处理输入输出请求的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (19)
1.一种处理输入输出请求的方法,其特征在于,所述方法包括:
获取多个输入输出IO请求;
根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,所述多个IO请求中的每一个IO请求的参数至少包括IO请求对应的LUN、IO请求的优先级和IO请求的命令描述字;
将所述IO指令发送给存储系统,使所述存储系统从所述IO指令中解析出所述多个IO请求,并对所述多个IO请求分别进行处理。
2.如权利要求1所述的方法,其特征在于,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将每个IO请求对应的LUN填充在IO指令的LUN字段中;
根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的优先级填充在所述IO指令的优先级字段中;
根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的命令描述字填充在所述IO指令的命令描述字字段中;
将所述LUN字段、所述优先级字段和所述命令描述字段封装成一个IO指令。
3.如权利要求1所述的方法,其特征在于,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将每个IO请求对应的LUN、所述每个IO请求的优先级和所述每个IO请求的命令描述字,分别填充在所述每个IO请求对应的信息字段中,所述信息字段包括LUN字段、优先级字段和命令描述字字段;
将所述每个IO请求对应的信息字段封装成一个IO指令。
4.如权利要求1-3任一权利要求所述的方法,其特征在于,所述IO指令中还包括所述获取的多个IO请求的数量。
5.如权利要求1所述的方法,其特征在于,所述根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,包括:
将所述获取的多个IO请求划分为多个IO请求组;
对于所述多个IO请求组中的任一个IO请求组,为所述IO请求组选择一个主请求;
将所述IO请求组中除所述主请求之外的其他IO请求确定为所述IO请求组的从请求,并将所述从请求封装在所述主请求的IO请求参数页中;
根据所述主请求对应的LUN、所述主请求的优先级和所述主请求的命令描述字,将所述主请求封装成一个IO指令,所述IO指令中携带所述主请求的IO请求参数页。
6.如权利要求5所述的方法,其特征在于,将所述获取的多个IO请求划分为多个IO请求组,包括:
判断获取的多个IO请求中是否存在携带参数的IO请求;
如果存在,则根据携带参数的IO请求的数量,将所述获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求;
如果不存在,则将所述获取的多个IO请求划分为多个IO请求组。
7.如权利要求5或6所述的方法,其特征在于,所述为所述IO请求组选择一个主请求,包括:
如果所述IO请求组中包括携带参数的IO请求,则将携带参数的IO请求确定为所述IO请求组的主请求;
如果所述IO请求组中没有包括携带参数的IO请求,则从所述IO请求组中随机选择一个IO请求,将选择的IO请求确定为所述IO请求组的主请求。
8.如权利要求5所述的方法,其特征在于,所述将所述从请求封装在所述主请求的IO请求参数页中,包括:
将每个从请求对应的LUN、所述每个从请求的优先级和所述每个从请求的命令描述字分别填充在所述每个从请求对应的IO参数列表中;
为所述主请求的IO请求参数页设置页码和子页码,将所述页码、所述子页码和所述每个从请求对应的IO参数列表封装在所述主请求的IO请求参数页中。
9.如权利要求5所述的方法,其特征在于,所述根据所述主请求对应的LUN、所述主请求的优先级和所述主请求的命令描述字,将所述主请求封装成一个IO指令,所述IO指令中携带所述主请求的IO请求参数页之前,还包括:
如果所述主请求的命令描述字中包括参数列表长度字段,则将所述参数列表长度字段修改为所述主请求的IO请求参数页的长度;
如果所述主请求的命令描述字中不包括参数列表长度字段,则在所述主请求的命令描述字中增加参数列表长度字段,并设置所述参数列表长度字段为所述主请求的IO请求参数页的长度。
10.一种处理输入输出请求的设备,其特征在于,所述设备包括:
获取模块,用于获取多个输入输出IO请求;
封装模块,用于根据获取的多个IO请求的参数,将所述获取的多个IO请求封装成一个IO指令,所述多个IO请求中的每一个IO请求的参数至少包括IO请求对应的LUN、IO请求的优先级和IO请求的命令描述字;
第一发送模块,用于将所述IO指令发送给存储系统,使所述存储系统从所述IO指令中解析出所述多个IO请求,并对所述多个IO请求分别进行处理。
11.如权利要求10所述的设备,其特征在于,所述封装模块包括:
第一填充单元,用于将每个IO请求对应的LUN填充在IO指令的LUN字段中;
第二填充单元,用于根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的优先级填充在所述IO指令的优先级字段中;
第三填充单元,用于根据所述LUN字段中LUN对应的IO请求的顺序,将所述每个IO请求的命令描述字填充在所述IO指令的命令描述字字段中;
第一封装单元,用于将所述LUN字段、所述优先级字段和所述命令描述字段封装成一个IO指令。
12.如权利要求10所述的设备,其特征在于,所述封装模块包括:
第四填充单元,用于将每个IO请求对应的LUN、所述每个IO请求的优先级和所述每个IO请求的命令描述字,分别填充在所述每个IO请求对应的信息字段中,所述信息字段包括LUN字段、优先级字段和命令描述字字段;
第二封装单元,用于将所述每个IO请求对应的信息字段封装成一个IO指令。
13.如权利要求10-12任一权利要求所述的设备,其特征在于,所述IO指令中还包括所述获取的多个IO请求的数量。
14.如权利要求10所述的设备,其特征在于,所述封装模块包括:
划分单元,用于将所述获取的多个IO请求划分为多个IO请求组;
选择单元,用于对于所述多个IO请求组中的任一个IO请求组,为所述IO请求组选择一个主请求;
第三封装单元,用于将所述IO请求组中除所述主请求之外的其他IO请求确定为所述IO请求组的从请求,并将所述从请求封装在所述主请求的IO请求参数页中;
第四封装单元,用于根据所述主请求对应的LUN、所述主请求的优先级和所述主请求的命令描述字,将所述主请求封装成一个IO指令,所述IO指令中携带所述主请求的IO请求参数页。
15.如权利要求14所述的设备,其特征在于,所述划分单元包括:
判断子单元,用于判断获取的多个IO请求中是否存在携带参数的IO请求;
第一划分子单元,用于如果存在,则根据携带参数的IO请求的数量,将所述获取的多个IO请求划分为多个IO请求组,使每个IO请求组中最多包括一个携带参数的IO请求;
第二划分子单元,用于如果不存在,则将所述获取的多个IO请求划分为多个IO请求组。
16.如权利要求14或15所述的设备,其特征在于,所述选择单元包括:
第一确定子单元,用于如果所述IO请求组中包括携带参数的IO请求,则将携带参数的IO请求确定为所述IO请求组的主请求;
选择子单元,用于如果所述IO请求组中没有包括携带参数的IO请求,则从所述IO请求组中随机选择一个IO请求,将选择的IO请求确定为所述IO请求组的主请求。
17.如权利要求14所述的设备,其特征在于,所述第三封装单元包括:
第二确定子单元,用于将所述IO请求组中除所述主请求之外的其他IO请求确定为所述IO请求组的从请求;
填充子单元,用于将每个从请求对应的LUN、所述每个从请求的优先级和所述每个从请求的命令描述字分别填充在所述每个从请求对应的IO参数列表中;
设置子单元,用于为所述主请求的IO请求参数页设置页码和子页码,将所述页码、所述子页码和所述每个从请求对应的IO参数列表封装在所述主请求的IO请求参数页中。
18.如权利要求14所述的设备,其特征在于,所述封装模块还包括:
修改单元,用于如果所述主请求的命令描述字中包括参数列表长度字段,则将所述参数列表长度字段修改为所述主请求的IO请求参数页的长度;
设置单元,用于如果所述主请求的命令描述字中不包括参数列表长度字段,则在所述主请求的命令描述字中增加参数列表长度字段,并设置所述参数列表长度字段为所述主请求的IO请求参数页的长度。
19.一种处理输入输出请求的设备,其特征在于,所述设备包括存储器和处理器,用于执行如权利要求1-9所述一种处理输入输出请求的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310535656.9A CN104598409B (zh) | 2013-10-31 | 2013-10-31 | 一种处理输入输出请求的方法及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310535656.9A CN104598409B (zh) | 2013-10-31 | 2013-10-31 | 一种处理输入输出请求的方法及设备 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104598409A true CN104598409A (zh) | 2015-05-06 |
CN104598409B CN104598409B (zh) | 2017-09-19 |
Family
ID=53124214
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310535656.9A Active CN104598409B (zh) | 2013-10-31 | 2013-10-31 | 一种处理输入输出请求的方法及设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104598409B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107688435A (zh) * | 2016-08-04 | 2018-02-13 | 北京忆恒创源科技有限公司 | Io流调节方法与装置 |
CN108241585A (zh) * | 2016-12-23 | 2018-07-03 | 北京忆芯科技有限公司 | 大容量nvm接口控制器 |
CN108241468A (zh) * | 2016-12-23 | 2018-07-03 | 北京忆芯科技有限公司 | Io命令处理方法与固态存储设备 |
CN108491168A (zh) * | 2018-03-30 | 2018-09-04 | 北京联想核芯科技有限公司 | 一种读、写命令流的处理方法及固态硬盘 |
CN109117284A (zh) * | 2018-07-20 | 2019-01-01 | 深圳乐信软件技术有限公司 | 请求信息的处理方法、装置、设备及存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101299181A (zh) * | 2008-07-08 | 2008-11-05 | 杭州华三通信技术有限公司 | 基于磁盘进行i/o请求缓存的方法和装置以及san存储设备 |
CN101639763A (zh) * | 2009-08-27 | 2010-02-03 | 中兴通讯股份有限公司 | 一种io调度方法及调度装置 |
US20110246171A1 (en) * | 2010-03-31 | 2011-10-06 | Microsoft Corporation | Virtual Machine Fast Emulation Assist |
CN102402401A (zh) * | 2011-12-13 | 2012-04-04 | 云海创想信息技术(无锡)有限公司 | 一种磁盘io请求队列调度的方法 |
CN103250143A (zh) * | 2012-12-28 | 2013-08-14 | 华为技术有限公司 | 数据存储方法和存储设备 |
-
2013
- 2013-10-31 CN CN201310535656.9A patent/CN104598409B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101299181A (zh) * | 2008-07-08 | 2008-11-05 | 杭州华三通信技术有限公司 | 基于磁盘进行i/o请求缓存的方法和装置以及san存储设备 |
CN101639763A (zh) * | 2009-08-27 | 2010-02-03 | 中兴通讯股份有限公司 | 一种io调度方法及调度装置 |
US20110246171A1 (en) * | 2010-03-31 | 2011-10-06 | Microsoft Corporation | Virtual Machine Fast Emulation Assist |
CN102402401A (zh) * | 2011-12-13 | 2012-04-04 | 云海创想信息技术(无锡)有限公司 | 一种磁盘io请求队列调度的方法 |
CN103250143A (zh) * | 2012-12-28 | 2013-08-14 | 华为技术有限公司 | 数据存储方法和存储设备 |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107688435A (zh) * | 2016-08-04 | 2018-02-13 | 北京忆恒创源科技有限公司 | Io流调节方法与装置 |
CN107688435B (zh) * | 2016-08-04 | 2022-06-03 | 北京忆恒创源科技股份有限公司 | Io流调节方法与装置 |
CN108241585A (zh) * | 2016-12-23 | 2018-07-03 | 北京忆芯科技有限公司 | 大容量nvm接口控制器 |
CN108241468A (zh) * | 2016-12-23 | 2018-07-03 | 北京忆芯科技有限公司 | Io命令处理方法与固态存储设备 |
CN108241468B (zh) * | 2016-12-23 | 2021-12-07 | 北京忆芯科技有限公司 | Io命令处理方法与固态存储设备 |
CN108241585B (zh) * | 2016-12-23 | 2023-08-22 | 北京忆芯科技有限公司 | 大容量nvm接口控制器 |
CN108491168A (zh) * | 2018-03-30 | 2018-09-04 | 北京联想核芯科技有限公司 | 一种读、写命令流的处理方法及固态硬盘 |
CN109117284A (zh) * | 2018-07-20 | 2019-01-01 | 深圳乐信软件技术有限公司 | 请求信息的处理方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN104598409B (zh) | 2017-09-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104598409A (zh) | 一种处理输入输出请求的方法及设备 | |
CN103176833A (zh) | 一种基于虚拟机的数据发送方法、接收方法及系统 | |
KR102646619B1 (ko) | 컴포지트 메모리 장치를 포함하는 전자 장치에 파일 시스템을 제공하는 시스템 및 방법 | |
CN110941395B (zh) | 动态随机存取存储器、内存管理方法、系统及存储介质 | |
CN104731569A (zh) | 一种数据处理方法及相关设备 | |
CN111031011A (zh) | Tcp/ip加速器的交互方法和装置 | |
CN114237714A (zh) | 命令包生成方法、装置、电子设备和存储介质 | |
CN108628760A (zh) | 原子写命令的方法与装置 | |
CN104866297A (zh) | 一种优化核函数的方法和装置 | |
US20150278299A1 (en) | External merge sort method and device, and distributed processing device for external merge sort | |
CN116662019B (zh) | 请求的分配方法、装置、存储介质及电子装置 | |
CN112433812A (zh) | 一种虚拟机跨集群迁移方法、系统、设备及计算机介质 | |
CN103049546A (zh) | 一种管理、访问系统日志的方法和装置 | |
CN116340198B (zh) | 固态硬盘的数据写入方法、其装置及固态硬盘 | |
CN108628761A (zh) | 原子命令执行方法与装置 | |
CN103246611B (zh) | 一种文件处理方法及系统 | |
US20160232166A1 (en) | Method and Apparatus for Accessing File | |
US11016685B2 (en) | Method and defragmentation module for defragmenting resources | |
CN103077069B (zh) | 指令解析的方法及装置 | |
CN112631955A (zh) | 数据处理方法、装置、电子设备以及介质 | |
CN105739919A (zh) | 资料存取系统及方法 | |
CN112732176B (zh) | 基于fpga的ssd访问方法及装置、存储系统及存储介质 | |
CN113076178B (zh) | 报文存储方法、装置及设备 | |
CN116501266B (zh) | 消息上下文处理方法、装置、计算机设备和存储介质 | |
CN105183390A (zh) | 数据访问方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |