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

3 Design

3.1 Architecture

 基于 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

 大量的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瓶颈的产生。

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之间共享的目的。

猜你喜欢

转载自www.cnblogs.com/Robin5/p/11927590.html