论文阅读 《MDev-NVMe: A NVMe Storage Virtualization Solution with Mediated Pass-Through》

摘要:
1背景NVMe协议传统的SATA接口已不能满足当前对更高吞吐量的IO要求。NVMe协议是使用PCIe接口设计和开发的,可以满足当前的IO要求。PCIe接口取代SATA接口。NVMe包含多个IO(SQ和CQ)队列对。将传统的串行存储改为并行存储可大大提高吞吐量并减少延迟。在NVMeSSD的应用场景中,如数据密集型数据中心存储、系统存储和PCI

1 Background

NVMe协议

传统的SATA接口已经不能满足现在对更高的吞吐量的IO需求,而NVMe协议中正是使用PCIe接口设计和开发的,可以满足当前的IO需求,PCIe接口取代了SATA接口。NVMe中含有多个IO(SQ&CQ)队列对,将传统的串行存储改为并行存储,很大程度上提高了吞吐量,降低了延时。在NVMe SSDs设备的应用场景中,如在数据密集型的数据中心存储、系统存储与PCIe设备之间的加速(如GPUs)都有着不错的表现。而通常情况下NVMe设备的IO性能均未被充分利用,而虚拟机制可以填补这一遗憾。

论文阅读 《MDev-NVMe: A NVMe Storage Virtualization Solution with Mediated Pass-Through》第1张

IO Virtualization

IO虚拟化是云计算的关键部分,此处理方式有着很多优势:1.提升底层设备的利用率;2.简化存储管理;3.为复杂的功能提供简单且相容的接口。前面提到NVMe的设备的利用率不高,因此在虚拟化的环境中可以提升该底层设备的利用率。

NVMe Virtualization(总结别人已有工作)

前人在NVMe的虚拟化中做了一些工作:

Blind Mode:在设备管理器中实现了SCSI到NVMe的转换层;

Virtual Mode:通过在(托管的)VM之间分配I/O队列来获得纯虚拟NVMe堆栈;

Physical Mode:每个虚拟功能使用基于NVMe的控制器。

NVMe Mainstream Virtualization

VirtIO&Userspace driver in QEMU:与本机驱动程序相比,VirtIO和QEMU的用户空间驱动的性能很差;

SPDK:必须使用大表存储,从而加重了内存存储的压力。

2 Motivation

高性能的NVMe虚拟化的需求

1.高吞吐量:NVMe设备已经满足这一条件,所以在添加虚拟机制后底层设备的性能不能大打折扣;

2.低延时:虚拟之后大量的上下文切换会带来延时的负载;

3.设备共享:大量的虚拟机会共享有限的NVMe设备,且要满足VM之间不能互相干扰;

4.底层设备优势保留

5.支持实时迁移:支持实时迁移在虚拟化中十分重要。

注:虚拟机实时迁移是虚拟化技术的一个重要特征,对于近年来不断兴起的数据中心的负载均衡和灾难恢复有非常重大的意义。通过虚拟机的实时迁移,把虚拟机从源物理主机硬件平台迁移到目的物理主机硬件平台上,不仅可以快速消除源物理机上虚拟机之间的资源竞争,还可以通过合并操作大大减少激活的物理机数目,显著提高计算的效率。

不同NVMe设备的比较

virtio:虽然实现了存储设备的虚拟化但大量软件层的存在,严重影响了NVMe设备性能的发挥,本文提到其性能限制了一半;

VFIO:采用 direct pass-through 方式,虽然加速了运行速度,实现了高吞吐量和低延时,没有限制底层设备的发挥,但是这种方式下,NVMe虚拟信息无法写入管理程序,不支持虚拟机的实时迁移,因此在虚拟化方面有不足。

注:

VFIO是一个可以安全的把设备I/O、中断、DMA等暴露到用户空间(userspace),从而可以在用户空间完成设备驱动的框架。

得益于vfio低开销的用户空间直接设备访问,虚拟机设备分配(device assignment)、高性能应用等可以获得更高的I/O性能。

MDev-NVMe:在VFIO的基础上进行设计,为其增加虚拟化功能。VFIO-pci不支持虚拟化,改为VFIO-MDev(模拟PCI),这样可以支持多个VM共享设备。将原始的NVMe驱动程序转化为Linux内核中的MDev-NVMe驱动程序,这样可以尽可能多的传递IO操作单元。而且在该模式下这些物理机和虚拟机上的队列状态信息都有所保留,因此支持虚拟化。该模式绕开了FS,因此也减少了大量软件栈的负载。因此该模式可以满足NVMe虚拟化的所有需求。

Mediated Pass-through(MPT)

介于直接传输和设备完全虚拟化之间,无需修改OS内核,可以直接使用NVMe驱动程序。

3 Design & Implementation

3.1 Architecture

论文阅读 《MDev-NVMe: A NVMe Storage Virtualization Solution with Mediated Pass-Through》第2张

 基于 Virtio and VFIO 改进构建了MDev-NVMe。主要提供了三种重要的功能:1.PCI仿真;2.管理队列仿真;3.IO队列的shadow机制。目的是在发挥底层设备的高性能的同时可以实现物理设备在多个虚拟机上的共享。

Device Emulation 该模式下可以不修改操作系统内核,即可通过PCIe总线连接NVMe设备,这样可以保证底层设备的功能最大化发挥;

Admin Queue Emulation NVMe协议中规定仅仅有一对Admin SQ和CQ,本文中虚拟多个队列对(每个VM中有一对),可以确保每个用户调控自己设备的IO操作;

I/O Queue Shadow 用至多64K个IO队列代替原来的一个IO队列对,因此无需设备仿真;VM中的IO队列经过DMA & LBA转换为相应的物理队列。这种操作不等于设备虚拟化,因此不用考虑虚拟化带来的负载;

DMA Buffer Access 主机DMA可以直接管理guest NVMe设备上DMA缓冲区的内存地址,该模式避免了在频繁的IO操作中CPU过多的进行虚拟机和物理设备间地址转换的操作负载。

3.2 Queue Handling

论文阅读 《MDev-NVMe: A NVMe Storage Virtualization Solution with Mediated Pass-Through》第3张

 大量的Admin队列的操作均在VM初始化的时候创建,因此,Admin的虚拟化不会成为瓶颈;

Queue shadow: 实现虚拟设备与物理设备的直通。因为NVMe设备中不止一个IO SQ CQ 队列,因此这种方案可行。

服务端物理内核绑定IO队列且每个IO提交完成后,中断都会被相应的内核捕获,因此加速了IO操作。

shadow机制中虚拟机上的中断处理实际上是相应的直通链接的物理机上的中断处理,这种操作加速了中断处理。

3.3 DMA & LBA translation   

  本文提出的 guest IO 队列(虚拟机上)可以通过 DMA & LBA 转换的方式与物理机上的IO队列直接相连,这样可以达到更好的IO性能以及实现资源划分。转化后的虚拟机IO队列与物理机上的IO队列相绑定,且转换结果存储在host内核中。此转化过程基于EPT,可以实现在多个虚拟机创建的大量IO队列并共享物理机设备时对转换表进行维护。这种转换基于静态分区策略(各个虚拟机在初始化阶段分配得到NVMe设备连续内存的一部分),转换单元是指向DMA缓冲区的数据指针。MDev-NVMe 模式将客户物理地址转换为主机的物理地址,并且将DMA缓存内容直接写入主存中,保证了多个虚拟设备之间的隔离性。如果虚拟机没有在初始化时分配地址则不会与对应的物理机地址相绑定,此过程也是被MDev-NVMe机制严格控制且被EPT保护,保护了不同VM之间的安全性。Start Logical Block Address (SLBA) 单元在guest上的IO命令可以在申请空间偏移时被更改并复制到主机IO队列中。

3.4 2-Way Polling Mode

虽然对比之前的设计(Virtio)性能提升了,但是在虚拟设备对比本地物理机在性能上还是有明显的断层。因为IO命令中频繁的SQ与CQ导致了IO瓶颈的产生。

论文阅读 《MDev-NVMe: A NVMe Storage Virtualization Solution with Mediated Pass-Through》第4张

Host kernel -> NVMe devices 小于10us,因此这是不足以成为IO瓶颈的。

然而guest中的IO命令会经过两个方面的负载:1. guest IO命令转换和提交时;2. 处理由物理设备产生的中断时(更新门铃寄存器)。为了解决上述两种时间开销,本文将中断内陷转换为主动轮训机制。

1.将guest的SQ和CQ的门铃存储在主机的主存中,因此系统可以更直接的管理guest中的IO操作,通过轮询机制,轮询guest写入shadow 门铃而不是在主机中产生一个MMIO。轮询线程可以直接获取并立即更新SQ和CQ队列。本文中采用了3线程主动轮询,3线程分别处理shadow 门铃的 SQ 尾部,shadow 门铃的 CQ 头部和主机的CQ集合,这样可以获得甚至高于本地平台的主机内核。这些线程可以达到充分利用主机服务器上3个内核且保证轮询线程可以在VM之间共享的目的。

免责声明:文章转载自《论文阅读 《MDev-NVMe: A NVMe Storage Virtualization Solution with Mediated Pass-Through》》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于SpringBoot和Vue的企业级中后台开源项目MVC教程八:母版页(布局页)视图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

kvm linux虚拟机在线扩展磁盘

说明: 1) vmware ESXi虚拟化平台也支持这台在线扩展磁盘功能。 2) kvm虚拟机也支持在线扩展磁盘功能,在线扩展有特定的使用环境,主要用于不能随便停用的生产环境中。 3) 经过测试KVM在线扩展磁盘功能只适用于RHEL/CentOS/OEL6.x环境,5.x不支持在线的扩展磁盘,其它ubuntu等其它Linux我没有测试,不做评论。 本文出自...

jvm之java类加载机制和类加载器(ClassLoader),方法区结构,堆中实例对象结构的详解

一.类加载或类初始化:当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外,JVM将会连续完成3个步骤。 二.类加载时机: 1.创建类的实例,也就是new一个对象 2.访问某个类或接口的静态变量,或者对该静态变量赋值 3.调用类的静态方法 4.反射(Class.forName("com...

Android JNI 学习(十一):Invocation Api

1. 简介 Invocation API允许软件提供商在原生程序中内嵌Java虚拟机。因此可以不需要链接任何Java虚拟机代码来提供Java-enabled的应用程序。 以下代码演示如何使用: #include <jni.h> /* where everything is defined */ //......

关于Ubuntu共享文件夹的设置

一、Xshell连接虚拟机(先关闭虚拟机的防火墙) sudo apt-get install openssh-serve sudo ufw disable sudo ufw allow 22 二、虚拟机设置 设置-->选项-->共享文件夹-->总是启用(同时选择要共享的文件夹) 三、挂载win文件系统 在vmware点击安装vmware-...

用户空间缺页异常pte_handle_fault()分析--(上)【转】

转自:http://blog.csdn.net/vanbreaker/article/details/7881206 版权声明:本文为博主原创文章,未经博主允许不得转载。        前面简单的分析了内核处理用户空间缺页异常的流程,进入到了handle_mm_fault()函数,该函数为触发缺页异常的地址address分配各级的页目录,也就是说现在...

新建的虚拟机如何改IP地址

1.把复制的操作系统关机 2.点击右键->管理->克隆->下一步->虚拟机当前状态->创建完整虚拟机->修改虚拟机名称 位置 3.修改主机名 4.修改主机名与ip的映射地址 5.查看硬件地址 eth1 和HWadder 00:0C........ 6.修改ip 及 eth1(原来是本机的 这里是eth0改为et...