掌桥专利:专业的专利平台
掌桥专利
首页

用以支持虚拟化环境中的SSD设备驱动器与物理SSD之间的SQ/CQ对通信的快速传输的共享存储器机制

文献发布时间:2023-06-19 09:49:27


用以支持虚拟化环境中的SSD设备驱动器与物理SSD之间的SQ/CQ对通信的快速传输的共享存储器机制

技术领域

发明领域总体上涉及计算科学,并且更具体地涉及用以支持虚拟化环境中的SSD设备驱动器与物理SSD之间的SQ/CQ对通信的快速传输的共享存储器机制。

背景技术

高性能计算环境(诸如,活动地板数据中心(raised floor data center))通常需要高性能非易失性大容量存储设备。最近已经出现了由闪速存储器设备组成的固态驱动器(SSD),以提供比硬盘驱动器更快的时延。在传统上,SSD已经通过外围组件接口扩展(PCIe)链路而耦合到计算硬件平台。

最近已经出现了快速非易失性存储器(NVMe),以改进PCIe连接的SSD的吞吐能力。具体地,NVMe扩展了可以将命令馈送到SSD的I/O队列的数量,并且扩展了每个这种队列的大小(当前NVMe规范描述了一种SSD,该SSD支持64K个 I/O队列,其中每个队列能够对多达64K个命令进行排队)。不幸的是,特别是在虚拟化环境中,NVMe吞吐量改进的全部益处无法在对应改进的SSD性能中实现。

图1a、1b和1c示出了在“半虚拟化”环境中的三种常见NVMe实现方式。如将立即解释的那样,为了使应用110或来宾OS 108从/向SSD 103进行读取/写入,无数复杂的软件间通信必须发生。与从NVMe SSD应当实现的性能相比,每个布置的纯粹复杂性导致了总体降低的SSD 103性能。

图1a描绘了被称为标称/标准virtio处理的第一方法。在这里,示出了典型的虚拟化环境,其中主机计算机硬件平台102(例如,高性能服务器)包括所附接或集成的SSD 103。主机操作系统(主机OS)101(例如,Linux)在主机计算机102上执行,并且用于与SSD 103通信的NVMe兼容的设备驱动器101被集成到主机OS 101中。

也被称为“管理程序”的虚拟机监视器106(VMM)(例如,快速仿真器(QEMU)、由VMWare公司提供的VMM等)在主机OS 101上执行。如本领域中已知的,VMM 106是支持多个虚拟机(VM)的执行的应用软件程序。为了便于绘制,图1a仅示出了一个VM 107。如图1a中观察到的,VM 107能够支持整个来宾操作系统(来宾OS)108(例如Linux、Windows、FreeBSD等)、以及在来宾OS上运行的任何应用(为了便于绘制,图1a仅示出了一个这种应用110)。

当实际上VMM 107正在将主机硬件计算机102的实际资源分配给正在VMM 107上执行的多个VM时,VM 107向来宾OS 108呈现完整计算平台的映像,以使得来宾OS 108“认为”它正在其自己的专用硬件上运行。以这种方式,可以在单个主机硬件计算机102上实例化多个隔离的计算环境(每个VM一个这种环境)。

图1a的特定半虚拟化方法使用virtio布置109、111来处理来宾应用110和/或来宾OS 108与SSD设备驱动器104之间的读取/写入命令。如图1a中观察到的,virtio布置包括:集成在来宾OS 108中的virtio前端(FE)驱动器109、以及集成在VMM 106中的virtio后端(BE)驱动器111。FE和BE virtio驱动器通过共享存储器(针对这两个驱动器109、111分配了主机计算机102的主存储器以便向其/从其进行写入/读取)来管理来宾应用110和/或来宾OS 108与VMM 107之间的数据流以及SSD命令队列,该共享存储器加快了来宾与VMM层之间的通信。后端virtio 111将命令传送到SSD设备驱动器104。然而,后端virtio 111遭受低效执行的影响(例如,VMM 107没有为其分配足够的CPU和/或存储器资源),从而导致如下结论:难以向SSD驱动器104和/或硬件103提供具有接近SSD容量的供应负载,和/或从来宾层110/108的角度来看导致了令人失望的时延。

图1b示出了一种改进的方法(被称为“vhost内核”),该方法用主机OS 101中的线程或进程112(vhost内核)替换了virtio-BE。因为SSD命令现在由专用主机OS线程/进程来处理,所以vhost方法相比于图1a的标准virtio方法展现出改进的性能。然而,类似于图1a的virtio方法,vhost内核方法包括用于SSD命令处理的三个分离的软件实体(virtio-FE109、vhost内核112和SSD设备驱动器104),这对应于显著的执行开销和对应的不能够以最大吞吐量来馈送SSD 103,和/或从来宾层110/108的角度来看导致了令人失望的时延。

图1c示出了进一步改进的方法(被称为“vhost用户”),该方法实质上使得能够通过共享存储器113传输机制(例如,其被配置有大量共享存储器空间)在virtio-FE 109与设备驱动器104之间进行直接通信。与图1b和1c的方法相比,图1c的virtio用户方法消除了SSD处理软件的整个层,并且因此与这些方法相比展现出更好的吞吐量和时延。然而,至少由于在virtio-FE 109与SSD驱动器104之间进行协议转换的开销,virtio用户方法仍然难以以接近的吞吐能力来馈送SSD,并且对于完成命令来说展现出了值得注意的时延。

上面描述的任何方法都可以使用硬件辅助的虚拟化,诸如基于内核的虚拟机(KVM)。在硬件辅助的虚拟化的情况下,主机计算机102的CPU核包括用于加速虚拟化过程的特殊指令。例如,在Virtio-BE 111或vhost 112系统的情况下,virtio-FE 109可以执行VM_Exit,接着是执行KVM指令,该KVM指令触发唤醒或以其他方式便于与较低处理实体111/112进行通信。

值得注意的是,这些方法中没有一个尝试其中SSD设备驱动器104被集成在来宾OS108中的真正虚拟化环境。在这里,其中来宾环境108/110执行其自己的SSD设备驱动器104实例的真正虚拟化体验是优选的,这至少是因为来宾环境将具有SSD自己的接口的完全可见性/功能性。

将SSD设备驱动器104集成到来宾OS 108中的问题是传统上已经存在于SSD设备驱动器104与主机硬件102之间的紧密耦合,这使得虚拟化变得困难。

图2a描绘了针对传统NVMe版本的虚拟化的尝试,该版本要求了对SSD控制器硬件227中的特定SSD寄存器空间的写入,以便命令该SSD执行读取/写入操作。在这里,用于提交队列(SQ)和完成队列(CQ)两者的门铃寄存器224(db_SQ、db_CQ)驻留在主机计算机202的存储器映射I/O(MMIO)空间222中。

如本领域中已知的,MMIO空间224在技术上不是主存储器空间,而是物理主存储器的保留部分(或实际CPU寄存器空间),该保留部分旨在模拟外围设备的寄存器空间,诸如SSD控制器227的寄存器空间225。当软件向MMIO空间224进行写入时,MMIO空间的内容会被硬件自动写入到外围设备的寄存器空间225中的对应寄存器中。

在传统NVMe SSD的情况下,设备驱动器204维持提交队列(SQ)和完成队列(CQ)两者。SQ跟踪设备驱动器204已经向SSD 203发出的命令,并且CQ跟踪该SSD正在执行这些命令中的哪些。当设备驱动器204向该 SSD发送命令时,它会在SQ的尾部中输入该命令,并且设置MMIO空间222中的db_SQ门铃。硬件202自动将更新的db_SQ内容写入到SSD寄存器空间225的相同、对应的db_SQ寄存器中。

然后,SSD控制器227从物理上存在于计算机202的主存储器中的SQ获取该命令(在写入命令的情况下,SSD控制器227还从由该命令指定的主存储器位置获取写入数据)。当SSD控制器227完成该命令后,SSD控制器227在CQ的头部处写入对应的条目(在读取的情况下,控制器227还在由读取命令指定的主存储器位置中写入读取响应)并且生成中断。设备驱动器204处理在CQ的头部处输入的该条目,并且在MMIO空间222中的db_CQ门铃中设置信息。然后,硬件202在SSD控制器227的db_CQ门铃寄存器中自动设置相同的对应信息。

不幸的是,因为访问MMIO空间222本质上是低级硬件操作,所以VM 207和/或VMM206不能够向设备驱动器204提供对该空间的访问权。由此,必须由设备驱动器204来执行VM_Exit以执行访问MMIO空间222的(一个或多个)指令。由于VM_Exit对应于显著的低效性(它本质上使VM 207挂起(suspend)),并且由于每个命令都需要两次MMIO访问,因此虚拟地在VM 207上执行设备驱动器204太低效,并且不是可行的解决方案。

为了解决该问题,图2b中描绘的NVMe版本1.3已经引入了仿真SSD控制器228。仿真SSD控制器228例如作为来自主存储器的软件进行操作,并且模拟SSD的实际物理控制器227的行为。因为从VM 207和VMM 206的角度来看与仿真SSD控制器228进行通信不需要低级MMIO访问,所以SSD设备驱动器204能够在(VM 207正在执行的)虚拟化环境中直接向仿真控制器228进行写入,而无需VM exit。

附图说明

结合以下附图,从以下详细描述中可以获得对本发明的更好理解,在附图中:

图1a、1b和1c示出了不同的virtio NVMe SSD实现方式;

图2a和2b示出了针对在虚拟化环境中运行NVMe设备驱动器的不同尝试;

图3示出了用于在虚拟化环境中运行NVMe设备驱动器的改进架构;

图4示出了由图3的架构执行的方法;

图5示出了计算系统。

具体实施方式

然而,在图2b的NVMe 1.3解决方案的情况下,仍然存在一些低效性。特别地,在虚拟化空间中的仿真SSD控制器228与设备驱动器204(它们作为程序代码的两个单独运行的实例)之间存在通信。由此,为了使设备驱动器204向仿真器的门铃寄存器进行写入,标称的进程到进程或线程到线程的通信和/或协议转换需要在SSD驱动器204与仿真器228之间发生。

其次,在仿真器228被实例化为VM/VMM 207/206虚拟化环境的组件的情况下,无论VMM 206向其分配了任何CPU和存储器资源,都会约束其性能水平。在这里,在VMM 206必须将硬件资源分配给许多不同的软件实体(例如,数千个VM、数千个来宾OS等)的情况下,容易使仿真器228缺乏其将SSD 227快速馈送到其全部容量所需要的所有硬件资源。换句话说,图2b的NVMe 1.3解决方案继承了上面关于图1a-c所讨论的virtio解决方案的一些低效性。

图3示出了一种架构,该架构改进了吞吐量并且减少了上面关于图2b所讨论的基本NVMe 1.3解决方案的时延。如图3中观察到的,该改进架构包括NVMe加速器330,该加速器耦合到相同的共享存储器331区域,该区域还被分配给VMM 307和VM 308。在一实施例中,共享存储器区域331被明确地保留在VMM 307和VM 308中以用于NVMe相关的数据和/或业务,使得减少或消除了与其他VMM/VM功能的资源竞争。因此,在理想情况下,在驱动器304与加速器330之间存在专用“管道”。

也就是说,VMM/VM /驱动器307/308/304和加速器330两者都能够直接从/向共享存储区域331进行读取/写入。在虚拟化环境307/308/304和加速器330两者都具有对相同共享存储器区域331的读取/写入访问权的情况下,避免了在不共享相同存储器空间的两个软件实体之间通常发生的低效且语义繁重的进程间或线程间通信或协议转换。由此,有关驱动器304/控制器327通信的吞吐量和时延两者被增强。

此外,如图3中观察到的,加速器330不是VMM 307的组件(它不是虚拟化环境307/308/304的一部分)。加速器330主要负责将由驱动器304(和/或该设备驱动器支持的应用310)写入到共享存储器区域331中的通信(诸如,门铃通信)和/或数据转发到SSD 303。

在这里,如所观察到的,仿真门铃寄存器325、SQ和CQ全部在物理上位于共享存储器区域331中,使得设备驱动器304可以直接访问这些结构中的每一个(具体地,设备驱动器304可以直接向仿真门铃325和SQ两者进行写入,并且直接从CQ进行读取)。在各种实施例中,写入数据在被写入到SSD 303之前还被设备驱动器304写入到共享存储器331,并且来自该SSD的读取数据被写入到共享存储器331中以供设备驱动器304(和/或应用310)立即访问。

在各种实施例中,加速器330包括NVMe驱动器或类似的功能程序代码,用以与SSD控制器327进行通信。在这里,加速器330与SSD控制器327之间的通信可以根据标准非虚拟化NVMe过程来执行。在这里,例如,如果加速器330通过MMIO事务向SSD控制器327的寄存器空间进行写入,则加速器330不需要执行VM_Exit,这是因为它并不从虚拟化环境进行执行。

图4示出了在图3的系统的框架内的端到端命令过程的实施例。当虚拟化环境中的设备驱动器304向SSD发送401命令时,它在共享存储器331中的SQ的尾部中输入该命令,并且设置共享存储器331中的db_SQ门铃。加速器330周期性地检查共享存储器中的db_SQ的状态,并且通知402由驱动器304做出的新条目。然后,加速器330将共享存储器331中的更新的db_SQ内容写入403到SSD寄存器空间325的相同、对应的db_SQ寄存器中。

然后,SSD控制器327从共享存储器331中的SQ获取404(一个或多个)命令(在写入命令的情况下,SSD控制器327还从由该命令指定的共享存储器331中的位置获取写入数据)。当SSD控制器327完成(一个或多个)命令405时,SSD控制器327在共享存储器331中的CQ的头部处写入406对应的一个或多个条目(在读取的情况下,控制器327还在由读取命令指定的共享存储器331的位置中写入读取响应)并且生成中断。响应于该中断,加速器330观察407共享存储器331中的CQ中的更新的信息,设置SSD控制器327中的db_CQ,并且使中断被生成到来宾OS 308和NVMe设备驱动器304。响应于该中断,NVMe设备驱动器304从共享存储器331中的CQ读取408该更新的信息,对其进行处理,并且设置共享存储器331中的db_CQ。

因此,根据以上描述,从SSD控制器327的角度来看,加速器331表现得类似于NVMe设备驱动器,并且从来宾OS 304和虚拟化NVMe设备驱动器304的角度来看,该加速器表现得类似于SSD控制器。

在一实施例中,NVMe设备驱动器304被配置成:向在共享存储器331中的SQ中输入的命令附加随着每个下一个命令递增的值(例如,在以0进行初始化之后,第一个命令被附加有值1,第二个命令被附加有值2,第三个命令被附加有值3等等)。加速器周期性地检查共享存储器中的SQ的状态,并且记录在共享存储器中的SQ中输入的任何命令的最大值/最高值(将在SQ中输入的最后一个命令的值)。

在对SQ的状态进行下一次检查时,加速器330再次标识被分配给该队列中的命令的最高值,并且将该最高值与其来自先前检查的记录值进行比较。如果新的最高值与来自先前检查的最高值不同,则加速器可以立即将已经在SQ中输入了多少个新命令标识为这两个值之间的差。在知道了已经将多少个新命令输入到共享存储器331中的SQ中的情况下,加速器可以将其通知给SSD控制器327。

为了减少虚拟化堆栈(来宾OS 308 /设备驱动器304)与用于共享存储器331的加速器330之间的争用(contention)/颠簸(thrashing),虚拟化堆栈被赋予以足够大的时间和/或数据块对共享存储器的访问权,以完全地写入SQ并且设置共享存储器中的db_SQ。根据当前的NVMe规范,对SQ的更新可能多达64字节、加上用于设置db_SQ的附加字节。因此,当虚拟化堆栈被赋予对共享存储器331的访问权时,它按每个新命令来维持不中断的访问,直到已经将多于64字节的信息写入到共享存储器中为止(虚拟化堆栈不会放弃对共享存储器的访问权,直到已经按每个命令更新了SQ和db_SQ两者为止)。

类似地,针对该过程的完成结束,按每个命令完成,将16字节的信息写入到CQ的头部中。由此,按CQ头部处的每个完成条目,将对共享存储器331的至少16字节价值的访问权作为单个块例如给予到控制器327,以允许不中断地将新条目写入到CQ中。要注意的是,这种写入可以完全地用硬件来执行,作为从控制器327到共享存储器331的直接存储器访问(DMA),或者完成条目(和任何读取响应数据)通过硬件从SSD 303到共享存储器331的传输可以由加速器330用软件来控制。

在前者(DMA)的情况下,对共享存储器的不中断访问权被有效地给予到控制器。在后者(软件控制)的情况下,该不中断访问权被给予到加速器330。要注意的是,从共享存储器中的SQ到SSD 303的传输也可以通过DMA(在这种情况下,SSD控制器327有效地具有对该传输的控制)或用软件(在这种情况下,加速器330具有控制)来执行。

在从共享存储器到SSD控制器327中的db_SQ寄存器的db_SQ传输、或从共享存储器331到SSD 303的SQ传输中,不需要例如在某些其他中间存储器空间中对信息进行额外拷贝。也就是说,对来自共享存储器331的信息的读取被直接写入到SSD 303中。

尽管图3和图4的讨论集中在单个SQ/SC对的处理上,但是要注意的是,当前的NVMeSSD能够支持64k个这种对。由此,在各种实施例中,按每个SSD 303,可以存在多达64k个不同的共享存储器实例。也就是说,单个SSD可以支持64k个不同的虚拟化堆栈(来宾OS/来宾VM/驱动器的64k个独特集合)。在一实施例中,向每个这种虚拟化堆栈提供其自己的独特共享存储器空间。取决于实现方式,单个加速器331可以与所有64k个共享存储器区域进行对接作为其被分配的共享存储器空间总量中的单独、隔离的分区,并且向/从单个SSD信道式传送(channel)SQ/SC对业务。

再次参考图3的架构,要注意的是,与原始数据命令和/或数据相反,从设备驱动器304发送到SSD 303的管理命令可以通过比共享存储器331区域更低性能的连接332来传递。例如,可以使用标称的线程到线程通信、UNIX套接字等。在这里,精确流程包括:设备驱动器304将管理命令发送到仿真SSD控制器328。然后,仿真SSD控制器328通过标称非共享存储器通信将该命令发送到加速器331。

图5提供了计算系统500(例如,智能电话、平板计算机、膝上型计算机、台式计算机、服务器计算机等)的示例性描绘。如图5中观察到的,基本计算系统500可以包括中央处理单元501(其可以包括例如多个通用处理核515_1至515_X)、以及设置在多核处理器或应用处理器上的主存储器控制器517、系统存储器502、显示器503(例如,触摸屏、平板)、本地有线点对点链路(例如,USB)接口504、各种网络I/O功能505(诸如,以太网接口和/或蜂窝调制解调器子系统)、无线局域网(例如WiFi)接口506、无线点对点链路(例如,蓝牙)接口507和全球定位系统接口508、各种传感器509_1至509_Y、一个或多个相机510、电池511、功率管理控制单元512、扬声器和麦克风513、以及音频编码器/解码器514。

应用处理器或多核处理器550可以包括在其CPU 501内的一个或多个通用处理核515、一个或多个图形处理单元516、存储器管理功能517(例如,主机侧存储器控制器)和I/O控制功能518。通用处理核515通常执行计算系统的系统和应用软件。图形处理单元516通常执行图形密集型功能以便例如生成在显示器503上呈现的图形信息。

I/O控制功能可以包括外围控制集线器或其他电路,该外围控制集线器或其他电路具有至大容量非易失性存储装置520的接口(例如,至固态驱动器(SSD)的接口(例如,其中SSD是NVMe SSD的PCIe链路、至磁盘驱动器的接口等))。存储器控制功能517与系统存储器502对接,以向/从系统存储器502写入/读取数据。系统存储器可以被实现为多级系统存储器。

在各种实现方式中,计算机500是其上安装有软件以实现加速器的高性能计算机(例如,高性能服务器计算机),该加速器在物理SSD与虚拟化堆栈之间通过共享存储器来传输SQ/CQ对的通信,该虚拟化堆栈包括如上文所描述的NVMe设备驱动器。

触摸屏显示器503、通信接口504-507、GPS接口508、传感器509、(一个或多个)相机510、以及扬声器/麦克风编解码器513、514中的每一个全部可以被视为相对于整个计算系统的各种形式的I/O(输入和/或输出),该计算系统在合适的情况下还包括集成的外围设备(例如,一个或多个相机510)。根据实现方式,这些I/O组件中的各种组件可以被集成在应用处理器/多核处理器550上,或者可以位于管芯外或位于应用处理器/多核处理器550的封装外部。功率管理控制单元512通常控制系统500的功率消耗。

本发明的实施例可以包括如上所阐述的各种过程。这些过程可以体现在机器可执行指令中。这些指令可以用于使通用或专用处理器执行某些过程。替代地,这些过程可以由包含用于执行这些过程的硬连线逻辑电路或可编程逻辑电路(例如,FPGA、PLD)的特定/定制硬件组件来执行,或者由经编程的计算机组件和定制硬件组件的任何组合来执行。

本发明的元件还可以被提供作为用于存储机器可执行指令的机器可读介质。机器可读介质可以包括但不限于:软盘、光盘、CD-ROM和磁光盘、闪速存储器、ROM、RAM、EPROM、EEPROM、磁卡或光卡、传播介质、或适合于存储电子指令的其他类型的介质/机器可读介质。例如,本发明可以被下载作为计算机程序,该计算机程序可以作为体现在载波或其他传播介质中的数据信号经由通信链路(例如,调制解调器或网络连接)被从远程计算机(例如,服务器)传送到作出请求的计算机(例如,客户端)。

在前述说明书中,已经参考其特定示例性实施例描述了本发明。然而,将显然的是,在不脱离如所附权利要求书中阐述的本发明的更宽泛的精神和范围的情况下,可以对其做出各种修改和改变。因而,要以说明性而非限制性的意义来看待说明书和附图。

相关技术
  • 用以支持虚拟化环境中的SSD设备驱动器与物理SSD之间的SQ/CQ对通信的快速传输的共享存储器机制
  • 在虚拟化环境中动态分配物理存储设备资源的机制
技术分类

06120112318601