一种在物理主机中处理读/写请求的方法和装置与流程

文档序号:11949344阅读:337来源:国知局
一种在物理主机中处理读/写请求的方法和装置与流程

技术领域

本发明涉及计算机领域,尤其涉及一种在物理主机中处理读/写请求以及一种虚拟化的的方法和装置。



背景技术:

虚拟化包括计算虚拟化,网络虚拟化和存储虚拟化,其中存储虚拟化用于为虚拟机提供存储服务。存储服务的性能主要取决于存储介质的访问速度和存储软件栈的开销。随着近年来存储硬件的发展,ssd(Solid State Drives,固态硬盘)、nvme(Non-Volatile Menory Express非易失性内存扩展)、flash(Flash EEPROM Memory,闪存)等高速存储介质开始逐步登上存储舞台,存储介质的访问速度由机械磁盘的ms级,加快到ns级别,这对存储软件栈也带来了很大的挑战。

传统的存储软件栈采用中断返回方式和系统调用入口为用户态应用程序提供存储服务。传统物理机的存储软件栈由文件系统、通用块层、I/O(Input/Output,输入/输出)调度层、scsi(Small Computer System Interface小型计算机系统接口)层等构成。文件系统为用户提供了便捷的存储管理接口;通用块层为各种物理存储介质提供了通用的I/O处理方式,包括同步、异步、中断处理等方法;I/O调度层对I/O指令进行排序合并,以软件计算为代价优化机械磁盘寻址时间,后期又发展出QoS(Quality of Service,服务质量)等相关的调度功能;scsi层分为scsi上中下三层,通过提供scsi协议、提供统一的接口等方式,使得物理机能够方便地使用不同类型的存储硬件。

而在虚拟化场景下,除了操作系统自身的存储软件栈外,还有虚拟化的存储软件栈。虚拟化的存储软件栈主要包含前端驱动、后端存储服务进程、以及VMM(virtual machine monitor,虚拟机器监视器)前端驱动和后端存储服务进程间通过虚拟化技术进行交互以传递I/O请求,hypervisor为其提供内存管理、中断注入、陷入陷出、通知唤醒等基础能力。以KVM为例,虚拟化下的存储IO流程如图2a所示。对于一个IO请求来说,首先从虚拟机内部的APP通过系统调用下发给虚拟机的内核,经过虚拟机的存储软件栈,最终放入虚拟磁盘的设备队列(例如virtio的IO环等)中,然后通过写特定端口触发vm exit,由hypervisor层(例如图2a中的KVM模块)截获,最终通过唤醒qemu,将请求交给qemu进程处理。qemu被唤醒后,再次通过系统调用,下发给主机侧的存储软件栈,经过主机侧存储软件栈处理后最终交给物理存储设备的设备队列,并通过写入寄存器通知物理存储设备处理IO请求。当物理存储设备处理完成后,通过中断注入的方式,通知主机侧软件栈IO完成事件,最终唤醒用户态qemu的aio监听句柄,由qemu将处理完成的结果,再通过虚拟存储设备的完成队列(例如virtio的IO环等),通过KVM,向虚拟机注入中断,最终虚拟机OS处理中断,并最终返回给用户态APP。

由上可以看出,存储虚拟化场景下,存储软件栈的处理过程比较复杂,使得处理读/写请求时耗时大,影响存储性能。尤其是随着存储介质的访问速度不断提升,存储软件栈的开销越来越明显,存储软件栈在整个I/O时延上的占比,在SSD下已经占19.3%,而更高速的DDR NVM介质下存储软件栈的消耗占比已经达到94.1%,严重影响了存储介质的访问速度,也导存储软件栈成为了存储性能提升的瓶颈。



技术实现要素:

本发明提供一种在物理主机中处理读/写请求的方法和装置,能够提高虚拟化存储场景下处理读/写请求的速度,减少I/O时延。

第一方面,本发明实施例提供了一种在物理主机中,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,其特征在于,所述方法包括:所述HOST通过访问与所述虚拟存储设备中至少一个虚拟存储设备虚拟存储设备对应的虚拟内存空间,轮询所述至少一个虚拟存储设备的一个或多个指令发送队列,以便从所述一个或多个指令发送队列中获取多个第一读/写请求,所述虚拟内存空间是所述HOST采用内存映射I/O(mmio)的方式模拟出的,所述第一读/写请求来自所述虚拟机上运行的应用,每个所述第一读/写请求包括目标虚拟存储设备的信息;所述HOST对所述多个第一读/写请求中的每一个执行第一转发操作,所述第一转发操作包括:所述HOST根据所述第一读/写请求包括的目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,生成与所述第一读/写请求对应的第二读/写请求,所述第二读/写请求包括所述目标物理存储设备的信息;所述HOST根据所述目标物理存储设备的信息,将所述第二读/写请求加入所述目标物理存储设备的指令发送队列,以便所述目标物理存储设备从所述指令发送队列中获取所述第二读/写请求,以及根据所述第二读/写请求执行读/写操作。

这样,HOST可以主动轮询虚拟存储设备的指令发送队列,获得应用下发的第一读/写请求,并经过处理后将其转发至目标物理存储设备的指令发送队列,而非现有技术的通过虚拟机陷出来唤醒HOST的qemu进程通过软件栈来处理读/写请求,该轮询过程无需虚拟机的陷出和陷入。具体的,采用mmio形式访问虚拟存储设备对应的虚拟内存空间从而避免了虚拟机的陷出。用一个读/写请求处理进程替代了qemu进程,该进程采用轮询的方式获取读/写请求,简化了HOST处理读/写请求的过程,提高了软件处理读/写请求的速度,降低了软件处理读/写请求的时延。

结合第一方面,在第一方面的第一种实现方式中,所述HOST根据所述第一读/写请求包括的目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,生成与所述第一读/写请求对应的第二读/写请求,包括:所述HOST根据所述第一读/写请求包括的目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,确定所述目标物理存储设备的信息;所述HOST生成与所述第一读/写请求对应的第二读/写请求,所述第二读/写请求包括所述目标物理存储设备的信息,所述第二读/写请求的格式与所述目标物理存储设备匹配。

需要说明的是,所述第二读/写请求的格式与所述目标物理存储设备匹配,表示第二读/写请求的格式与对应的目标物理存储设备的种类相同,也就是说,第二读/写请求遵从的存储协议与目标物理存储设备使用的存储协议相同。

具体的,可以是,所述HOST根据所述第一读/写请求包括的目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,确定与所述第一读/写请求对应的第二读/写请求,包括:所述HOST解析所述第一读/写请求,以得到具有统一格式的读/写请求内容,该具有统一格式的读/写请求内容包括所述目标虚拟存储设备的信息;根据所述目标虚拟存储设备的信息与所述目标物理存储设备的信息之间的映射关系,将该具有统一格式的读/写请求内容变更为包括所述目标物理存储设备的信息;使用与目标物理存储设备相应的存储协议与封装变更后的读/写请求内容,以得到所述第二读/写请求。

具体的,上述解析和封装使用存储协议。解析过程和封装过程可使用不同的存储协议。解析过程使用的封装协议是根据目标虚拟存储设备的信息确定的,和封装过程使用的封装协议是根据目标物理存储设备的信息确定的。

由此,使得HOST可以统一分析读/写请求的内容,不论第一读/写请求和第二读/写请求遵循何种存储协议,都可以进行集中处理,也方便对不同存储协议的虚拟存储设备,读/写请求处理进程都可以获取其第一读/写请求进行处理而不用分辨不同虚拟存储设备的存储协议。

结合第一方面和第一方面的第一种实现方式,在第一方面的第二种实现方式中,述方法还包括:所述HOST通过所述轮询从所述一个或多个指令发送队列中得到第三读/写请求,所述第三读/写请求包括待读/写数据的长度和待读/写的虚拟存储设备的信息,所述待读/写的虚拟存储设备包括待读/写的目标虚拟块设备,所述待读/写数据的长度大于等于所述待读/写的目标虚拟块设备的可读/写地址范围;所述HOST生成所述第三读写请求的响应;所述HOST将所述第三读/写请求的响应加入所述待读/写的虚拟存储设备的指令响应队列,所述第三读/写请求的响应表示所述第三读/写请求的读/写操作执行失败。

由此,在所述待读/写数据的长度大于等于所述待读/写的目标虚拟块设备的可读/写地址范围情况下,HOST生成响应以及将响应加目标虚拟存储设备的响应队列,可以检查读/写请求的有效性,过滤出越界的读/写请求,将无法执行读/写操作的读/写请求进行拦截而无需再涉及第二读/写请求和目标物理存储设备,节省了资源,也加快了越界的读/写请求的响应的速度。

结合第一方面和第一方面的第一种实现方式,在第一方面的第三种实现方式中,所述方法还包括:所述HOST轮询所述物理存储设备中至少一个物理存储设备的一个或多个指令响应队列,以便从所述一个或多个指令响应队列中获取多个第二读/写响应,其中,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,所述第二读/写响应表示所述目标物理存储设备已执行所述读/写操作,所述第二读/写响应包括所述目标物理存储设备的信息;所述HOST对所述多个第二读/写响应中的每一个执行第二转发操作,所述第二转发操作包括:所述HOST根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,生成与所述第二读/写响应对应的第一读/写响应,所述第一读/写响应包括所述目标虚拟存储设备的信息;所述HOST根据所述目标虚拟存储设备的信息,将所述第一读/写响应加入所述目标虚拟存储设备的指令响应队列,以便所述应用得到所述第一读/写响应。

至此,HOST将第一读/写请求的第一读/写响应加入目标虚拟存储设备的指令响应队列,形成了一个完整的根据请求返回响应的处理过程,同样采用轮询的方式从物理存储设备的指令响应队列中获取第二读/写响应,过程与第一方面描述相对应,其效果也参见对第一方面的效果描述。

结合第一方面的第三种实现方式,在第一方面的第四种实现方式中,所述HOST根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,生成与所述第二读/写响应对应的第一读/写响应,包括:所述HOST根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,确定所述目标虚拟存储设备的信息;所述HOST生成与所述第二读/写响应对应的第一读/写响应,所述第一读/写响应包括所述目标虚拟存储设备的信息,所述第一读/写响应的格式与所述目标虚拟存储设备匹配。

第一方面的第四种实现方式与第一方面的第一种实现方式的技术手段相应,其具体说明和效果也请参见对第一方面的第一种实现方式效果描述。

基于上述技术方案,通过进程轮询虚拟存储设备的指令发送队列,简化了HOST处理读/写请求的过程,提高了软件处理读/写请求的速度,降低了软件处理读/写请求的时延。

第二方面,本发明实施例提供一种处理读/写请求的装置,所述装置运行于物理主机,所述装置运行于物理主机,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,其特征在于,所述装置包括:请求获取模块,用于通过访问与所述虚拟存储设备中至少一个虚拟存储设备虚拟存储设备对应的虚拟内存空间,轮询所述至少一个虚拟存储设备的一个或多个指令发送队列,以便从所述一个或多个指令发送队列中获取多个第一读/写请求,所述虚拟内存空间是所述HOST采用内存映射I/O(mmio)的方式模拟出的,所述第一读/写请求来自所述虚拟机上运行的应用,每个所述第一读/写请求包括目标虚拟存储设备的信息;请求转发模块,用于对所述多个第一读/写请求中的每一个执行第一转发操作,所述第一转发操作包括:根据所述目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,生成与所述第一读/写请求对应的第二读/写请求,所述第二读/写请求包括所述目标物理存储设备的信息;根据所述目标物理存储设备的信息,将所述第二读/写请求加入所述目标物理存储设备的指令发送队列,以便所述目标物理存储设备从所述指令发送队列中获取所述第二读/写请求,以及根据所述第二读/写请求执行读/写操作。

这样,该装置可以主动轮询虚拟存储设备的指令发送队列,获得应用下发的第一读/写请求,并经过处理后将其转发至目标物理存储设备的指令发送队列,而非现有技术的通过虚拟机陷出来唤醒HOST的qemu进程通过软件栈来处理读/写请求,该轮询过程无需虚拟机的陷出和陷入,具体的,采用mmio形式访问虚拟存储设备对应的虚拟内存空间从而避免了虚拟机的陷出,用一个独立的进程替代了qemu进程,该进程采用轮询的方式获取读/写请求,简化了HOST处理读/写请求的过程,提高了软件处理读/写请求的速度,降低了软件处理读/写请求的时延。

第二方面是与第一方面的方法相对应的装置,其各种实现方式及技术效果参照第一方面的各种实现方式。

第三方面,本发明实施例提供一种物理主机,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,所述HOST用于执行第一方面及第一方面任一实现方式的方法。

第四方面,本发明实施例提供在物理主机中处理读/写响应的方法,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,所述方法包括:所述HOST轮询所述物理存储设备中至少一个物理存储设备的一个或多个指令响应队列,以便从所述一个或多个指令响应队列中获取多个第一读/写响应,其中,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,所述第一读/写响应表示所述目标物理存储设备已执行所述读/写操作,所述第一读/写响应包括所述目标物理存储设备的信息;所述HOST对所述多个第一读/写响应中的每一个执行转发操作,所述转发操作包括:所述HOST根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,生成与所述第一读/写响应对应的第二读/写响应,所述第二读/写响应包括所述目标虚拟存储设备的信息;所述HOST根据所述目标虚拟存储设备的信息,将所述第二读/写响应加入所述目标虚拟存储设备的指令响应队列,以便所述应用得到所述第二读/写响应。

这样,HOST可以主动轮询物理存储设备的指令响应队列,获得应用下发的第一读/写响应,并经过处理后将其转发至目标虚拟存储设备的指令响应队列,而非现有技术的通过物理存储设备的中断来通知HOST处理读/写响应,具体的,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,用一个读/写响应处理进程替代了qemu进程,该进程采用轮询的方式获取读/写响应,简化了HOST处理读/写响应的过程,提高了软件处理读/写响应的速度,降低了软件处理读/写响应的时延。

结合第四方面,在第四方面的第一种实现方式中,所述方法包括:所述HOST根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,确定所述目标虚拟存储设备的信息;所述HOST生成与所述第一读/写响应对应的第二读/写响应,所述第二读/写响应包括所述目标虚拟存储设备的信息,所述第二读/写响应的格式与所述目标虚拟存储设备匹配。

由于该实现方式与第一方面的第一种实现方式类似,关于该实现方式的说明和技术效果的阐述,可以参见第一方面的第一种实现方式。

第五方法,本发明实施例提供一种处理读/写响应的装置,,所述装置运行于物理主机,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,所述装置包括:响应获取模块,用于轮询所述物理存储设备中至少一个物理存储设备的一个或多个指令响应队列,以便从所述一个或多个指令响应队列中获取多个第一读/写响应,其中,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,所述第一读/写响应表示所述目标物理存储设备已执行所述读/写操作,所述第一读/写响应包括所述目标物理存储设备的信息;响应转发模块,用于对所述多个第一读/写响应中的每一个执行转发操作,所述转发操作包括:根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,生成与所述第一读/写响应对应的第二读/写响应,所述第二读/写响应包括所述目标虚拟存储设备的信息;根据所述目标虚拟存储设备的信息,将所述第二读/写响应加入所述目标虚拟存储设备的指令响应队列,以便所述应用得到所述第二读/写响应。

第五方面是与第四方面的方法相对应的装置,其各种实现方式及技术效果参照第四方面的各种实现方式。

第六方面,本发明实施例提供一种在物理主机中处理读/写请求的方法,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,所述物理存储设备中的至少一个物理存储设备一一对应地虚拟出所述虚拟存储设备,每个所述虚拟存储设备与该虚拟存储设备对应的物理存储设备的信息相同,所述方法包括:所述HOST通过访问与所述虚拟存储设备中至少一个虚拟存储设备虚拟存储设备对应的虚拟内存空间,轮询所述至少一个虚拟存储设备的一个或多个指令发送队列,以便从所述一个或多个指令发送队列中获取多条读/写请求,所述虚拟内存空间是所述HOST采用内存映射I/O(mmio)的方式模拟出的,所述读/写请求来自所述虚拟机上运行的应用,所述读/写请求包括目标物理存储设备的信息;所述HOST对所述多条读/写请求中的每一条执行第一转发操作,所述第一转发操作包括:所述HOST根据所目标物理存储设备的信息,将所述读/写请求加入所述目标物理存储设备的指令发送队列,以便所述目标存储设备从所述指令发送队列中获取所述读/写请求,以及根据所述读/写请求执行读/写操作。

第六方面是与第一方面相应的一种方法,应用于另一种场景,即所述物理存储设备中的至少一个物理存储设备一一对应地虚拟出所述虚拟存储设备,每个所述虚拟存储设备与该虚拟存储设备对应的物理存储设备的信息相同,这种情况下HOST直接对上述读/写请求进行转发,其技术效果见第一方面。

结合第六方面,在第七方面的第一种实现方式下,该方法还包括相应的返回读/写响应的过程,这种情况下HOST直接对读/写响应进行转发,该过程请参阅第七方面。

第七方面,本发明实施例提供一种在物理主机中处理读/写响应的方法,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,其特征在于,所述物理存储设备中的至少一个物理存储设备一一对应地虚拟出所述虚拟存储设备,每个所述虚拟存储设备与该虚拟存储设备对应的物理存储设备的信息相同,所述方法包括:所述HOST轮询所述至少一个物理存储设备的一个或多个指令响应队列,以便从所述一个或多个指令响应队列中获取多个读/写响应,其中,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,所述读/写响应表示所述目标物理存储设备已执行所述读/写操作,所述读/写响应包括所述目标物理存储设备的信息;所述HOST对所述多个读/写响应中的每一个执行第二转发操作,所述第二转发操作包括:所述HOST根据所述目标物理存储设备的信息,将所述读/写响应加入目标虚拟存储设备的指令响应队列,以便所述应用得到所述读/写响应。

第七方面是与第四方面相应的一种方法,应用于另一种场景,即所述物理存储设备中的至少一个物理存储设备一一对应地虚拟出所述虚拟存储设备,每个所述虚拟存储设备与该虚拟存储设备对应的物理存储设备的信息相同,这种情况下HOST直接对上述读/写响应进行转发,其技术效果见第四方面。

第八方面,本发明实施例提供一种处理读/写请求的装置,其各种实现方式及技术效果参照第六方面的各种实现方式,以及一种处理读/写响应的装置,其各种实现方式及技术效果参照第七方面的各种实现方式。

第九方面,本发明实施例提供一种物理主机,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,所述HOST用于执行第六方面、第六方面第一种实现方式和第七方面的方法中的至少一种。

第十方面,本发明实施例提供一种存储介质,该存储介质用于保存第一方面及第一方面任一实现方式的方法。以及,本发明实施例提供一种应用程序,该应用程序用于执行第一方面及第一方面任一实现方式的方法。

第十一方面,本发明实施例提供一种存储介质,该存储介质用于保存第四方面及第四方面任一实现方式的方法。以及,本发明实施例提供一种应用程序,该应用程序用于执行第四方面及第四方面任一实现方式的方法。

第十二方面,本发明实施例提供一种存储介质,该存储介质用于保存第六方面、第六方面第一种实现方式和第七方面的方法中的至少一种。以及,本发明实施例提供一种应用程序,该应用程序用于执行第六方面、第六方面第一种实现方式和第七方面的方法中的至少一种。

在上述方面中,读/写请求表示读请求或者写请求。第一读/写请求到第四读/写请求均表示一条读请求,或者均表示一条写请求。读/写响应表示读请求的读响应或者写请求的写响应。第一读/写响应到第四读/写响应均表示一条读请求的读响应,或者均表示一条写请求的写响应。

在上述方面,目标虚拟存储设备的信息包括目标虚拟存储设备的标识和地址,目标物理存储设备的信息包括目标物理存储设备的标识和地址。

HOST中保存有虚拟存储设备的信息和物理存储设备的信息的映射关系,可以是映射表。虚拟存储设备的信息包括虚拟存储设备的标识和地址,物理存储设备的信息包括物理存储设备的标识和地址。

在上述方面,虚拟存储设备对应的虚拟内存空间,是HOST模拟出的分配给虚拟存储设备使用的虚拟内存空间。该虚拟内存空间服务于虚拟机。在该虚拟内存空间中,保存有虚拟存储设备的指令发送队列和指令响应队列的部分信息,HOST通过访问这些信息来读取指令发送队列和指令响应队列中的请求或者响应,如用于队列中记录指令个数的index。

在上述方面,所述HOST可以通过虚拟机控制结构(vmcs)关闭所述虚拟机的CPU的中断,以便所述CPU持续向所述一个或多个指令发送队列下发多条读/写请求。

其中,持续表示下发所述多条读/写请求的过程中,CPU不被其他任务中断所述下发所述多条读/写请求的过程。这样可以保证读/写请求的下发效率较高,避免中断的打扰。

上述记叙方法的方面中,方法是HOST使用一个读/写请求处理进程完成的,该读/写请求处理进程用于进行以下操作的至少一种:处理虚拟机下发的读/写请求以及在物理存储设备执行读/写操作后返回响应给虚拟机。进一步的,HOST中可以有多个读/写请求处理进程使用上述方法。例如,读/写请求数量较多的情况下。进一步的,用一个独立的读/写请求处理进程替代了qemu进程处理多个虚拟存储设备的情况下,也能避免原方法中qemu进程中各线程间的锁竞争。

在上述记叙方法的方面中,HOST通过轮询不断地执行以下操作中的至少一种:从指令发送队列获取多条读/写请求以及从指令响应队列获取多条读/写响应。具体的,这种轮询取请求和/或响应(和/或,表示“和”或者“或”),并对取出的多条请求和/或响应进行处理,可以有两种方式,通过轮询的方式,取一条请求或响应,对其进行处理,处理完后再取下一条请求或响应,如此循环。或者,通过轮询的方式,取出多条请求或响应,再进行处理。对于一个读/写请求处理进程,可以一条一条处理,对于多个读/写请求处理进程,可以多条并行处理。

在上述记叙方法的方面中,该用于轮询的进程可以是一个或多个。在拥有多个该进程的情况下,可以并行处理多个读/写请求或响应,解决了I/O软件栈中锁资源等共享资源的竞争问题。

在上述方面,所述HOST通过PCI(peripheral component connect,外部部件互联标准)总线扫描所述物理存储设备的标识,在PCI驱动的列表中保存有所述物理存储设备的标识的情况下,通过所述PCI驱动的加载函数加载所述物理存储设备到所述HOST。这样可以使遵循各种存储协议的物理存储设备都被统一的驱动管理,避免不同存储协议的物理存储设备使用不同的驱动导致进程的轮询无法获取需要处理的读/写请求或者读/写响应。

在上述方面,物理机中可以部署一台或多台虚拟机,物理机中可以包括一个或多个物理存储设备,一台虚拟机可以调用一个或多个虚拟存储设备,一个物理存储生可虚拟出一个或多个虚拟存储设备。

以及,本发明实施例提供了一种虚拟化方法,以解决Qemu进程对虚拟NVMe设备采用传统I/O流程进行模拟,影响虚拟机内应用程序对虚拟NVMe设备访问速度的问题。

第十三方面,本发明实施例提供了一种虚拟化方法,其特征在于,该方法由物理机Host执行,Host包括虚拟机和数据平面转发进程,数据平面转发进程包括虚拟非易失性内存扩展NVMe驱动,虚拟机包括虚拟NVMe设备,该方法包括:转发进程轮询虚拟NVMe设备的门铃(doorbell)区域;当doorbell区域发生变化时,转发进程调用虚拟NVMe驱动,从doorbell区域发生变化的发送队列中,获取虚拟机下发的NVMe命令,NVMe命令包括读/写请求;转发进程调用虚拟NVMe驱动,解析NVMe命令,得到通用读/写请求;转发进程获取物理存储设备对通用读/写请求的处理结果;转发进程调用虚拟NVMe驱动,将物理存储设备的处理结果封装为NVMe响应;转发进程调用虚拟NVMe驱动,将NVMe响应添加到与发送队列对应的完成队列中。

因此,本发明实施例的虚拟化方法,通过独立的转发进程完成虚拟NVMe设备的读/写操作,并且该转发进程使用轮询的方式替代原有的定时器方式,能够避免Qemu锁竞争,并且能够解决时延长的问题,从而实现了高性能低时延的NVMe虚拟化,提高了虚拟机内应用程序对虚拟NVMe设备的访问速度。

结合第十三方面,在第十三方面的第一种可能的实现方式中,所述Host还包括基于内核的虚拟机管理程序(Kernel-based Virtual Machine,简称“KVM”)模块,在该转发进程调用虚拟NVMe驱动,将NVMe响应添加到与发送队列对应的完成队列中之后,转发进程调用虚拟NVMe驱动,通过eventfd向KVM模块发送中断请求;KVM模块根据中断请求向虚拟机注入中断;虚拟机从完成队列中,获取NVMe响应。

结合第十三方面或第十三方面的第一种可能的实现方式,在第九方面的第二种可能的实现方式中,该Host还包括Qemu进程,该Qemu进程包括适配驱动,在转发进程轮询虚拟NVMe设备的doorbell区域之前,转发进程调用虚拟NVMe驱动,根据用户请求创建虚拟NVMe设备;转发进程调用虚拟NVMe驱动,分配Qemu进程与转发进程的共享内存空间,该共享内存包括doorbell区域;Qemu进程调用适配驱动,将该共享内存空间映射到虚拟NVMe设备的第一段基址寄存器(Base Address Register,简称“BAR”)空间;Qemu进程调用适配驱动,将基于消息通知的多路中断机制(Message Signaled Interrupt X,简称“MSIX”)表空间映射到虚拟NVMe设备的第二段BAR空间;Qemu进程调用适配驱动注册回调函数。

因此,本发明实施例的虚拟化方法,在独立的转发进程完成虚拟NVMe设备的读/写操作之前,Qemu进程调用适配驱动,并且转发进程调用虚拟NVMe驱动,共同创建该虚拟NVMe设备,从而使后续的读/写操作有较高的存储性能。

结合第十三方面的第二种可能的实现方式,在第九方面的第三种可能的实现方式中,在该转发进程调用虚拟NVMe驱动,分配Qemu进程与转发进程的共享内存空间之前,转发进程调用虚拟NVMe驱动,根据用户请求创建虚拟NVMe设备的命名空间(namespace);转发进程调用虚拟NVMe驱动,初始化虚拟NVMe设备的namespace信息,以便于虚拟机读取虚拟NVMe设备的namespace信息;转发进程调用虚拟NVMe驱动,根据用户请求将虚拟NVMe设备的名称作为参数配置,挂载给虚拟机。

结合第十三方面的第二种或第三种可能的实现方式,在第九方面的第四种可能的实现方式中,在该Qemu进程调用适配驱动注册回调函数之后,转发进程轮询虚拟NVMe设备的doorbell区域;当doorbell区域的0号命令队列中包括创建完成队列的请求时,转发进程调用虚拟NVMe驱动,从0号命令队列中获取虚拟机下发的NVMe命令;转发进程调用虚拟NVMe驱动解析NVMe命令;转发进程调用虚拟NVMe驱动,通过解析NVMe命令,获取创建完成队列的参数,参数包括完成队列对应的MSIX表中的中断号、完成队列直接内存访问(Direct Memory Access,简称“DMA”)地址、完成队列ID、完成队列深度;转发进程调用虚拟NVMe驱动,根据参数创建完成队列。

结合第十三方面的第四种可能的实现方式,在第九方面的第五种可能的实现方式中,在根据该参数创建完成队列之后,当虚拟机访问MSIX表空间时,Qemu进程调用适配驱动通过回调函数创建eventfd;Qemu进程调用适配驱动,向KVM模块建立eventfd到虚拟机中MSIX表的中断号的对应关系;Qemu进程调用适配驱动,向转发进程发送eventfd与中断号,以便于转发进程调用虚拟NVMe驱动,建立完成队列到eventfd的对应关系。

因此,Qemu进程创建了完成队列到中断之间的连接,以便于转发进程调用虚拟NVMe驱动,建立完成队列到eventfd的对应关系。

结合第十三方面的第五种可能的实现方式,在第九方面的第六种可能的实现方式中,在向该转发进程发送eventfd和中断号之后,当虚拟机截获MSIX表的非掩膜(unmask)变化或掩膜(mask)变化时,Qemu调用适配驱动,并且调用回调函数,向转发进程发送eventfd和mask,或者eventfd和unmask;Qemu调用适配驱动,根据mask或unmask设置虚拟NVMe设备是否等待(pending)的标识,以便于转发进程根据标识决定是否向KVM模块开启eventfd。

结合第十三方面的第六种可能的实现方式,在第九方面的第七种可能的实现方式中,在根据mask或unmask设置虚拟NVMe设备是否pending的标识之后,转发进程轮询虚拟NVMe设备的doorbell区域;当doorbell区域的0号命令队列包括创建发送队列的请求,转发进程调用虚拟NVMe驱动,从命令队列中获取虚拟机下发的NVMe命令;转发进程调用虚拟NVMe驱动,解析NVMe命令;转发进程调用虚拟NVMe驱动,通过解析NVMe命令,获取创建发送队列的参数,参数包括发送队列DMA地址、发送队列ID、发送队列深度、完成队列ID、发送队列标志位;转发进程调用虚拟NVMe驱动,根据参数创建发送队列。

结合第十三方面的第二种至第六种可能的实现方式,在第九方面的第七种可能的实现方式中,该Qemu进程调用适配驱动,将该共享内存空间映射到虚拟NVMe设备的第一段BAR空间,包括:Qemu进程调用适配驱动,通过内存映射输入/输出的方式,将该共享内存空间映射到虚拟NVMe设备的第一段BAR空间;Qemu进程调用适配驱动,设置虚拟机控制结构(Vitrual Machine Control Structure,简称“VMCS”)寄存器,用于防止访问过程中产生陷入陷出。

基于上述技术方案,通过独立的转发进程完成虚拟NVMe设备的读/写操作,并且该转发进程使用轮询的方式替代原有的定时器方式,能够避免Qemu锁竞争,同时能够解决时延长的问题,从而实现了一种高性能低时延的NVMe虚拟化方法,提高了虚拟机内应用程序对NVMe设备的访问速度。

第十四方面,本发明实施例提供了一种虚拟化装置,该装置包括虚拟机和数据平面的转发进程,数据平面的转发进程包括虚拟非易失性内存扩展NVMe驱动,虚拟机包括虚拟NVMe设备,转发进程用于轮询虚拟NVMe设备的门铃doorbell区域;当doorbell区域发生变化时,调用虚拟NVMe驱动,从doorbell区域发生变化的发送队列中,获取虚拟机下发的NVMe命令,NVMe命令包括读/写请求;调用虚拟NVMe驱动,解析NVMe命令,得到通用读/写请求;获取物理存储设备对该通用读/写请求的处理结果;调用虚拟NVMe驱动,将该物理存储设备的处理结果封装为NVMe响应;调用虚拟NVMe驱动,将NVMe响应添加到与发送队列对应的完成队列中。

该虚拟化装置用于执行上述第九方面或第九方面的任一方面的可能实现方式中的方法。

因此,本发明实施例的方法和装置,通过独立的转发进程完成虚拟NVMe设备的读/写操作,并且该转发进程使用轮询的方式替代原有的定时器方式,能够避免Qemu锁竞争,同时能够解决时延长的问题,从而实现了一种高性能低时延的NVMe虚拟化方法,提高了虚拟机内应用程序对NVMe设备的访问速度。

第十五方面,本发明实施例提供一种存储介质,该存储介质用于保存第九方面及第九方面任一实现方式的方法。

第十六方面,本发明实施例提供一种应用程序,该应用程序用于执行第九方面及第九方面任一实现方式的方法。

附图说明

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

图1是本发明实施例方法所适用的物理主机的示意性架构图;

图2是与本发明实施例相关用于处理读/写请求的示意性架构图;

图3是根据本发明实施例的用于处理读/写请求的示意性架构图;

图4是根据本发明实施例的用于处理读/写请求的示意性架构图;

图5是根据本发明实施例的一种处理读/写请求方法的示意性流程图;

图6是根据本发明实施例的一种处理读/写响应方法的示意性流程图;

图7是根据本发明实施例的一种处理读/写请求装置的示意图;

图8是根据本发明实施例的一种处理读/写响应装置的示意图;

图9是根据本发明实施例中物理主机的示意性框图;

图10是根据本发明实施例的应用场景的示意图;

图11是根据本发明实施例的系统框架的示意图;

图12根据本发明实施例的虚拟化方法的示意性流程图;

图13是根据本发明实施例的虚拟NVMe设备的虚拟化流程图;

图14是根据本发明实施例的虚拟化方法的另一示意性流程图;

图15是根据本发明实施例的虚拟化方法的再一示意性流程图;

图16是根据本发明实施例的虚拟化方法的再一示意性流程图;

图17是根据本发明实施例的虚拟化方法的再一示意性流程图。

具体实施方式

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

应理解,本发明实施例中各步骤的序号的大小并不意味着执行顺序的先后,各步骤的执行顺序应以其功能和内在逻辑确定。应理解,本发明实施例中,和/或,表示“和”或者“或”。

应理解,本发明实施例提到的读/写请求读/写请求表示读请求或者写请求。故本发明实施例提到的第一读/写请求到第三读/写请求均表示一条读请求,或者均表示一条写请求。读/写响应表示读请求的读响应或者写请求的写响应。第一读/写响应到第三读/写响应均表示一条读请求的读响应,或者均表示一条写请求的写响应。

应理解,本文中的I/O指输入/输出,I/O指令指读/写请求。另一方面,需要说明的是,本文中的读/写请求中的读/写类似于I/O,表示读或者写。本文中的读/写请求处理进程就是进程,说明书中采用这种功能性命名是为了是为了示意性区分,表达该进程用于实现该方法,而不是对该进程的限定。

图1所示的是本发明实施例的处理读/写请求的方法所适用的物理主机系统架构的示意图。需要理解的是,图1仅为方便理解的示意性说明图,并不限定该系统架构的组成模式,例如,图8也是一种适用于本发明实施例的物理主机。如图1所示,该系统架构可以包括:

物理主机110,物理主机110可以是服务器、终端计算机等,本发明不做限定,其中,物理主机110采用XEN虚拟化架构,或者采用KVM(Kernel-based Virtual Machine,基于内核的虚拟机)虚拟化架构,本发明实施例不做限定。

物理主机110中可以包括:一个或多个虚拟机(Virtual Machine,VM)112(图1中只示意性画出了一台)、物理存储设备114,如本地磁盘(local disk)、内存等,以及宿主机111,其上运行着宿主机操作系统(Host Operating System,Host OS)其中包括了虚拟监控器(hypervisor)113。当然,本发明实施例中的虚拟机112也可以调用远端的存储设备上的硬件存储资源,本发明实施例不做限定。

宿主机操作系统包括存储后端驱动、虚拟存储设备和文件系统,其中虚拟存储设备包括虚拟块设备等,这些模块用于执行存储虚拟化(storage virtualization)。

虚拟机(vm)112上可以运行数据库、办公桌面等。虚拟机112中可以包括存储前端,该存储前端是虚拟机内的驱动,用于驱动该该虚拟机的虚拟存储设备,可以与宿主机的操作系统交互,把虚拟机内的数据传送到宿主机操作系统中。

虚拟监控器(hypervisor)113,用于模拟物理主机。具体的,对于采用XEN虚拟化技术的虚拟机,虚拟监控器113为XEN模块,对于采用KVM虚拟化技术的虚拟机,虚拟监控器113为KVM模块。

以下介绍本申请实施例中涉及到的存储虚拟化领域内的若干名词:

块设备(Block Device),是用于存储信息的具有固定大小的块,每个块都有自己的地址,块设备的基本特征是每个块都能独立于其他块读/写。

物理存储设备,即物理机中的存储硬件,也简称为物理存储设备,包括物理块设备。在虚拟化领域,为了与虚拟块设备的概念对应,可以认为物理存储设备包括控制电路和物理块设备,控制电路用于控制物理块设备的读/写和工作状态,例如驱动或接口,物理块设备就是物理存储设备中用于存储信息的硬件结构,例如磁盘就是典型的物理块设备。

存储虚拟化(Storage Virtualization)是指对存储硬件资源进行抽象化表现,也就是将物理存储设备虚拟化出虚拟存储设备以供虚拟机使用。这样,可以较为灵活地虚拟出各种虚拟存储设备供虚拟机使用,而不用局限于物理存储设备本身,并且,也不用局限于该虚拟部署的物理机上的物理存储设备,也就是说,可以用其他物理主机的物理存储设备虚拟出虚拟存储设备供该虚拟机使用。本发明实施例的方法也适用于不同节点上的物理存储设备虚拟出虚拟存储设备供一物理主机上的虚拟机使用的情况。

虚拟存储设备,使用不同的存储协议虚拟出的与物理存储设备的存储设备,对于调用虚拟存储设备的虚拟机而言,虚拟存储设备就被当做是实实在在的虚拟存储设备在虚拟机运行前被创建,并由HOST确定虚拟存储设备与虚拟机的对应关系,也就是哪个虚拟机使用哪个或哪些虚拟存储设备。虚拟存储设备包括控制器和虚拟块设备。控制器用于接收运行在虚拟机的应用发送的读/写请求(又称I/O请求、I/O指令、读/写指令等)和控制指令(如上电、下电等),以及将读/写请求下达给虚拟块设备。虚拟块设备对应于物理块设备表示虚拟存储设备中用于存储信息的地址段,体现了虚拟存储设备的存储功能,虚拟机中应用生成的读/写请求中的地址一般认为表示的是虚拟块设备的地址。

例如,一个物理存储设备可以虚拟出多个虚拟存储设备,这些虚拟存储设备可以遵循不同的存储协议(如scsi、nvme等)、具有不同的存储容量或者具有不同的存储性能。存储虚拟化技术允许物理存储设备与虚拟存储设备的存储协议不同。以上是存储虚拟化必备的基本功能,当然这里也可以有存储虚拟化的增值功能,例如快照、瘦供给等特性。

进一步的,对于不同的协议,虚拟存储设备种类不同,例如遵循scsi协议的虚拟存储设备,其控制器一般称为scsi控制器,通常包括一个虚拟块设备,而遵循nvme协议的虚拟存储设备,其控制器一般称为nvme卡,可以包括一个或多个虚拟块设备,但共性为都包括虚拟块设备以及都有分配的一个或多个队列来处理读/写请求,对于nvme卡来说虚拟块设备就是其namespace,可以包括多个;对于scsi控制器来说虚拟块设备就是scsi lun。再例如,虚拟存储设备都具有发送队列和完成队列,nvme卡可以有动态分配的一个至多个发送和完成队列,而scsi控制器往往只有静态分配的一个队列。虚拟存储设备的协议除了nvme和scsi外,还有其特有的virtio协议,virtio协议也可以具有静态分配的多个队列,并且它的发送和完成队列是同一个。综上可知,虽然存储协议各种各样,但其中包含了较一致的共性,各协议的不同只是差别化了某些细节和定义。

类似的,不同类型的物理存储设都存在较一致的共性,只有部分差异点体现在具体的物理存储设备的控制电路和控制方式。

在本发明实施例中,结合图2以采用KVM虚拟化技术的虚拟机为例进行说明现有的读/写指令处理方法。

虚拟化场景下,Host是物理机,其上会虚拟出很多个VM虚拟机,虚拟机可以对应一个或多个虚拟存储设备,如虚拟磁盘,每个虚拟磁盘的类型、容量等都不同。这些虚拟磁盘是由物理存储资源虚拟出来的,存储资源池可以是主机内的本地的支持SAS(Serial Attached SCSI,串行连接SCSI接口)的硬盘、nvme盘、内存等等存储介质,也可以是远端的SAN设备。主机上通常会有为虚拟磁盘提供I/O服务的进程,例如KVM下的qemu进程,通常通常一个qemu进程对应一个虚拟机,一个qemu进程包括一个或多个qemu线程,可以为一个或多个虚拟磁盘提供服务,一个qemu线程负责处理访问一个虚拟磁盘的读/写指令,可以为例如dataplane技术中,qemu进程启动不同的I/O进程或者线程为不同虚拟磁盘提供服务。

通常使用的方法中,虚拟机上的应用进行存储访问的I/O流程较为冗长繁琐。虚拟机中应用的读/写指令从应用下发后,需要经过虚拟机内部的存储软件栈,下发到虚拟机的虚拟存储驱动中,然后由前端驱动将读/写指令放入I/O环中,然后通过写对用的PI/O(programming I/O可编程I/O,又称端口I/O)地址来通知qemu进程处理I/O,写PI/O首先会导致虚拟机发生vm exit(虚拟机陷出),vm exit和vm enter(虚拟机陷入)的开销非常大。虚拟机陷出后,KVM模块会先判断是何种原因发生的陷出,然后唤醒qemu进程进行I/O处理。Qemu进程被唤醒后,将请求从I/O环中取出,解析I/O环中的请求并组装成iocb(I/O control block,I/O控制模块),通过aI/O(asynchronous Input/Output,异步输入输出)方式下发到主机内核的软件栈中,经过冗长的存储软件栈处理后,最终落到物理存储设备的发送队列中,由物理存储设备写相关寄存器,交给物理存储设备处理。物理存储设备处理完成后,通过中断唤醒主机OS(Operating System,操作系统)调用中断处理函数进行响应处理,再通过aI/O事件经历软件栈唤醒qemu进程,qemu进程被唤醒后,将响应从主机软件栈(位于主机的内核态部分)取出,判断处理结果,并组装成虚拟存储I/O响应,放入I/O环,再通过kvm模块向虚拟机注入中断,虚拟机收到中断后,再唤醒虚拟机OS,调用相关的中断处理函数进行响应处理,最终返回给虚拟机内部的应用。

需要说明的是,软件栈(software stack)指的是一组相互协作的软件或者软件层的层级结构,侧重于功能的完整性。当用于不同的场合,会在之前追加不同的定语,例如本申请中提到的存储软件栈,就是由上文中提到的多个软件层的层级结构实现虚拟化场景下读/写指令的处理功能的。

需要理解,qemu包括多个qemu进程,需要处理的业务是非常多的,因此负担也很重。这些qemu进程可以理解为是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor,VMM)的一部分。qemu主要提供两种功能给用户使用。一是作为用户态模拟器,利用动态代码翻译机制来执行不同于主机架构的代码。二是作为虚拟机监管器,模拟全系统,利用其他VMM(Xen,KVM,etc)来使用硬件提供的虚拟化支持,创建接近于主机性能的虚拟机。QEMU作为系统模拟器时,会模拟出一台能够独立运行操作系统的虚拟机。每个虚拟机对应主机(Host)中的一个qemu进程,而虚拟机的vCPU对应QEMU进程的一个线程。系统虚拟化最主要是虚拟出CPU、内存及I/O设备。虚拟出的CPU称之为vCPU,qemu为了提升效率,借用KVM、XEN等虚拟化技术,直接利用硬件对虚拟化的支持,在主机上安全地运行虚拟机代码(需要硬件支持)。

在上述方法中,每一个虚拟机都分配有一个后端存储进程,用于接收虚拟机上的应用下发的读/写指令,以及将读/写指令提供给唤醒的qemu进程处理,一个qemu进程包括一个或多个qemu线程,该虚拟机的一个虚拟存储设备对应一个qemu线程,该进程可以处理该虚拟存储设备的队列中待处理的读/写指令,但这个过程中涉及虚拟机的陷入和陷出,且由于每个虚拟存储设备都分配有qemu线程,为了节省资源该进程在没有处理读/写指令的情况下,会休眠,在有读/写指令待处理的情况下,则需要被唤醒,当多个qemu线程在工作时,会产生资源的竞争,引发锁。

整个流程中,有五个耗时的地方:虚拟机陷入和陷出、qemu唤醒开销、qemu下发I/O系统调用的上下文切换开销,主机侧存储栈开销、物理磁盘处理完唤醒OS的中断唤醒开销,使得存储过程的时延很大。

应当理解,现有技术中使用上述较为复杂的软件栈,是由于这种方式处理能基于虚拟机本身的架构实现处理读/写指令的过程,使用了上述软件栈中各层的一部分功能,例如文件系统属于主机软件栈,由于要支撑从前端到后端的各种业务以及HOST对虚拟机的控制,功能是比较全面的,结构也比较复杂,然而,如果问题聚焦于处理读/写指令这个业务需求,上述通过中断进行处理的过程显然不够轻便,所产生的耗时和开销已经成为了读/写指令处理能力提升的一个瓶颈。

本发明实施例提出了一种新的架构替换原有的I/O流程,这种架构专门针对I/O处理的特点和要求。用一个虚拟化存储数据平面代替原始软件栈,如图3所示,该虚拟化存储数据平面的核心是一个用于处理读/写指令的进程,可以称为读/写指令处理进程,具体的解释可参见发明内容,,该进程采用轮询方式降低唤醒和上下文开销,性能较高,以此达到降低I/O时延,提升性能的效果。其中,通过设置vmcs(Virtual Machine Control Structure,虚拟机控制结构),设置虚拟机模拟虚拟存储设备对应的虚拟内存空间的方式为mmio,从而来屏蔽处理读/写指令过程中的虚拟机的陷入和陷出(vm exit/enter)。并且该进程替换了原有的多个存储后端进程,由多个后端变成了一个或有限个,降低了cpu资源的占用。如果在内核实现该读/写指令处理进程,则可以进一步降低内核和用户态的上下文开销。整个I/O过程中,qemu进程不再参与,在达成高性能效果的同时,保留了存储虚拟化的功能。

再次说明,本发明实施例中提到的用于轮询虚拟存储设备和物理存储设备的队列的进程,也可以是一个线程,本发明实施例不做限定,但由于虚拟化中,用于提供I/O服务的线程可以理解为一个轻量级的进程,故为了表述方便,下文中均使用进程进行描述。

本发明实施例为避免使用qemu进程,采用一个或多个进程通过轮询的方式负责读/写指令的下发和完成。轮询(Polling)I/O方式或程序控制I/O方式,是让CPU中运行的进程以一定的周期按次序查询虚拟存储设备和物理存储设备的请求队列(如发送队列和响应队列),看它是否有数据输入或输出的要求,若有,则进行相应的输入/输出服务;若无,或读/写请求处理完毕,就接着查询下一个请求队列。可选的,在本发明实施例中,具体如何轮询可以制定相关的策略,用以规定以下具体的实施细节中的至少一种:各读/写指令处理进程轮询哪些存储设备的哪些请求队列,各读/写指令处理进程按照什么样的次序轮询这些请求队列,轮询的时间周期和对一次轮询,取一请求队列中的多少待处理请求进行处理等。本发明实施例对制定何种策略不做限定。

在一种实现方式下,读/写指令处理进程以轮询方式遍历所有请求队列。

具体的,在一些场景下,可以只使用一个读/写指令处理进程,例如虚拟机上的应用下发的读/写指令不多,在另一些场景下,可以使用多个读/写指令处理进程,例如的虚拟机上的应用下发的读/写指令较多,一个读/写指令处理进程轮询会造成轮询时间较长,使用多个读/写指令处理进程可以定制策略确定各读/写指令处理进程的轮询范围和如何实施轮询,本发明实施例不做限制。一个读/写指令处理进程的情况下,由于独享资源,在I/O流程中是无锁的;而对于多个转发线程的情况,不同的转发线程分别管理各自的虚拟存储设备和物理存储设备,以此达到对资源的隔离,实现无锁I/O处理,达到最优性能。

本发明实施例所述的方法可以理解为能够运行在图3所示架构的虚拟机中,其中,HOST的qemu进程不再参与存储I/O过程,也无需通过现有技术中的主机软件栈对来自虚拟机上应用的存储请求进行处理,而是通过另一个流程处理后由物理存储设备写相关寄存器,交给物理存储设备处理(也就是传递给主机与物理存储设备间的I/O环,由该I/O环传递给物理存储设备),如图3中的下行向箭头指示的过程,经物理存储设备处理后,沿上述过程的反方向(图3中的上行向箭头指示的过程)返回响应。本发明实施例提供的方法从逻辑上可以理解为是如图3中所示的虚拟化存储数据平面执行的,该虚拟化存储数据平面可以实现存储虚拟化功能,简单说也就是在多种物理存储设备上虚拟化出多个虚拟存储设备。为便于理解,对虚拟化存储数据平面及其功能分层次作以下简单的说明,应理解以下层次的划分只是为了帮助理解方法中提及的步骤,并不限定与实际执行本申请所述方法的设备的结构对应。

需要说明的是,在一种实现方式下,该虚拟化存储数据平面的部分功能可以理解为该用于轮询的读/写指令处理进程所具备的功能。

为实现存储虚拟化功能,虚拟化存储数据平面的架构可以如图4所示,虚拟化存储数据平面可以看做具有虚拟存储设备抽象层、物理存储设备抽象层、Filter模块三个组件来提供不同的虚拟存储设备。为了实现高性能,可以看作具有虚拟化存储数据平面核心层。另外,为了便于管理和使用虚拟存储设备和物理存储设备,引入了控制模块。

其中,核心层实现了读/写指令处理进程的管理(读/写指令处理进程创建、删除、调度)、请求内存池的管理(创建、删除、申请请求、释放请求、请求拆分)的功能,内存池是分配给读/写请求的内存资源。

正如前文所述,不同协议的虚拟存储设备存在共性,故虚拟存储设备抽象层可以将虚拟存储设备抽象出统一的模拟、管理和操作方法,也就是直接管理队列和虚拟块设备(其中包括创建新队列,释放旧队列等);进一步的,也实现了虚拟存储设备创建、删除、查询,并实现不同虚拟存储设备统一的处理请求、处理响应、响应通知方法,为具体的虚拟存储驱动提供注册和解注册方法。

物理存储设备抽象层可以将物理存储设备抽象出统一的驱动和并进行统一的管理,因为不同类型的物理存储设备都存在较一致的共性,只有部分差异点需要在具体的物理存储设备驱动中提供,物理存储设备抽象层实现了统一的pci驱动入口,为具体的物理存储设备驱动提供统一的管理,从而可以驱动不同的物理存储设备,具体的管理包括以下至少一种:物理存储设备的注册、解注册、创建、删除和查询等,还可以实现物理存储设备统一的下发请求、通知和处理响应。

虚拟存储设备抽象层和物理存储设备抽象层的存在,为从具体的物理存储设备虚拟化出不同的虚拟存储设备提供了基础,例如可以从nvme卡上虚拟化出虚拟的scsi设备等,提供虚拟化能力。控制模块向用户提供了统一的管理接口,具体可以包括提供创建、删除和查询等至少一种虚拟存储设备和物理存储设备的管理接口;Filter模块可以用于存储I/O映射,高级特性插入和删除,映射逻辑设备创建、删除和查询等,Filter模块可以理解为读/写请求处理进程中的一个钩子(Hook)。

以下结合图5具体叙述实现在物理主机中处理读/写请求的方法,所述物理主机包括物理存储设备、宿主机HOST、以及虚拟机,所述物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务。

需要说明的是,为了叙述清楚,以下步骤中通过一个读/写指令处理进程对一条读/写请求的处理过程来体现本方法,而实际上,读/写指令处理进程在轮询过程中,会将该读/写指令处理进程需处理的多条待处理的读/写请求都分别进行下述步骤的操作,即处理完一条读/写请求再取下一条,如此循环。例如根据处理策略分配给该读/写指令处理进程的多个虚拟存储设备的队列,又例如遍历所有队列以处理所有待处理的读/写请求。本发明实施例的方法不再通过中断的方式为虚拟机提供存储服务,也不再使用用户态的qemu进程,读/写指令处理进程可以并行处理多条读/写请求,读/写指令处理进程是通过轮询的方式为虚拟机提供服务的。相应的,对于物理存储设备,读/写指令处理进程也是关中断而采用轮询的形式进行服务的。

本申请实施例的方法具体包括以下步骤:

S501:所述HOST通过访问与所述虚拟存储设备中至少一个虚拟存储设备虚拟存储设备对应的虚拟内存空间,轮询所述至少一个虚拟存储设备的一个或多个指令发送队列,以便从所述一个或多个指令发送队列中获取多个第一读/写请求,所述虚拟内存空间是所述HOST采用内存映射I/O(mmio)的方式模拟出的,所述第一读/写请求来自所述虚拟机上运行的应用,所述第一读/写请求包括目标虚拟存储设备的信息。

具体的,每个虚拟存储设备都有至少一个指令发送队列和至少一个指令响应队列。

在一种实施方式下,HOST拉起读/写指令处理进程,遍历所述至少一个虚拟存储设备的至少一个指令发送队列,获取需要处理的至少一条读/写请求,该至少一条读/写请求中包括该第一读/写请求,该第一读/写请求遵从的存储协议与该第一读/写请求对应的虚拟存储设备相同,可以是virtio、scsi或nvme等,本申请实施例不做限定。

需要说明的是,由于虚拟存储设备中的虚拟块设备具有存储的地址范围,物理存储设备中的物理块设备也有存储的地址范围,并且,往往用虚拟存储设备中的虚拟块设备的地址指示虚拟存储设备的地址,故可以将虚拟存储设备的信息与物理存储设备的信息的映射关系等同于虚拟存储设备中的虚拟块设备的信息和物理存储设备中的物理块设备的信息的映射关系,或者虚拟块设备与物理存储设备的对应关系。可以以下语言描述虚拟存储设备是由物理存储设备虚拟出的,虚拟存储设备包括虚拟块设备,也可以称为虚拟存储设备又可以虚拟出虚拟块设备,虚拟块设备如果要再细分其对应的地址段,则可以认为是一个虚拟块设备包括多个子虚拟块设备,也可以称为在一个虚拟块设备上虚拟出多个虚拟块设备。虚拟存储设备是为了使虚拟机可以有对应的调用对象,即虚拟机认为读/写指令应发往哪个虚拟存储设备,而虚拟存储设备中的地址以及存储空间大小(可存储的数据长度)等具体参数则是通过该虚拟存储设备对应的一个或多个虚拟块设备来体现的,故该读/写指令携带的是目标虚拟块设备的标识,该标识用于指示待读/写的虚拟地址。

综上,本发明实施例对虚拟存储设备的地址和物理存储设备的地址的表达形式不做限定,对虚拟存储设备的标识和物理存储设备的标识的表达形式不做限定。例如,虚拟存储设备的地址也可以通过该虚拟存储设备中虚拟块设备的地址或者该虚拟存储设备中虚拟块设备的地址和标识来表示,虚拟存储设备的标识也可以通过虚拟存储设备中虚拟块设备的信息(地址或者标识或者其他)来表示。这种映射关系可以使HOST通过对读/写请求的处理确定物理存储设备中应读/写的数据的位置,从而完成对该读/写请求的处理,该映射关系的具体形式本申请实施例不做限定。虚拟块设备具有标识、地址以及长度的概念,从而能够对应物理存储设备的中的物理地址,例如,一张nvme卡上可以虚拟出一个虚拟的10G的虚拟块设备。

虚拟机可以通过该目标虚拟存储设备的信息确定第一读/写请求应当放入的虚拟存储设备队列。物理主机中还维护着虚拟块设备与虚拟存储设备间的映射关系。例如在一种较为通用的实施方式中可以包括该目标虚拟块设备的ID等能表示该虚拟块设备标识的信息和该目标虚拟块设备中的相对地址,也就是说每个虚拟块设备可能地址都是从0到10G,需要通过虚拟块设备的ID或者该虚拟块设备的某个字符在一系列虚拟块设备中的绝对地址来对各虚拟块设备中的地址进行区分(如第一个块设备的为0,第二个块设备为10G,第三个块设备为20G),又例如在另一个实施例中该标识可以直接是虚拟块设备的绝对地址,本申请实施例不做限定。

另一方面,本领域人员也应理解,读/写请求中一般都会包括待读/写数据的长度信息,该长度信息可用于和待读/写的目标虚拟块设备的标识一起以指示待读/写数据的范围。

需要说明的是,该读/写指令处理进程可以理解为是前文中提到的虚拟化存储转发平面核心层的一种实现方式。

S503:对所述多个第一读/写请求中的每一个执行第一转发操作所述HOST对所述多个第一读/写请求中的每一个执行第一转发操作,所述第一转发操作包括:所述HOST根据所述第一读/写请求包括的目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,生成与所述第一读/写请求对应的第二读/写请求,所述第二读/写请求包括所述目标物理存储设备的信息;所述HOST根据所述目标物理存储设备的信息,将所述第二读/写请求加入所述目标物理存储设备的指令发送队列,以便所述目标物理存储设备从所述指令发送队列中获取所述第二读/写请求,以及根据所述第二读/写请求执行读/写操作。

这样,HOST可以主动轮询虚拟存储设备的指令发送队列,获得应用下发的第一读/写请求,并经过处理后将其转发至目标物理存储设备的指令发送队列,而非现有技术的通过虚拟机陷出来唤醒HOST的qemu进程通过软件栈来处理读/写请求,该轮询过程无需虚拟机的陷出和陷入。具体的,采用mmio形式访问虚拟存储设备对应的虚拟内存空间从而避免了虚拟机的陷出。用一个读/写请求处理进程替代了qemu进程,该进程采用轮询的方式获取读/写请求,简化了HOST处理读/写请求的过程,提高了软件处理读/写请求的速度,降低了软件处理读/写请求的时延。

具体的,对所述HOST根据所述第一读/写请求包括的目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,生成与所述第一读/写请求对应的第二读/写请求,可以包括以下步骤:所述HOST根据所述第一读/写请求包括的目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,确定所述目标物理存储设备的信息;所述HOST生成与所述第一读/写请求对应的第二读/写请求,所述第二读/写请求包括所述目标物理存储设备的信息,所述第二读/写请求的格式与所述目标物理存储设备匹配。

由此,使得HOST可以统一分析读/写请求的内容,不论第一读/写请求和第二读/写请求遵循何种存储协议,都可以进行集中处理,也方便对不同存储协议的虚拟存储设备,读/写请求处理进程都可以获取其第一读/写请求进行处理而不用分辨不同虚拟存储设备的存储协议。

需要说明的是,S503表示的步骤可以对应为前文中提到的Filter模块进行处理的,Filter模块的功能类似linux内核逻辑卷层,用于具体的,上述解析和封装使用存储协议。解析过程和封装过程可使用不同的存储协议。解析过程使用的封装协议是根据目标虚拟存储设备的信息确定的,和封装过程使用的封装协议是根据目标物理存储设备的信息确定的。

Filter模块维护了虚拟块设备和物理存储设备间的映射表,以及提供相关的高级特性。

需要说明的是,HOST通过轮询不断地执行以下操作中的至少一种:从指令发送队列获取多条读/写请求以及从指令响应队列获取多条读/写响应。具体的,这种轮询取请求和/或响应(和/或,表示“和”或者“或”),并对取出的多条请求和/或响应进行处理,可以有两种方式,通过轮询的方式,取一条请求或响应,对其进行处理,处理完后再取下一条请求或响应,如此循环。或者,通过轮询的方式,取出多条请求或响应,再进行处理。对于一个读/写请求处理进程,可以一条一条处理,对于多个读/写请求处理进程,可以多条并行处理,本发明实施例对实现方式不做限定。

需要说明的是,读/写请求中一般都带有待读/写数据的长度信息,在一种实现方式中,所述方法还包括:所述HOST通过所述轮询从所述一个或多个指令发送队列中得到第三读/写请求,所述第三读/写请求包括待读/写数据的长度和待读/写的虚拟存储设备的信息,所述待读/写的虚拟存储设备包括待读/写的目标虚拟块设备,所述待读/写数据的长度大于等于所述待读/写的目标虚拟块设备的可读/写地址范围;所述HOST生成所述第三读写请求的响应;所述HOST将所述第三读/写请求的响应加入所述待读/写的虚拟存储设备的指令响应队列,所述第三读/写请求的响应表示所述第三读/写请求的读/写操作执行失败。

一种实施方式中,由于不同的虚拟存储设备可能遵循不同的存储协议,如virtio、scsi或者nvme等,对应于不同虚拟存储设备的读/写请求也遵循不同的协议,根据该第一读/写请求的协议将第一读/写请求解析成统一格式的内容,该具有统一格式的读/写请求内容包括所述目标虚拟存储设备的信息;根据所述目标虚拟存储设备的信息与所述目标物理存储设备的信息之间的映射关系,将该具有统一格式的读/写请求内容变更为包括所述目标物理存储设备的信息;这里对第一读/写请求进行解析,是为了实现对不同存储协议的虚拟存储设备进行统一的管理。相应的,将修改后的统一格式的内容进行封装也是由于不同的物理存储设备可能遵循不同的存储协议,如virtio、scsi或者nvme等。

需要说明的是,通过目标虚拟存储设备的信息与目标物理存储设备的信息间的映射得到目标物理存储设备的信息有多种方法实现,本发明实施例不做限制。在一种实施方式里,采用线性映射的方法对信息中的地址进行映射,具体为将目标虚拟存储设备的信息中的起始地址加上线性映射的起始偏移,以及读/写请求中目标虚拟存储设备的信息中的标识,根据映射关系替换该为对应的目标物理存储设备的标识。

可选的,在一种实施方式中,还可以将修改后的统一格式的内容作为第四读/写请求加入该第四读/写请求对应的物理存储设备的一个等待队列,读/写指令处理进程通过轮询物理主机的至少一个物理存储设备的至少一个等待队列,将待处理的读/写请求取出,根据相应的调度方法确定待处理的读/写请求各自要发往的物理存储设备,具体的调度方法本发明实施例不做限定。其中,待处理的读/写请求中包括该第四读/写请求,将这些待处理的读/写请求采用对应的存储协议进行协议封装得到封装后的读/写请求,HOST进行dma(Direct Memory Access,直接内存访问)映射等预处理,再调用相应的协议中的命令将封装后的读/写请求放入对应的物理存储设备的发送队列中,其中封装后的读/写请求包括该第二读/写请求。

另一方面,上述读/写指令处理进程也可以处理上述指令发送队列中的除读/写请求之外的指令,这些指令无需传递给物理存储设备,而只需虚拟存储设备处理。这样,就使得本申请实施例中通过读/写指令处理进程的方式可以满足虚拟机上应用的各种与存储相关的指令,避免了因指令类型带来的应用的限制,也免除了要将读/写指令挑出来使用本发明实施例的机制处理的麻烦,使读/写指令处理进程的轮询机制更加顺畅,也减少了现有技术中处理除读/写请求之外的指令虚拟机陷入陷出带来的延时。

上述读/写指令处理进程通过调用相应的存储协议,对所述至少一个虚拟存储设备的至少一个指令发送队列中的待处理指令进行解析,对无需下发给物理存储设备处理的待处理指令,虚拟存储设备调用相应的协议中的命令进行处理,将处理获得的结果按照该待处理指令对应的协议封装成响应,将该响应放入对应的虚拟存储设备的组装。

其中,可以通过待处理指令中的参数确定该待处理指令是否是读/写请求,从而对待处理命令进行不同方式的处理,,对于不同的存储协议,依据的参数不同。例如对于scsi协议根据其操作码的类型进行判断,对于nvme协议根据发送队列的id进行判断。对于不需要下发给物理存储设备处理的指令,例如scsi的report lun命令、nvme的创建队列命令等,可以调用相应的存储协议对指令进行解析,并根据对应的存储协议的方法将处理结果组装为响应,再将其放入虚拟存储设备的完成队列中。

需要理解的是,HOST调用统一的PCI驱动调用和管理所述至少一个物理存储设备处理来自虚拟机的读/写请求。具体的,可以认为是上文中的物理存储设备抽象层的一种实现方式。简单从方法上描述,在指令下发前,先使用HOST提供统一的pci(peripheral component connect,外部部件互联标准)驱动加载物理存储设备。在一物理存储设备驱动加载的过程中,对该物理存储设备驱动进行注册(可理解为注册到物理存储设备抽象层),具体过程为将该物理存储设备驱动管理的pci设备id表加入到该统一pci驱动的id(标识)列表中,触发pci总线扫描设备,扫描过程中一旦发现匹配id的pci设备,将会调用该统一pci驱动的加载设备函数,该加载函数中再调用具体的物理存储设备驱动加载方法加载设备。

进一步的,还可以包括如下步骤,以构成完整的HOST对虚拟机上应用下发的读/写请求的给予完整的响应过程。具体的,下述步骤是物理存储设备完成与下发的读/写请求相应的读/写操作后,HOST向虚拟机返回读/写响应的反馈过程。

另一方面,下述过程S507到S509,在一个实施例中,也可以单独使用,作为一种处理读/写响应的方法,如图6所示。

关于下述过程中的与S501到S503中相应的步骤或者相同的名词,为节约篇幅,不再重复解释,请参照对S501到S503中相应的步骤或者相同的名词的说明。另一方面,需要说明的是,S501到S509这些标识,只是为了方便表述,仅用于指代步骤。

S507:所述HOST轮询所述物理存储设备中至少一个物理存储设备的一个或多个指令响应队列,以便从所述一个或多个指令响应队列中获取多个第二读/写响应,其中,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,所述第二读/写响应表示所述目标物理存储设备已执行所述读/写操作,所述第二读/写响应包括所述目标物理存储设备的信息。

S509:所述HOST对所述多个第二读/写响应中的每一个执行第二转发操作,所述第二转发操作包括:所述HOST根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,生成与所述第二读/写响应对应的第一读/写响应,所述第一读/写响应包括所述目标虚拟存储设备的信息;所述HOST根据所述目标虚拟存储设备的信息,将所述第一读/写响应加入所述目标虚拟存储设备的指令响应队列,以便所述应用得到所述第一读/写响应。

具体的,所述HOST根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,生成与所述第二读/写响应对应的第一读/写响应,包括:所述HOST根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,确定所述目标虚拟存储设备的信息;所述HOST生成与所述第二读/写响应对应的第一读/写响应,所述第一读/写响应包括所述目标虚拟存储设备的信息,所述第一读/写响应的格式与所述目标虚拟存储设备匹配。

需要说明的是,S509表示的步骤可以对应为前文中提到的Filter模块进行处理的,Filter模块的功能类似linux内核逻辑卷层,用于维护虚拟块设备和物理存储设备间的映射表,以及提供相关的高级特性。

需要说明的是,上述实施例S501至S509表现了HOST调用物理存储设备对读/写请求进行响应的两个部分,即下发过程和反馈过程,一般来说,在具体实现中,HOST会采用这一整套方法来处理读/写请求,但本发明实施例并不限定下发过程采用上述S501到S505对应的方法而反馈过程采用其他方法,或者下发过程采用其他方法而反馈过程采用上述S507和S509来实现完整的响应过程。

综上,上述处理读/写请求的方法,用轮询的方式从至少一个虚拟存储设备的至少一个指令发送队列获得待处理的读/写请求,将与待处理的读/写请求对应的读/写请求加入目标物理存储设备的发送队列,在相应的目标物理存储设备执行相应的读/写操作返回响应后,用轮询的方式最终将响应传递到虚拟存储设备的指令响应队列,以便虚拟机获取,简化了HOST处理读/写请求的过程,提高了软件处理读/写请求的速度,降低了软件处理读/写请求的时延,从而提高了虚拟化场景下的存储性能。进一步的,用一个独立的进程替代了qemu进程处理多个虚拟存储设备的情况下,也能避免原方法中qemu进程中各线程间的锁竞争。

进一步的,需要说明的是,上述S501到S509四个步骤是逻辑顺序。由于读/写指令处理进程是轮询模式,对其管理的物理存储设备采取关中断的方式,所以在一个实施例的实际的代码运行过程中,读/写指令处理进程可不断的执行上述上述S501到S509四个步骤以不断地处理读/写请求和读写响应,比如通过while语句执行的情况下,六个步骤的顺序在编码中是不限定的,并不一定按照上述的顺序进行。另一方面,由于多个读/写指令处理进程通过轮询可以并行处理多条读/写请求(同一时间一个进程处理一个读/写请求或读/写响应),从代码执行角度上,在一个时间点,不同的读/写请求对应的不同的步骤,也就是说看起来多个读/写指令处理进程在同时执行上述几个步骤。

另外轮询中可采用以下方法来减少执行该轮询的进程的资源浪费:当一段时间没有指令(主要是读/写指令)处理的情况下,HOST主动将读/写指令处理进程调度出去,而不长期占用cpu,相应的,但需要设置一个较短的调度时机,用于当有突发的指令(主要是读/写指令)来临的情况下,能够在短时间内得到响应。具体的,设置较短的调度时机可以采用定时器、时钟中断等方式实现,本发明实施例不做限定。

另一方面,简单介绍在建立虚拟机之前,HOST为了满足虚拟化存储的基本要求,即实现资源共享和资源分割,建立和管理虚拟块设备和虚拟存储设备的方法。具体包括以下步骤,以下步骤所述的方法可以实现多个虚拟存储设备共享一个物理存储设备的资源需求以及一个虚拟存储设备对应多个虚拟块设备,也可以实现物理存储设备存储资源的合理分割管理,对各种存储协议通用。以下步骤的编号仅作指代步骤用,而不用于限定各步骤间的顺序:

S601:所述HOST创建所述至少一个虚拟存储设备。

具体的,创建一个虚拟存储设备,并指定设备类型(例如nvme、scsi等)。从功能上,可以认为是虚拟存储化数据平面中的控制模块提供的接口,具体是控制模块向虚拟存储化数据平面核心层提出的创建请求,创建动作由该核心层完成。

S602:创建至少一个虚拟块设备,所述至少一个虚拟块设备中的每个虚拟块设备都对应所述至少一个物理存储设备中的一个物理存储设备。

具体的,调用接口创建一个虚拟块设备。对于不同的创建方法,创建所需参数也是不同的,具体方法和所述参数本发明实施例不做限定。以线性映射的方法为例,需要输入起始地址,所在物理存储设备(也可以是另一个虚拟块设备,如果是虚拟块设备则需要先创建该虚拟块设备),虚拟块设备的长度。应当理解,单纯的虚拟块设备是无法提供虚拟存储设备模拟功能的,必须指定给虚拟存储设备才能发挥作用,。从功能上,可以认为是虚拟存储化数据平面中的控制模块提供的接口,可以认为是控制模块向filter模块提出的创建请求,创建动作由该filter模块完成。

S603:确定所述至少一个虚拟存储设备与所述至少一个虚拟块设备间的映射关系,其中,所述至少一个虚拟存储设备对应至少一个虚拟块设备。

具体的,调用接口,将S5002中创建的虚拟块设备分配给对应的虚拟存储设备。对于不同协议来说,分配块设备的方法是不同的,所需参数也是不同的,本发明实施例不做限定。例如分配nvme的块设备意味着创建nvme的namespace,需要指定namespace编号等协议相关参数;创建scsi的块设备意味着创建一个scsi lun,需要指定scsi lun和hctl号等协议相关参数。从功能上,可以认为是虚拟存储化数据平面中的控制模块提供的接口。

S604:将所述至少一个虚拟存储设备配置给所述虚拟机,以便为所述虚拟机提供读/写服务。

具体的,将创建的虚拟存储设备配置给虚拟机作为虚拟磁盘使用。

为了更好地说明本发明实施例提供的处理读/写请求的方法,下面以一个例子来描述该方法的一种实现形式,以nvme协议为例,也就是虚拟存储设备和物理存储设备都是nvme设备,在这种协议下,可以使一个虚拟存储设备包括多个虚拟块设备。

HOST的读/写指令处理进程轮询(在一种实施方式下是遍历)虚拟nvme卡(对应虚拟存储设备)的doorbell bar区域,从doorbell bar区域的至少一个队列中获取至少一条nvme指令,分别判断该至少一条nvme指令中的每一条是否来自0号发送队列,对来自0号发送队列的nvme指令,读取各条nvme指令中的操作指令并分别执行,如创建发送一个队列等,分别执行各条nvme指令后生成各自对应的响应消息,将生成的各响应消息放入0号指令响应队列,增加0号指令响应队列的尾指针,设置0号指令响应队列的状态为需要通知虚拟机;对非来自0号发送队列的至少一条nvme指令,该至少一条nvme指令为nvme读/写命令,根据nvme协议解析各条nvme读/写命令以得到协议解析后的读/写请求,调用映射函数对该各条读/写请求中的地址进行映射以得到携带相应的物理存储设备地址的至少一条读/写请求,将映射后的至少一条读/写请求放入相应的物理存储设备的至少一个等待链表,通过轮询将映射后的至少一条读/写请求从等待链表中取出,将该至少一条读/写请求根据nvme协议组装为nvme读/写指令后,放入至少一个物理存储设备的至少一个发送队列,增加放入读/写指令的各发送队列的尾指针,写各对应的物理存储设备的doorbell区域,通知各对应的物理存储设备处理各自对应的至少一条组装后的nvme指令,各对应的物理存储设备完成相应的读/写操作后返回相应的响应到各对应物理存储设备的指令响应队列,每条nvme指令返回一条响应,通过转发线程的轮询将响应放入各响应对应的至少一个虚拟存储设备的至少一个指令返回队列,设置该至少一个指令返回队列的状态为需要通知,对所有需要通知的完成队列,向虚拟机发送对应中断。

另一方面,一种特殊的场景下,物理主机包括物理存储设备、宿主机HOST、以及虚拟机,物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,但是物理存储设备一一对应地虚拟出所述虚拟存储设备,虚拟存储设备与该虚拟存储设备对应的物理存储设备的信息相同,这种情况下,虚拟存储设备其实是虚拟机所感知到的存储设备的意思,可以在技术上认为,物理存储设备实际上并没有被虚拟成虚拟存储设备,只是上层虚拟机以为自己调用的是虚拟存储设备而已,这种场景下,可以认为并没有满足存储虚拟化的性能要求,但也可以认为是一种虚拟化存储场景,本发明实施例所述的方法也可以做适应性修改后用于这种场景。可以提高在该特殊场景下,提高虚拟化存储场景下处理读/写请求的速度,减少I/O时延。具体的,这种场景下的在物理主机中处理读/写请求的方法,包括:

所述HOST通过访问与所述虚拟存储设备中至少一个虚拟存储设备虚拟存储设备对应的虚拟内存空间,轮询所述至少一个虚拟存储设备的一个或多个指令发送队列,以便从所述一个或多个指令发送队列中获取多条读/写请求,所述虚拟内存空间是所述HOST采用内存映射I/O(mmio)的方式模拟出的,所述读/写请求来自所述虚拟机上运行的应用,所述读/写请求包括目标物理存储设备的信息;

所述HOST对所述多条读/写请求中的每一条执行第一转发操作,所述第一转发操作包括:

所述HOST根据所目标物理存储设备的信息,将所述读/写请求加入所述目标物理存储设备的指令发送队列,以便所述目标存储设备从所述指令发送队列中获取所述读/写请求,以及根据所述读/写请求执行读/写操作。

可选的,所述方法还包括:

所述HOST轮询所述至少一个物理存储设备的一个或多个指令响应队列,以便从所述一个或多个指令响应队列中获取多个读/写响应,其中,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,所述读/写响应表示所述目标物理存储设备已执行所述读/写操作,所述读/写响应包括所述目标物理存储设备的信息;

所述HOST对所述多个读/写响应中的每一个执行第二转发操作,所述第二转发操作包括:

所述HOST根据所述目标物理存储设备的信息,将所述读/写响应加入目标虚拟存储设备的指令响应队列,以便所述应用得到所述读/写响应。

与之前的场景类似,这部分可选的步骤也可以单独使用,作为一种处理读/写响应的方法。

由于只是更换了应用场景,故这种场景下的处理读/写请求和处理读/写响应方法的技术细节,请参照上文,即图1至图6对应的内容。

图7是根据本发明实施例的处理读/写请求的装置700的示意性框图,所述装置运行于物理主机,所述物理主机还包括硬件层和虚拟机,所述硬件层包括物理存储设备,所述物理存储设备用于虚拟出虚拟存储设备供虚拟机使用,装置700包括:

请求获取模块701,用于通过访问与所述虚拟存储设备中至少一个虚拟存储设备虚拟存储设备对应的虚拟内存空间,轮询所述至少一个虚拟存储设备的一个或多个指令发送队列,以便从所述一个或多个指令发送队列中获取多个第一读/写请求,所述虚拟内存空间是所述HOST采用内存映射I/O(mmio)的方式模拟出的,所述第一读/写请求来自所述虚拟机上运行的应用,每个所述第一读/写请求包括目标虚拟存储设备的信息;

请求转发模块703,用于对所述多个第一读/写请求中的每一个执行第一转发操作,所述第一转发操作包括:根据所述目标虚拟存储设备的信息,以及所述目标虚拟存储设备的信息与目标物理存储设备的信息之间的映射关系,生成与所述第一读/写请求对应的第二读/写请求,所述第二读/写请求包括所述目标物理存储设备的信息;根据所述目标物理存储设备的信息,将所述第二读/写请求加入所述目标物理存储设备的指令发送队列,以便所述目标物理存储设备从所述指令发送队列中获取所述第二读/写请求,以及根据所述第二读/写请求执行读/写操作。

这样,该装置700可以主动轮询虚拟存储设备的指令发送队列,获得应用下发的第一读/写请求,并经过处理后将其转发至目标物理存储设备的指令发送队列,而非现有技术的通过虚拟机陷出来唤醒HOST的qemu进程通过软件栈来处理读/写请求,该轮询过程无需虚拟机的陷出和陷入。具体的,采用mmio形式访问虚拟存储设备对应的虚拟内存空间从而避免了虚拟机的陷出。用一个读/写请求处理进程替代了qemu进程,该进程采用轮询的方式获取读/写请求,简化了HOST处理读/写请求的过程,提高了软件处理读/写请求的速度,降低了软件处理读/写请求的时延。

可选的,装置700还包括:

响应获取模块705,用于轮询所述物理存储设备中至少一个物理存储设备的一个或多个指令响应队列,以便从所述一个或多个指令响应队列中获取多个第二读/写响应,其中,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,所述第二读/写响应表示所述目标物理存储设备已执行所述读/写操作,所述第二读/写响应包括所述目标物理存储设备的信息;

响应转发模块707,用于用于对所述多个第二读/写响应中的每一个执行第二转发操作,所述第二转发操作包括:根据所述目标物理存储设备的信息,以及所述目标物理存储设备的信息与所述目标虚拟存储设备的信息之间的映射关系,生成与所述第二读/写响应对应的第一读/写响应,所述第一读/写响应包括所述目标虚拟存储设备的信息;根据所述目标虚拟存储设备的信息,将所述第一读/写响应加入所述目标虚拟存储设备的指令响应队列,以便所述应用得到所述第一读/写响应。

由于在这种应用场景下,该装置700图5和图6方法对应的装置,有关该装置700的进一步描述和说明可以参照发明内容第二方面的内容,以及图5和图6相应的内容,此处不再赘述。

至此,该装置将第一读/写请求的第一读/写响应加入目标虚拟存储设备的指令响应队列,形成了一个完整的根据请求返回响应的处理过程,同样采用轮询的方式从物理存储设备的指令响应队列中获取第二读/写响应,基于上述技术方案,通过轮询虚拟存储设备的指令发送队列,简化了HOST处理读/写请求的过程,提高了软件处理读/写请求的速度,降低了软件处理读/写请求的时延。

需要说明的是,上述模块的划分只是示意性表达,并不造成限定,例如,响应获取模块705和请求获取模块701是同一模块,响应转发模块707和请求转发模块703可以是同一模块。

还需要说明的是,响应获取模块705和响应转发模块707还可以单独使用,作为一种处理读/写响应的装置的组成部分,如图8所示,这样,装置800基于上述技术方案,通过进程轮询物理存储设备的指令响应队列,简化了处理读/写响应的过程,提高了软件处理读/写响应的速度,降低了软件处理读/写响应的时延,使应用能更快地收到下发的读/写请求的响应。

应理解,装置700可对应于执行根据本发明实施例记载的处理读/写请求方法,装置700可以认为是上文中提到的替换原有的I/O流程的新架构的一种实现方式,并且装置700中的各个模块的述和其它操作和/或功能分别为了实现图5至图6所示各个方法的相应流程,并且可以运行在图1和图3所示架构的虚拟机中,例如,可以将装置700理解为虚拟化存储数据平面的一种实现方式,故可以参照图1、3、5和6的相关说明,为了简洁,相同的内容和对应的技术效果在此不再赘述。

另一方面,一种特殊的场景下,物理主机包括物理存储设备、宿主机HOST、以及虚拟机,物理主机基于所述物理存储设备虚拟出的虚拟存储设备为所述虚拟机提供存储服务,但是物理存储设备一一对应地虚拟出所述虚拟存储设备,虚拟存储设备与该虚拟存储设备对应的物理存储设备的信息相同,这种情况下,虚拟存储设备其实是虚拟机所感知到的存储设备的意思,可以在技术上认为,物理存储设备实际上并没有被虚拟成虚拟存储设备,只是上层虚拟机以为自己调用的是虚拟存储设备而已,这种场景下,可以认为并没有满足存储虚拟化的性能要求,装置700也可以做适应性修改后用于这种场景。

在这种特殊场景下,所述装置包括:

请求获取模块701,用于通过访问与所述虚拟存储设备中至少一个虚拟存储设备虚拟存储设备对应的虚拟内存空间,轮询所述至少一个虚拟存储设备的一个或多个指令发送队列,以便从所述一个或多个指令发送队列中获取多条读/写请求,所述虚拟内存空间是所述HOST采用内存映射I/O(mmio)的方式模拟出的,所述读/写请求来自所述虚拟机上运行的应用,所述读/写请求包括目标物理存储设备的信息;

请求转发模块703,用于对所述多条读/写请求中的每一条执行第一转发操作,所述第一转发操作包括:所述HOST根据所目标物理存储设备的信息,将所述读/写请求加入所述目标物理存储设备的指令发送队列,以便所述目标存储设备从所述指令发送队列中获取所述读/写请求,以及根据所述读/写请求执行读/写操作。

可选的,所述装置还包括:

响应获取模块705,用于轮询所述至少一个物理存储设备的一个或多个指令响应队列,以便从所述一个或多个指令响应队列中获取多个读/写响应,其中,所述一个或多个指令响应队列的中断为关闭状态或者所述物理机的处理器被设置为忽略所述一个或多个指令响应队列的中断请求,所述读/写响应表示所述目标物理存储设备已执行所述读/写操作,所述读/写响应包括所述目标物理存储设备的信息;

响应转发模块707,用于对所述多个读/写响应中的每一个执行第二转发操作,所述第二转发操作包括:所述HOST根据所述目标物理存储设备的信息,将所述读/写响应加入目标虚拟存储设备的指令响应队列,以便所述应用得到所述读/写响应。

至此,该装置将第一读/写请求的第一读/写响应加入目标虚拟存储设备的指令响应队列,形成了一个完整的根据请求返回响应的处理过程,同样采用轮询的方式从物理存储设备的指令响应队列中获取第二读/写响应,基于上述技术方案,通过轮询虚拟存储设备的指令发送队列,简化了HOST处理读/写请求的过程,提高了软件处理读/写请求的速度,降低了软件处理读/写请求的时延。

需要说明的是,上述两个场景中,上述模块的划分只是示意性表达,并不造成限定,例如,响应获取模块705和请求获取模块701是同一模块,响应转发模块707和请求转发模块703可以是同一模块。

还需要说明的是,响应获取模块705和响应转发模块707还可以单独使用,作为一种处理读/写响应的装置的组成部分,如图8所示,这样,装置800基于上述技术方案,通过进程轮询物理存储设备的指令响应队列,简化了处理读/写响应的过程,提高了软件处理读/写响应的速度,降低了软件处理读/写响应的时延,使应用能更快地收到下发的读/写请求的响应。

图9是一种物理机的示意图,物理机80包括包括硬件层81,宿主机HOST、虚拟机83,硬件层81包括物理存储设备813,硬件层81还可以包括处理器811。物理存储设备813的数量为一个或多个。该至少一个物理存储设备813和处理器811通过总线系统相连,该至少一个物理存储设备813可以包括只读存储器和随机存取存储器,并向处理器811提供指令和数据。该至少一个物理存储设备813包括易失性存储介质和非易失性存储介质中的至少一种。在一些实施方式中,至少一个物理存储设备813存储了如下的元素,可执行模块或者数据结构,或者他们的子集,或者他们的扩展集。硬件层还可以包括网络设备接口,以用于物理主机与其他设备进行通信。

其中,物理存储设备813用于虚拟出虚拟存储设备(例如图中示意的虚拟内存832以及虚拟硬盘833等)供虚拟机VM83使用,一个虚拟机VM83对应至少一个虚拟存储设备,虚拟存储设备用于向虚拟机提供读/写服务,一个虚拟存储设备包括至少一个虚拟块设备。

宿主机(HOST):作为管理层,用以完成硬件资源的管理、分配;为虚拟机呈现虚拟硬件平台;实现虚拟机的调度和隔离。其中,HOST可能是虚拟机监控器(VMM)82;此外,有时VMM和1个特权虚拟机配合,两者结合组成HOST。其中,虚拟硬件平台对其上运行的各个虚拟机提供各种硬件资源,如提供虚拟处理器、内存、虚拟磁盘、虚拟网卡等等。其中,该虚拟磁盘可对应HOST的一个文件或者一个逻辑块设备。虚拟机则运行在HOST为其准备的虚拟硬件平台上,HOST上运行一个或多个虚拟机。

虚拟机83:通过虚拟机软件可以在一台物理计算机上模拟出一台或者多台虚拟的计算机,而这些虚拟机就像真正的计算机那样进行工作,并且对于虚拟机,HOST所虚拟出的各种虚拟存储设备就如同物理存储设备一样,虚拟机上可以安装操作系统835和应用程序836,虚拟机还可访问网络资源。对于在虚拟机中运行的应用程序而言,虚拟机就像是在真正的计算机中进行工作。

图9中的物理机80可以用于执行本发明实施例中所记载的处理读/写请求的方法。在本发明实施例中,HOST调用指令存储器存储的操作指令(该操作指令可存储在操作系统中),执行如图5对应实施例的各种方法流程,具体实现方式、说明和技术效果请参照上文实施例,包括但不限于图5对应的说明内容以及图1、图3的说明内容,此处不再赘述。需要理解的是图9中的物理机与图1中物理机的示意图是类似的,只是图1较为简单,且示意性画出了宿主机与虚拟机监控器间的一种关系,以及虚拟机中的存储前端程序;而图3示意性表达看虚拟机与HOST进行读/写请求处理的过程,图3所示的架构依托于图9中的物理机80。

另一方面,图9中的物理机80可以用于执行本发明实施例中所记载的处理读/写响应的方法。在本发明实施例中,HOST调用指令存储器存储的操作指令(该操作指令可存储在操作系统中),执行如图6对应实施例的各种方法流程,具体实现方式、说明和技术效果请参照请参照上文方法实施例,包括但不限于图6对应的说明内容以及图1、图3和图5与之相关的说明内容,此处不再赘述。

再一方面,图9中的物理机80可以用于执行本发明实施例中所记载的特殊场景下的处理读/写响应的方法,请参照上文的相应段落,此处不再赘述。

需要说明的是,图9中的HOST可以理解为图7和图8所示的装置的一种实现方式,即由HOST使用处理器中运行的进程,执行存储器中的程序或指令来实现的(换言之,即由处理器以及与所述处理器耦合的存储器中的特殊指令相互配合来实现)。这里不再赘述,本发明包括但不限于前述实现方式,应当理解的是,只要按照本发明的思想实现的方案,都落入本发明实施例所保护的范围。

上述本发明实施例揭示的方法可以应用于处理器811中,或者由处理器811实现。处理器811可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器811中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器811可以是通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于指令存储器812和至少一种物理存储设备813,处理器811读取存储介质的信息,结合其硬件完成上述方法的步骤。

应当理解的是,在一种实现方式下,图7和图8对应实施例中的各模块可以是可以由处理器执行存储器中的程序或指令来实现的(换言之,即由处理器以及与所述处理器耦合的存储器中的特殊指令相互配合来实现)。

下面将结合本发明实施例中的附图10到图17,对本发明实施例中的一种虚拟化方法及装置的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。

应理解,本发明实施例的技术方案可以应用于虚拟化场景,在虚拟场景下,一个物理机Host可以虚拟出至少一个虚拟机,每个虚拟机至少有一个虚拟磁盘,每个虚拟磁盘的类型、容量等可以不相同。

图10示出了本发明实施例的应用场景的示意图。如图10所示,该物理机Host100可以为台机,该物理机Host100可以包括虚拟机130和Qemu进程110,该虚拟机130(Virtual Machine,简称“VM”)可以包括虚拟磁盘(Disk),该虚拟磁盘Disk可以是由物理存储设备150虚拟的。

应理解,如图10所示,该虚拟机130、Qemu进程120、虚拟磁盘Disk都可以是一个或者多个,如图中所示,Host100可以包括三个Qemu进程120、虚拟机VM1、虚拟机VM2、虚拟机VM3,虚拟机VM1可以包括Disk1、Disk2,虚拟机VM2可以包括Disk3,虚拟机VM3可以包括Disk4。

具体地,该物理机Host100可以包括为虚拟磁盘Disk提供I/O服务的进程,该进程例如Qemu进程120,通常一个Qemu进程120对应一个虚拟机130,即一个Qemu进程120可以为一个虚拟机130上的至少一个虚拟磁盘Disk提供服务。

具体地,该虚拟磁盘Disk可以是虚拟NVMe设备131,该物理存储设备150可以是物理机Host100内的本地SAS盘、NVMe盘、内存等物理存储设备,也可以是远端的高速存储网络(Storage Area Network,简称“SAN”)设备。

图11示出了本发明实施例的系统框架的示意图。如图11所示,该Host100还可以包括数据平面的转发进程110、Qemu进程120、虚拟机130、KVM模块140,该数据平面的转发进程110可以包括虚拟非易失性内存扩展NVMe驱动111,该Qemu进程120可以包括适配驱动121,该虚拟机130可以包括虚拟NVMe设备131和NVMe驱动132。

具体地,该物理存储设备150可以是物理机Host100内的本地SAS盘、NVMe盘、内存等物理存储设备,也可以是SAN设备。

应理解,该数据平面可以是虚拟化存储数据平面,还可以是配合任何一种轮询方式来实现NVMe设备的高性能虚拟化的数据平面,例如intel的数据平面开发工具(Data Plan Develop Kit,简称“DPDK”),本发明对此不做任何限制。

应理解,该虚拟NVMe驱动111可以是一种解析NVMe协议的方法,例如,可以是预处理NVMe命令的方法。

还应理解,本发明实施例中,适配驱动121的功能可以有多种,例如,Qemu进程120可以调用适配驱动121用于Qemu进程120与虚拟NVMe驱动111进行消息传递,Qemu进程120可以调用适配驱动121用于解析虚拟NVMe设备131的名称,另外,Qemu进程120还可以调用适配驱动121用于与虚拟NVMe驱动111共同完成对虚拟NVMe设备131的虚拟化。

图12示出了虚拟化方法的示意性流程图,该方法可以由物理机Host执行,Host可以包括虚拟机和数据平面的转发进程,数据平面的转发进程可以包括虚拟NVMe驱动,虚拟机可以包括虚拟NVMe设备,如图12所示,该方法包括:

170,转发进程轮询虚拟NVMe设备的门铃doorbell区域。

171,当doorbell区域发生变化时,转发进程调用虚拟NVMe驱动,从doorbell区域发生变化的发送队列中,获取虚拟机下发的NVMe命令,该NVMe命令包括读/写请求。

具体地,在170和171之前,虚拟机内的应用程序还可以向虚拟机内的NVMe驱动下发读/写操作,并且虚拟NVMe设备可以选择一个发送队列,将该NVMe命令放入发送队列尾部;另外,虚拟机内的NVMe驱动可以对发送队列的tail计数加1,并且可以将tail值写入doorbell区域中对应发送队列的位中。当转发进程轮询该虚拟NVMe设备的doorbell区域,就可以从该发送队列中获取该NVMe命令。

180,转发进程调用虚拟NVMe驱动,解析NVMe命令,得到通用读/写请求。

181,转发进程获取物理存储设备对该通用读/写请求的处理结果;

在181中,转发进程可以调用虚拟NVMe驱动,经过地址映射等处理后,向物理存储设备递交读/写请求,物理存储设备处理完成后,可以将响应传递给转发进程。

190,转发进程调用虚拟NVMe驱动,将物理存储设备的处理结果封装为NVMe响应。

在190中,转发进程可以调用虚拟NVMe驱动,将物理存储设备的处理结果封装为NVMe响应,此外,转发进程还可以增加完成队列的tail数。

191,转发进程调用虚拟NVMe驱动,将NVMe响应添加到与发送队列对应的完成队列中。

因此,本发明实施例的虚拟化方法,通过独立的转发进程完成虚拟NVMe设备的读/写操作,并且该转发进程使用轮询的方式替代原有的定时器方式,能够避免Qemu锁竞争,并且能够解决时延长的问题,从而实现了高性能低时延的NVMe虚拟化,提高了虚拟机内应用程序对虚拟NVMe设备的访问速度。

可选地,该Host还可以包括KVM模块,在转发进程调用虚拟NVMe驱动,将NVMe响应添加到与发送队列对应的完成队列中之后,该方法还包括:

192,转发进程调用虚拟NVMe驱动,通过eventfd向KVM模块发送中断请求。

193,KVM模块根据中断请求向虚拟机注入中断。

194,虚拟机从完成队列中,获取NVMe响应。

以上内容介绍了虚拟NVMe设备的工作流程,在虚拟化过程中,通过独立的转发进程完成虚拟NVMe设备的读/写操作,并且转发进程使用轮询的方式替代原有的定时器方式,并且通过eventfd建立完成队列到虚拟机中断的联系,从而实现了高性能低时延的NVMe虚拟化。

可选地,在虚拟NVMe设备进入工作状态之前,该物理机还可以进行准备工作,例如,创建虚拟化NVMe设备、创建发送队列、完成队列和中断等信息。

具体地,当上述准备工作完成后,虚拟机内的应用程序就可以向创建的虚拟NVMe设备下发读/写请求,该读/写请求可以放置于创建的发送队列中,转发进程可以调用虚拟NVMe驱动对该读/写请求,进行预处理和解析,并将处理结果放置在创建的完成队列中。

可见,在虚拟NVMe设备进入工作状态之前,物理机可以对虚拟NVMe设备进行虚拟化处理,如图13所示。

图13示出了虚拟NVMe设备的虚拟化流程图。如图13所示,该Host可以包括Qemu进程,该Qemu进程可以与数据平面的转发进程共享一段内存空间,该共享内存空间可以为doorbell区域并且Qemu进程可以将该共享内存空间映射到虚拟机中的虚拟NVMe设备的第一段BAR空间,同时Qemu进程可以将MSIX表空间,映射到该虚拟NVMe设备的第二段BAR空间。

Qemu进程可以通过ioctl函数,将MSIX表空间中的中断号和eventfd,传递给数据平面,数据平面可以根据中断号以及eventfd,将完成队列与eventfd联系起来,并且可以建立完成队列(Complete queue,简称“CQ”)到eventfd的表格。

KVM模块可以通过eventfd与数据平面连接,以便于转发进程调用虚拟NVMe驱动,通过eventfd向KVM模块发送中断请求;还可以与虚拟机建立连接,比便于KVM模块根据中断请求向虚拟机注入中断。

应理解,该共享内存空间还可以包括第一cap区域和第二cap区域,该第一cap区域可以用于存放namespace信息,该第二cap区域可以包括发送队列。

图14和图16将对图13中的各个步骤进行详细描述,图14示出了虚拟化方法的示意性流程图,该方法可以由物理机Host执行,该物理机Host可以包括Qemu进程,该Qemu进程可以包括适配驱动,如图14所示,该方法包括:

100,转发进程调用虚拟NVMe驱动,根据用户请求创建虚拟NVMe设备。

101,转发进程调用虚拟NVMe驱动,分配Qemu进程与转发进程的共享内存空间,该共享内存空间包括doorbell区域。

100和101中,用户可以向数据平面请求创建虚拟NVMe设备,数据平面的转发进程可以调用虚拟NVMe驱动完成该创建操作,具体地,转发进程可以调用虚拟NVMe驱动,初始化虚拟NVMe设备的BAR空间,并向物理主机Host申请共享内存空间,该共享内存空间可以包括doorbell区域;

应理解,该共享内存空间可以由Qemu进程和数据平面的转发进程共享,该共享内存空间可以如图13中虚线框的doorbell区域所示,并且可以由数据平面分配,以便于数据平面的转发进程在轮询doorbell区域时,可以直接访问这段内存。

110,Qemu进程调用适配驱动,将该共享内存空间映射到该虚拟NVMe设备的第一段BAR空间。

在110中,Qemu进程可以调用适配驱动,通过适配驱动与虚拟NVMe驱动的接口,将该共享内存空间映射可以通过一定方式映射给自己,该方式可以是内存映射(Memory Map,简称“mmap”)的方式或其他方式,本发明对此不做限制。

可选地,在110中,Qemu进程可以调用适配驱动,通过内存映射输入/输出(Memory mapping I/O,简称“MMIO”)的方式,将包括doorbell区域的共享内存空间,映射到虚拟NVMe设备的第一段BAR空间,如图13中的第一段BAR空间所示;另外,Qemu进程可以调用适配驱动,在物理机Host上设置VMCS寄存器,用于防止虚拟机中应用程序访问虚拟NVMe设备的过程中产生陷入陷出。

可见,本发明实施例通过以非退出的MMIO方式代替传统的端口输入/输出(Programming I/O,简称“PI/O”)方式,当虚拟机下发读/写请求时,虚拟存储设备可以避免频繁的陷入陷出,从而实现读/写请求的高性能转发,提高虚拟化性能。

120,Qemu进程调用适配驱动,将MSIX表空间映射到该虚拟NVMe设备的第二段BAR空间。

在120中,Qemu进程可以调用适配驱动,通过PI/O方式将MSIX表空间映射到该虚拟NVMe设备的第二段BAR空间,如图13中的第二段BAR空间所示。

130,Qemu进程调用适配驱动注册回调函数。

可选地,在130中,Qemu进程可以调用适配驱动,注册PI/O模式的回调函数。

应理解,至此,虚拟NVMe设备的虚拟化过程已经完成,虚拟机可以看到一个虚拟NVMe设备,同时虚拟机与虚拟NVMe设备、虚拟NVMe驱动、数据平面、物理存储设备的高性能的数据通道已经建立。

可见,Qemu进程调用适配驱动,并且转发进程调用虚拟NVMe驱动,共同协作完成创建虚拟NVMe设备,从而使后续的读/写操作有较高的存储性能。

可选地,在110之前,该方法还包括:

102,转发进程可以调用虚拟NVMe驱动,根据用户请求创建虚拟NVMe设备的namespace。

在102中,用户可以向数据平面请求创建虚拟NVMe设备的namespace,并且可以向数据平面输入创建虚拟NVMe设备namespace的相关参数,该参数可以是namespace对应的物理存储设备的地址范围、地址映射方式等,该物理存储设备的地址范围例如0-10G,该地址映射方式例如线性映射,本发明对创建虚拟NVMe设备namespace的相关参数不做任何限制。

103,转发进程可以调用虚拟NVMe驱动,初始化虚拟NVMe设备的namespace信息。

在103中,转发进程可以调用虚拟NVMe驱动,初始化虚拟NVMe设备的namespace信息,该信息可以用于当虚拟机加载NVMe驱动并下发identify的管理命令时,由数据平面的转发进程返回给虚拟机,虚拟机内部就可以看到虚拟NVMe设备上的namespace。

可选地,用户可以将创建的虚拟NVMe设备的名称作为参数配置设置给虚拟机。

具体地,当用户启动虚拟机时,Qemu进程被拉起,Qemu进程调用适配驱动的参数解析方法,可以解析虚拟NVMe设备名称,Qemu进程向数据平面的请求打开虚拟NVMe设备,建立Qemu进程和数据平面的管理命令通道,该管理命令通道例如ioctl、mmap等。

可见,本发明实施例的虚拟化方法,用户可以根据需求创建虚拟NVMe设备、虚拟NVMe设备的namespace以及虚拟NVMe设备的名称,增强了用户体验,提高了虚拟化方法的性能。

因此,本发明实施例的虚拟化方法,通过创建虚拟NVMe设备,使后续的转发进程完成虚拟NVMe设备的读/写操作,能够避免Qemu锁竞争,并且能够解决时延长的问题,从而实现了高性能低时延的NVMe虚拟化,提高了虚拟机内应用程序对虚拟NVMe设备的访问速度。

上文中结合图14详细描述了虚拟NVMe设备的虚拟化过程,下文中将结合图15至图17,对本发明实施例的虚拟化的方法中创建完成队列、创建完成队列到中断联系和创建发送队列的过程,进行详细说明。

可选地,如图15所示,在本发明实施例中,在Qemu进程调用适配驱动注册回调函数之后,该方法还包括:

140,转发进程轮询虚拟NVMe设备的doorbell区域。

141,当doorbell区域的0号命令队列中包括创建完成队列的请求时,转发进程调用虚拟NVMe驱动,从0号命令队列中获取虚拟机下发的NVMe命令。

具体地,转发进程可以轮询虚拟NVMe设备的doorbell区域,当虚拟机下发创建完成队列操作命令时,转发进程就可以获取该命令,并进行处理。

在140和141中,当虚拟机的NVMe驱动在加载时,可以根据虚拟机中cpu个数来下发创建相应个数的完成队列的请求,转发进程可以轮询虚拟NVMe设备doorbell区域,当doorbell区域的0号命令队列中包括创建完成队列的请求时,转发进程可以调用虚拟NVMe驱动,从0号命令队列中获取虚拟机下发的NVMe命令。

142,转发进程调用虚拟NVMe驱动解析NVMe命令。

143,转发进程调用虚拟NVMe驱动,通过解析NVMe命令,获取创建完成队列的参数,参数包括完成队列对应的MSIX表中的中断号、完成队列DMA地址、完成队列ID、完成队列深度。

可选地,在143中,转发进程可以调用虚拟NVMe驱动,对获取的创建完成队列的参数中的至少一项进行检查。

具体地,转发进程可以调用虚拟NVMe驱动,可以检查完成队列深度是否超过虚拟NVMe设备支持的最大深度,可以检查对应的完成队列是否存在,可以检查完成队列DMA地址是否正确,可以检查完成队列对应的中断号是否正确。

144,转发进程调用虚拟NVMe驱动,根据参数创建完成队列。

在144中,转发进程可以调用虚拟NVMe驱动,根据参数创建完成队列;此外,转发进程还可以调用虚拟NVMe驱动,其该完成队列添加到虚拟NVMe设备的完成队列链表中,至此,新创建的完成队列已经可以接受响应了。

应理解,虚拟机在使用过程中,也可能下发创建或删除完成队列的操作命令。

上述内容介绍了转发进程调用虚拟NVMe驱动创建完成队列的具体过程,下面将结合图16具体描述转发进程调用虚拟NVMe驱动和Qemu进程调用适配驱动,共同创建完成队列到中断的联系的具体过程。

可选地,如图16所示,在本发明实施例中,在创建完成队列之后,该方法还包括:

150,当虚拟机访问MSIX表空间时,Qemu进程调用适配驱动通过回调函数创建eventfd。

具体地,在150中,当虚拟机向MSIX表空间写入MSIX message时,Qemu可以通过调用适配驱动,调用回调函数,在回调函数中,Qemu进程创建eventfd。

可选地,Qemu通过调用适配驱动,通过PI/O回调函数创建eventfd。

151,Qemu进程调用适配驱动,向KVM模块建立eventfd到虚拟机中MSIX表的中断号的对应关系。

在151中,Qemu进程可以调用适配驱动,将该eventfd和虚拟机的中断号关联,即将该eventfd和MSIX message信息的中断号作为入参,调用KVM模块的接口,向KVM模块建立该eventfd到虚拟机中断的关联,具体地,如图13中的KVM模块到虚拟机的虚线箭头所示,以便于KVM模块根据中断请求向虚拟机注入中断。

152,Qemu进程调用适配驱动,向转发进程发送eventfd与中断号,以便于转发进程调用虚拟NVMe驱动,建立完成队列到eventfd的对应关系。

在152中,Qemu可以通过调用适配驱动,调用PI/O的回调函数,在PI/O的回调函数中,可以通过虚拟驱动与适配驱动的接口,向转发进程发送eventfd和对应的MSIX表中的中断号,以便于转发进程调用虚拟NVMe驱动,建立完成队列到eventfd的对应关系,该对应关系可以是完成队列与中断号的对应表,具体地,eventfd可以如图13中所示,数据平面可以通过eventfd与KVM模块建立连接,以便于转发进程调用虚拟NVMe驱动,通过eventfd向KVM模块发送中断请求,另外,该对应表可以是如图13中的CQ-eventfd的表。

还应理解,一个中断号可以对应一个eventfd,一个eventfd可以对应一个完成队列,因此,Qemu进程可以调用适配驱动,通过向KVM模块,建立eventfd到虚拟机中MSIX表的中断号的对应关系,能够将eventfd与虚拟机中的中断联系起来,此外,Qemu进程可以调用适配驱动,通过向转发进程发送eventfd与中断号,能够将eventfd与转发进程中的完成队列联系起来。

至此,虚拟机的中断与物理机中的完成队列建立了联系,在虚拟机工作状态下,KVM模块可以向虚拟机注入中断,虚拟机可以根据中断号从完成队列中取响应。

可选地,当虚拟机截获MSIX表的unmask变化或mask变化时,Qemu可以通过调用适配驱动,调用PI/O的回调函数,向转发进程发送eventfd和mask,或者eventfd和unmask;

可选地,Qemu可以调用适配驱动,根据mask或unmask设置虚拟NVMe设备是否pending的标识,以便于转发进程根据标识决定是否向KVM模块开启eventfd。

具体地,当虚拟机截获MSIX表的unmask变化时,转发进程可以调用虚拟NVMe驱动,在中断状态表中设置对应中断项的状态,即not pending的标识,并通知Qemu进程。Qemu进程可以通过查询MSIX表,申请Msxi对应的eventfd链接,并且通过ioctl设置给转发进程。

应理解,该中断状态表可以包括完成队列与eventfd的对应关系即CQ-eventfd表和是否pending的标识,该中断状态表可以由Qemu进程和数据平面共享,并且由数据平面分配其存储空间。

在工作状态时,转发进程就可以调用虚拟NVMe驱动,通过eventfd向KVM模块发送中断请求,KVM模块可以向虚拟机中对应cpu中注入中断。

当虚拟机截获MSIX表的mask变化时,转发进程可以调用虚拟NVMe驱动,在中断状态表中设置对应中断项的状态,即pending的标识,并通知Qemu进程。

在工作状态时,Qemu进程可以通过ioctl向KVM模块发送中断请求,KVM模块可以向虚拟机中0号cpu中注入中断。

可选地,如图17所示,在本发明实施例中,在创建完成队列和创建该完成队列与中断的联系之后,该方法还包括:

160,转发进程轮询虚拟NVMe设备的doorbell区域。

161,当doorbell区域的0号命令队列包括创建发送队列的请求,转发进程调用虚拟NVMe驱动,从命令队列中获取虚拟机下发的NVMe命令。

在160和161中,当虚拟机的NVMe驱动在加载时,可以根据虚拟机中cpu个数来下发创建相应个数的发送队列的请求,转发进程可以轮询虚拟NVMe设备doorbell区域,当doorbell区域的0号命令队列中包括创建发送队列的请求时,转发进程可以调用虚拟NVMe驱动,从0号命令队列中获取虚拟机下发的NVMe命令。

162,转发进程调用虚拟NVMe驱动,解析NVMe命令。

163,转发进程调用虚拟NVMe驱动,通过解析NVMe命令,获取创建发送队列的参数,参数包括发送队列DMA地址、发送队列ID、发送队列深度、完成队列ID、发送队列标志位。

可选地,在163中,转发进程可以调用虚拟NVMe驱动,对获取的创建发送队列的参数中的至少一项进行检查。

具体地,转发进程可以调用虚拟NVMe驱动,可以检查发送队列深度是否超过虚拟NVMe设备支持的最大深度,可以检查对应的发送队列是否存在,可以检查发送队列DMA地址是否正确,可以检查发送队列标志位是否正确。,可以检查完成队列ID是否正确。

164,转发进程调用虚拟NVMe驱动,根据参数创建发送队列。

在164中,转发进程可以调用虚拟NVMe驱动,根据参数创建发送队列,此外,转发进程还可以调用虚拟NVMe驱动,其该发送队列添加到虚拟NVMe设备的发送队列链表中,至此,新创建的发送队列已经可以存放虚拟机中的读/写请求了。

在工作状态下,转发进程可以遍历该虚拟NVMe设备的doorbell区域,该doorbell区域中包括至少一个发送队列的有效请求的个数,转发进程一旦发现某个发送队列中存在有效请求等待处理,就可以调用虚拟NVMe驱动处理请求,而不是采用定时器延时触发的方式执行的。

应理解,虚拟机在使用过程中,也可能创建或删除发送队列。

因此,本发明实施例的虚拟化方法,通过创建虚拟NVMe设备、完成队列和完成队列到中断的联系、发送队列,使后续的转发进程完成虚拟NVMe设备的读/写操作,能够避免Qemu锁竞争,并且能够解决时延长的问题,从而实现了高性能低时延的NVMe虚拟化,提高了虚拟机内应用程序对虚拟NVMe设备的访问速度。

上文中结合图10至图17,详细描述了根据本发明实施例的虚拟化方法,下面将描述根据本发明实施例的虚拟化装置。

本发明实施例的虚拟化装置可以是物理机Host100,该物理机Host100包括:虚拟机130和数据平面的转发进程110,数据平面的转发进程110包括虚拟NVMe驱动111,虚拟机130包括虚拟NVMe设备131,

转发进程110,用于:

轮询虚拟NVMe设备131的doorbell区域。

当doorbell区域发生变化时,调用虚拟NVMe驱动111,从doorbell区域发生变化的发送队列中,获取虚拟机130下发的NVMe命令,NVMe命令包括读/写请求。

调用虚拟NVMe驱动111,解析NVMe命令,得到通用读/写请求。

获取物理存储设备150对该通用读/写请求的处理结果。

调用虚拟NVMe驱动111,将物理存储设备150的处理结果封装为NVMe响应。

调用虚拟NVMe驱动111,将NVMe响应添加到与发送队列对应的完成队列中。

因此,本发明实施例的虚拟化方法,通过独立的转发进程完成虚拟NVMe设备的读/写操作,并且该转发进程使用轮询的方式替代原有的定时器方式,能够避免Qemu锁竞争,并且能够解决时延长的问题,从而实现了高性能低时延的NVMe虚拟化,提高了虚拟机内应用程序对虚拟NVMe设备的访问速度。

可选地,该物理机Host100还包括KVM模块140,转发进程130,还用于:在转发进程130调用虚拟NVMe驱动111,将NVMe响应添加到与发送队列对应的完成队列中之后,调用虚拟NVMe驱动111,通过eventfd向KVM模块140发送中断请求。

KVM模块140,用于根据中断请求向虚拟机130注入中断。

虚拟机130,用于从完成队列中,获取NVMe响应。

应理解,根据本发明实施例的虚拟化装置,可对应于执行本发明实施例中的方法,并且装置中的各个的上述和其它操作和/或功能分别为了实现图12中的各个方法的相应流程,为了简洁,在此不再赘述。

可选地,如图11所示,在该物理机Host100中,该物理机Host100可以包括Qemu进程120,该Qemu进程120包括适配驱动121,转发进程110,还用于:

在转发进程110,轮询虚拟NVMe设备131的doorbell区域之前,调用虚拟NVMe驱动111,根据用户请求创建虚拟NVMe设备131。

调用虚拟NVMe驱动111,分配Qemu进程与转发进程的共享内存空间,该共享内存空间包括doorbell区域。

Qemu进程120,还用于:

调用适配驱动121,将该共享内存空间映射到虚拟NVMe设备131的第一段BAR空间。

调用适配驱动121,将MSIX表空间映射到虚拟NVMe设备131的第二段BAR空间。

调用适配驱动121注册回调函数。

应理解,根据本发明实施例的虚拟化装置,可对应于执行本发明实施例中的方法,并且装置中的各个的上述和其它操作和/或功能分别为了实现图14中的各个方法的相应流程,为了简洁,在此不再赘述。

另一方面,图9中的物理机80同样可以执行图14所示的方法,以及,图14所示的方法中相同或相应的名词的说明可以参照图1到图9对应的实施例说明内容为了简洁,在此不再赘述。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

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

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

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

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

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

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

这里不再赘述,本发明包括但不限于前述实现方式,应当理解的是,只要按照本发明的思想实现的方案,都落入本发明实施例所保护的范围。

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