一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

可扩展性的NVMe存储虚拟化方法和系统与流程

2022-03-05 04:18:08 来源:中国专利 TAG:

可扩展性的nvme存储虚拟化方法和系统
技术领域
1.本发明涉及存储虚拟化的技术领域,具体地,涉及可扩展性的nvme存储虚拟化方法和系统,尤其涉及一种高可扩展性的nvme存储虚拟化方法和系统。


背景技术:

2.随着云计算技术,尤其是虚拟化技术的发展,云服务产商提供的云服务愈加稳定与成熟,这也吸引了更多的客户租用云服务,云环境更加复杂,需求更加多样。在存储方面,云服务产商一方面关注云存储性能,另一方面关注如何提高系统可扩展性,从而能为更多的客户提供服务,提高存储资源利用率,减少运营成本。近几年,具有轻便性,高可扩展性的容器技术以及结合传统虚拟机高隔离性特性的安全容器技术被广泛应用在云环境中,得益于容器的轻便性,云厂商使用容器来进行快速和大规模部署,对云环境混合部署虚拟机、安全容器、容器以及系统可扩展性提出新的要求,也给当前云存储虚拟化框架带来新的挑战。比如,在高密度容器云环境下,如果云存储虚拟化框架可扩展性较差,势必导致存储资源无法被充分利用,提高运营成本,降低竞争力。
3.当前一些传统虚拟化技术对可扩展性支持较差。传统nvme ssd虚拟化框架更多关注单机单设备场景下对单一应用场景的存储支持,无法满足复杂云场景下虚拟机/安全容器和容器混合部署以及高可扩展性的需求。主流的软件管理nvme虚拟化方案有virtio、spdk、vfio和mdev。virtio主要包括virtio-blk和virtio-scsi,因为安全容器kata-container默认采用virtio-scsi,所以以virtio-scsi为代表进行分析,virtio-scsi支持安全容器和普通runc容器混部,但是通过实验进行性能测试,数据表明在容器密度较高的情况下多个容器之间性能差异较大,性能公平性较差,并且iops性能表现差于mdev方案,如图1所示。spdk需要将nvme设备与原始驱动先进行解绑,然后再与自己的用户态驱动进行绑定,所以只能支持安全容器运行,无法同时支持普通容器,而且当前kata-container对spdk的支持还不够成熟。vfio虽然通过设备直通能够带来较好的性能提升,但缺牺牲了设备共享能力,不符合高密度多容器共享设备的需求。mdev-nvme方案基于vfio-mdev,对宿主机的nvme驱动进行修改,只要通过sysfs系统创建mdev设备就能供虚拟机使用,并且能够预留一部分nvme物理队列资源给原生驱动,因此能够同时支持安全容器和容器进行混部,创建mdev设备需要预先分配好nvme物理队列资源,并且在mdev设备释放之前无法重新分配物理队列资源,因此能创建mdev的数量受限于总的分配给mdev的物理队列资源,同时创建一个mdev设备就需要一个i/o轮询线程,对服务cpu资源占用较高,因此mdev方案的可扩展性较差。硬件辅助虚拟化方案主要是sr-iov,通过pf创建多个vf后无法保留原生pf,只能将vf直通给虚拟机,因此不支持普通容器运行,同时sr-iov需要硬件特性支持,硬件成本较高,缺乏虚拟机监控器的介入也限制了sr-iov资源分配的灵活性和可扩展性。
4.在高密度云场景下,对nvme存储资源的分配与调度必须具有灵活性和可扩展性,同时保证共享资源之间的隔离性与公平性,减少不同虚拟机和容器之间的性能干扰,以及不同虚拟机和容器之间物理资源的公平配置,以提供良好的整体服务质量。
5.在公开号为cn104049912a的专利文献中公开了一种基于虚拟化平台的虚拟化存储管理,该方法的具体方法包括:平台,并在虚拟化平台上开发一个存储管理虚拟机;2)存储管理虚拟把节点上的直连磁盘机汇聚成存储资源池;3)建立各台服务器节点上的存储管理虚拟机通信之间机制;4)每个节点上的存储资源池,汇聚成一个应用存储资源池;5)通过虚拟网络将应用存储资源池,提供给虚拟化平台,作为虚拟化的基础资源。
6.因此,需要提出一种技术方案以改善上述技术问题。


技术实现要素:

7.针对现有技术中的缺陷,本发明的目的是提供一种可扩展性的nvme存储虚拟化方法和系统。
8.根据本发明提供的一种可扩展性的nvme存储虚拟化方法,所述方法包括如下步骤:
9.步骤s1:输入系统分配给虚拟机/安全容器的物理队列数目,构建物理资源池,剩余设备物理队列将预留给原生nvme驱动,给普通容器使用;
10.步骤s2:输入系统所需要的轮询控制器数目,系统创建相应数目的轮询控制器,每个轮询控制器创建一个i/o轮询线程,处理i/o任务;
11.步骤s3:输入虚拟机/安全容器需要的存储资源数量,存储资源管理模块分配给相应的存储资源;
12.步骤s4:虚拟机/安全容器被分配给对应的轮询控制器;
13.步骤s5:轮询控制器给虚拟机/安全容器分配物理队列,i/o轮询线程处理虚拟机/安全容器的i/o任务,通过nvme指令地址翻译模块进行地址翻译;
14.步骤s6:判断i/o任务是否结束,若没有结束则返回步骤s5继续执行。
15.优选地,所述步骤s1中构建物理队列资源池包括如下步骤:
16.步骤s1.1:根据输入系统的物理队列数目获取原生nvme驱动中相应的物理队列数目,标识为mdev queue,与原生nvme驱动其他物理队列进行区分;
17.步骤s1.2:将所有的mdev queues进行包装,添加mdev需要使用的属性,用全局结构pool维护;
18.步骤s1.3:提供轮询控制器模块申请物理队列资源的接口,分配给轮询控制器所需的物理队列资源。
19.优选地,所述步骤s2中创建轮询控制器包括如下步骤:
20.步骤s2.1:向物理资源池申请需要的物理队列资源,添加到预备物理资源池;
21.步骤s2.2:创建i/o轮询线程,并绑定到cpu核心上;
22.步骤s2.3:轮询控制器初始化虚拟机链表,创建虚拟机/安全容器时根据其虚拟控制器id分配到相应的轮询控制器,添加到虚拟机链表上;
23.步骤s2.4:i/o轮询线程遍历虚拟机链表,判断虚拟机是否有i/o任务需要处理,按设定的调度算法调度虚拟机;
24.步骤s2.5:初始化i/o上下文,根据虚拟机的虚拟队列从预备物理资源池获取物理队列,将物理队列与虚拟队列进行绑定,物理队列分为1:1物理队列以及1:n物理队列;
25.步骤s2.6:i/o轮询线程处理i/o任务,包括从虚拟提交队列读取nvme指令、翻译
nvme指令和提交nvme指令;从虚拟完成队列写入nvme指令完成信息;从物理完成队列读取nvme指令完成信息;
26.步骤s2.7:将物理队列与虚拟队列进行解绑,返回步骤s2.4。
27.优选地,所述步骤s3中分配虚拟机/安全容器需要的存储资源包括如下步骤:
28.步骤s3.1:通过fdisk创建一个nvme分区,所有mdev设备共用该分区;
29.步骤s3.2:将该nvme分区划分成固定大小的份额;
30.步骤s3.3:输入虚拟机/安全容器需要的存储资源数量,系统分配给相应的存储资源片段,记录该片段在分区的起始偏移量;下次分配从未分配的片段开始;
31.步骤s3.4:根据该片段在分区的起始偏移量翻译nvme指令中的start logical block address,完成对相应存储资源的访问。
32.优选地,所述步骤s4中使用round-robin算法分配虚拟机/安全容器等额的运行时间片包括如下步骤:
33.步骤s4.1:设定round-robin的时间片vctrl_poll_ms以及虚拟机进入idle状态的时间阈值idle_timeout_ms,设n为一个轮询控制器需要调度的总虚拟机数量,求出idle_timeout_ms:
34.idle_timeout_ms=vctrl_poll_ms*n*2
35.步骤s4.2:通过last记录虚拟机刚被调度的时间,now记录虚拟机当前的时间,设now与last的差值为δ,如果δ《vctrl_poll_ms,则说明虚拟机仍拥有执行i/o任务的时间片,继续执行i/o任务;如果δ≥vctrl_poll_ms,则调度下一个虚拟机;
36.步骤s4.3:通过last_io_t记录虚拟机最后一次执行i/o任务的时间,设当前时间now与last_io_t的差值为β,如果β》idle_timeout_ms,说明虚拟机无i/o活动的时间已经超过阈值idle_timeout_ms,进入idle状态,不再需要被调度,等到有i/o任务后再重新加入调度队列;
37.所述步骤s5中使用硬件iommu进行i/o地址翻译包括如下步骤:
38.步骤s5.1:加载nvme模块时创建iommu domain;
39.步骤s5.2:虚拟机i/o地址空间发生变化时,添加一个虚拟机各异的起始偏移量,调用vfio_pin_pages接口获取连续的物理页的起始地址hpa,将物理页固定住,通过iommu domain提供的接口进行iommu映射和反映射,记录gpa与hpa的映射关系;
40.步骤s5.3:翻译nvme指令,将nvme指令中的gpa添加一个虚拟机各异的起始偏移量;
41.步骤s5.4:iommu将gpa翻译成hpa,进行dma操作,完成i/o读写任务;
42.步骤s5.5:卸载nvme模块时释放iommu domain的资源。
43.本发明还提供一种可扩展性的nvme存储虚拟化系统,所述系统包括如下模块:
44.模块m1:输入系统分配给虚拟机/安全容器的物理队列数目,构建物理资源池,剩余设备物理队列将预留给原生nvme驱动,给普通容器使用;
45.模块m2:输入系统所需要的轮询控制器数目,系统创建相应数目的轮询控制器,每个轮询控制器创建一个i/o轮询线程,处理i/o任务;
46.模块m3:输入虚拟机/安全容器需要的存储资源数量,存储资源管理模块分配给相应的存储资源;
47.模块m4:虚拟机/安全容器被分配给对应的轮询控制器;
48.模块m5:轮询控制器给虚拟机/安全容器分配物理队列,i/o轮询线程处理虚拟机/安全容器的i/o任务,通过nvme指令地址翻译模块进行地址翻译;
49.模块m6:判断i/o任务是否结束,若没有结束则返回模块m5继续执行。
50.优选地,所述模块m1中构建物理队列资源池包括如下模块:
51.模块m1.1:根据输入系统的物理队列数目获取原生nvme驱动中相应的物理队列数目,标识为mdev queue,与原生nvme驱动其他物理队列进行区分;
52.模块m1.2:将所有的mdev queues进行包装,添加mdev需要使用的属性,用全局结构pool维护;
53.模块m1.3:提供轮询控制器模块申请物理队列资源的接口,分配给轮询控制器所需的物理队列资源。
54.优选地,所述模块m2中创建轮询控制器包括如下模块:
55.模块m2.1:向物理资源池申请需要的物理队列资源,添加到预备物理资源池;
56.模块m2.2:创建i/o轮询线程,并绑定到cpu核心上;
57.模块m2.3:轮询控制器初始化虚拟机链表,创建虚拟机/安全容器时根据其虚拟控制器id分配到相应的轮询控制器,添加到虚拟机链表上;
58.模块m2.4:i/o轮询线程遍历虚拟机链表,判断虚拟机是否有i/o任务需要处理,按设定的调度算法调度虚拟机;
59.模块m2.5:初始化i/o上下文,根据虚拟机的虚拟队列从预备物理资源池获取物理队列,将物理队列与虚拟队列进行绑定,物理队列分为1:1物理队列以及1:n物理队列;
60.模块m2.6:i/o轮询线程处理i/o任务,包括从虚拟提交队列读取nvme指令、翻译nvme指令和提交nvme指令;从虚拟完成队列写入nvme指令完成信息;从物理完成队列读取nvme指令完成信息;
61.模块m2.7:将物理队列与虚拟队列进行解绑,返回模块m2.4。
62.优选地,所述模块m3中分配虚拟机/安全容器需要的存储资源包括如下模块:
63.模块m3.1:通过fdisk创建一个nvme分区,所有mdev设备共用该分区;
64.模块m3.2:将该nvme分区划分成固定大小的份额;
65.模块m3.3:输入虚拟机/安全容器需要的存储资源数量,系统分配给相应的存储资源片段,记录该片段在分区的起始偏移量;下次分配从未分配的片段开始;
66.模块m3.4:根据该片段在分区的起始偏移量翻译nvme指令中的start logical block address,完成对相应存储资源的访问。
67.优选地,所述模块m4中使用round-robin算法分配虚拟机/安全容器等额的运行时间片包括如下模块:
68.模块m4.1:设定round-robin的时间片vctrl_poll_ms以及虚拟机进入idle状态的时间阈值idle_timeout_ms,设n为一个轮询控制器需要调度的总虚拟机数量,求出idle_timeout_ms:
69.idle_timeout_ms=vctrl_poll_ms*n*2
70.模块m4.2:通过last记录虚拟机刚被调度的时间,now记录虚拟机当前的时间,设now与last的差值为δ,如果δ《vctrl_poll_ms,则说明虚拟机仍拥有执行i/o任务的时间片,
继续执行i/o任务;如果δ≥vctrl_poll_ms,则调度下一个虚拟机;
71.模块m4.3:通过last_io_t记录虚拟机最后一次执行i/o任务的时间,设当前时间now与last_io_t的差值为β,如果β》idle_timeout_ms,说明虚拟机无i/o活动的时间已经超过阈值idle_timeout_ms,进入idle状态,不再需要被调度,等到有i/o任务后再重新加入调度队列;
72.所述模块m5中使用硬件iommu进行i/o地址翻译包括如下模块:
73.模块m5.1:加载nvme模块时创建iommu domain;
74.模块m5.2:虚拟机i/o地址空间发生变化时,添加一个虚拟机各异的起始偏移量,调用vfio_pin_pages接口获取连续的物理页的起始地址hpa,将物理页固定住,通过iommu domain提供的接口进行iommu映射和反映射,记录gpa与hpa的映射关系;
75.模块m5.3:翻译nvme指令,将nvme指令中的gpa添加一个虚拟机各异的起始偏移量;
76.模块m5.4:iommu将gpa翻译成hpa,进行dma操作,完成i/o读写任务;
77.模块m5.5:卸载nvme模块时释放iommu domain的资源。
78.与现有技术相比,本发明具有如下的有益效果:
79.1、本发明通过构建物理队列资源池和细粒度存储资源管理模块提高系统可支持mdev设备的数量,提高系统的可扩展性;物理队列资源池将mdev设备资源(虚拟队列)与物理队列资源进行解耦,从而提高物理队列资源分配的灵活性;
80.2、本发明存储资源管理模块细粒度分配mdev设备存储资源,不再依靠nvme分区进行存储资源的划分与隔离,从而提高存储资源分配的灵活性;本发明通过创建i/o轮询控制器模块和利用硬件iommu翻译减少系统在高密度安全容器环境下对cpu资源的消耗,从而提高系统的整体性能以及各个安全容器之间的性能公平性;
81.3、本发明i/o轮询控制器模块优化i/o轮询线程处理i/o任务的过程,提高线程cpu利用率;硬件iommu翻译模块利用硬件iommu进行i/o地址翻译,减少系统对宿主机cpu资源的占用;
82.4、本发明提出了一种基于中介透传方案的高可扩展性,支持安全容器和容器混合部署的高性能nvme虚拟化系统方法。
附图说明
83.通过阅读参照以下附图对非限制性实施例所作的详细描述,本发明的其它特征、目的和优点将会变得更明显:
84.图1为本发明多容器微基准virtio-scsi、mdev随机读测试iops实验结果图;
85.图2为本发明高可扩展性的nvme虚拟化方案系统架构图;
86.图3为本发明轮询控制器架构图;
87.图4为本发明80个安全容器微基准随机读测试iops实验结果图;
88.图5为本发明160个安全容器微基准随机读测试iops实验结果图;
89.图6为本发明整体性能对比实验结果图。
具体实施方式
90.下面结合具体实施例对本发明进行详细说明。以下实施例将有助于本领域的技术人员进一步理解本发明,但不以任何形式限制本发明。应当指出的是,对本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变化和改进。这些都属于本发明的保护范围。
91.针对现有技术中的缺陷,为满足容器与安全容器混合部署,以及云环境中高密度容器可扩展性的需求,决定基于mdev方案进行开发与优化,本发明提出一种针对单机单设备高可扩展性的nvme存储虚拟化方法和系统,图2为系统的整体架构图,从物理队列分配与调度、优化i/o轮询线程、修改存储资源分配方式、优化nvme指令地址翻译过程这四个方面提高系统整体的可扩展性。
92.本发明包括物理队列资源池模块、轮询控制器模块、nvme指令地址翻译模块、存储资源管理模块。
93.根据本发明提供高可扩展性的nvme存储虚拟化方法和系统,包括:
94.步骤s1:输入系统分配给虚拟机/安全容器的物理队列数目,构建物理资源池,剩余设备物理队列将预留给原生nvme驱动,从而给普通容器使用;
95.步骤s2:输入系统所需要的轮询控制器数目。系统会创建相应数目的轮询控制器,每个轮询控制器创建一个i/o轮询线程,负责处理i/o任务;
96.步骤s3:输入虚拟机/安全容器需要的存储资源数量,存储资源管理模块分配给相应的存储资源;
97.步骤s4:虚拟机/安全容器被分配给对应的轮询控制器;
98.步骤s5:轮询控制器给虚拟机/安全容器分配物理队列,i/o轮询线程处理虚拟机/安全容器的i/o任务,通过nvme指令地址翻译模块进行地址翻译;
99.步骤s6:判断i/o任务是否结束,若没有结束则返回步骤s5继续执行。
100.物理队列资源池模块,主要解决的问题就是mdev物理队列资源分配对mdev设备数量的限制问题,原有设计中虚拟机的虚拟队列与物理队列一一对应,从而限制了可创建mdev设备的数量。解决方案是构建物理队列资源池,将mdev设备资源(虚拟队列)与物理队列资源进行解耦,从而提高物理队列资源分配的灵活性。
101.物理队列资源池包括如下步骤:
102.步骤s1.1:根据输入系统的物理队列数目获取原生nvme驱动中相应的物理队列数目,标识为mdev queue,从而与原生nvme驱动其他物理队列进行区分;
103.步骤s1.2:将所有的mdev queues进行包装,添加mdev需要使用的属性,然后用一个全局结构pool维护起来;
104.步骤s1.3:提供轮询控制器模块申请物理队列资源的接口,分配给轮询控制器所需的物理队列资源。
105.轮询控制器模块,主要解决的问题就是i/o轮询线程对系统可扩展性的限制。mdev方案中每创建一个虚拟机都需要创建一个对应的i/o轮询线程,并绑定到某个cpu核心上,如果多个虚拟机的i/o轮询线程绑定到不同的cpu核心上,则会使物理机多个cpu核心被占用,导致可供虚拟机虚拟化使用的cpu资源减少,从而限制了系统的可扩展性。一个轮询控制器只有一个轮询i/o线程,负责处理分配给该轮询控制器的所有虚拟机/安全容器,大大
减少轮询线程的创建数量,提高了系统的整体可扩展性。
106.轮询控制器包括如下步骤:
107.步骤s2.1:向物理资源池申请需要的物理队列资源,添加到自己的预备物理资源池;
108.步骤s2.2:创建i/o轮询线程,并绑定到某个cpu核心上;
109.步骤s2.3:轮询控制器初始化虚拟机链表,创建虚拟机/安全容器时根据其虚拟控制器id分配到相应的轮询控制器,添加到虚拟机链表上;
110.步骤s2.4:i/o轮询线程遍历虚拟机链表,判断虚拟机是否有i/o任务需要处理,按设定的调度算法调度虚拟机;
111.步骤s2.5:初始化i/o上下文,根据虚拟机的虚拟队列从预备物理资源池获取物理队列,将物理队列与虚拟队列进行绑定,物理队列分为1:1物理队列以及1:n物理队列;
112.步骤s2.6:i/o轮询线程处理i/o任务,包括从虚拟提交队列读取nvme指令、翻译nvme指令、提交nvme指令;从虚拟完成队列写入nvme指令完成信息;从物理完成队列读取nvme指令完成信息;
113.步骤s2.7:将物理队列与虚拟队列进行解绑,返回步骤s2.4。
114.调度算法基于round-robin算法包括如下步骤:
115.步骤s4.1:设定round-robin的时间片vctrl_poll_ms,以及虚拟机进入idle状态的时间阈值idle_timeout_ms,设n为一个轮询控制器需要调度的总虚拟机数量,那么可以求出idle_timeout_ms:
116.idle_timeout_ms=vctrl_poll_ms*n*2
117.步骤s4.2:通过last记录虚拟机刚被调度的时间,now记录虚拟机当前的时间,设now与last的差值为δ,如果δ《vctrl_poll_ms,则说明虚拟机仍拥有执行i/o任务的时间片,继续执行i/o任务;如果δ≥vctrl_poll_ms,则调度下一个虚拟机;
118.步骤s4.3:通过last_io_t记录虚拟机最后一次执行i/o任务的时间,设当前时间now与last_io_t的差值为β,如果β》idle_timeout_ms,说明虚拟机无i/o活动的时间已经超过阈值idle_timeout_ms,可以进入idle状态,不再需要被调度,等到有i/o任务后再重新加入调度队列。
119.nvme指令地址翻译模块,主要通过硬件iommu来实现nvme指令中i/o地址的翻译。mdev方案中通过虚拟iommu,用软件形式实现了页表,页表维护了i/o virtual address(iova)、host physical address(hpa)与host i/o virtual address(host iova)之间的映射关系,翻译nvme指令时都要占用cpu资源查询页表,进行翻译,将iova翻译成host iova,虚拟iommu介入地址翻译,查询页表一定程度上占用了部分能给虚拟机提供的cpu资源。通过将这一部分逻辑硬件卸载到硬件iommu,能够减少i/o地址翻译占用的cpu资源,提高系统整体可扩展性。
120.通过硬件iommu进行i/o地址翻译,包括如下步骤:
121.步骤s5.1:加载nvme模块的时候创建iommu domain;
122.步骤s5.2:虚拟机i/o地址空间发生变化时,添加一个虚拟机各异的起始偏移量,调用vfio_pin_pages接口获取连续的物理页的起始地址hpa,并且将物理页固定住,防止被换出,通过iommu domain提供的接口进行iommu映射和反映射,记录gpa与hpa的映射关系;
123.步骤s5.3:翻译nvme指令,将nvme指令中的gpa添加一个虚拟机各异的起始偏移量,防止gpa冲突;
124.步骤s5.4:iommu将gpa翻译成hpa,进行dma操作,完成i/o读写任务。
125.步骤s5.5:卸载nvme模块的时候释放iommu domain的资源.
126.存储资源管理模块主要解决的问题是nvme分区数目对系统可扩展性的限制。传统mdev方案中需要一个mdev设备需要占用一个nvme分区,但是mbr和gpt分区都有数目上限,分别为60和128,因此限制了mdev设备的创建数量,从而限制系统的可扩展性,所以需要重新设计mdev nvme分区管理方案,不再受linux分区数目上限的限制。
127.存储资源分区管理方案,包括如下步骤:
128.步骤s3.1:通过fdisk创建一个nvme分区,所有mdev设备都共用该分区;
129.步骤s3.2:将该nvme分区划分成固定大小的份额,如平均分成1024份;
130.步骤s3.3:输入虚拟机/安全容器需要的存储资源数量,即份数,系统分配给相应的存储资源片段,并记录该片段在分区的起始偏移量;下次分配从未分配的片段开始;
131.步骤s3.4:根据该片段在分区的起始偏移量翻译nvme指令中的start logical block address(slba),完成对相应存储资源的访问。
132.本发明提出了一种高可扩展性的nvme存储虚拟化方法,该方法基于中介透传虚拟化方案,支持对虚拟机、安全容器、容器的混合部署,同时满足对高密度部署安全容器、容器的可扩展性需求,图2展示了该系统的整体架构图。该方案实现在系统nvme驱动层,根据vfio mdev框架提供的接口,创建虚拟的mdev设备,将mdev设备通过vfio传递给虚拟机,从而提供虚拟机使用nvme设备的能力。它通过修改物理队列分配与调度方式、优化i/o轮询线程处理i/o任务过程、修改存储资源分配方式、优化nvme指令地址翻译过程这四个方面提高系统整体的可扩展性。
133.修改物理队列分配与调度方式具体体现在加载nvme驱动模块时,将nvme物理队列分为两类:一类与原来物理队列相同,作为原生物理队列提供给容器的存储支持;另一类为mdev物理队列,提供虚拟机和安全容器的存储支持。同时,针对mdev物理队列,构建物理队列资源池,按需分配给图2中的轮询控制器,物理队列也由轮询控制器来调度,如图3所示,通过分时复用的机制满足多个虚拟机共享有限物理队列资源的需求。轮询控制器中管理的物理队列也分为两类,一类为1:1物理队列;另一类为1:n物理队列,当虚拟机的虚拟队列数目大于轮询控制器的储备队列数目时,就需要将多个虚拟队列绑定到同一个物理队列。
134.一个轮询控制器会创建一个i/o轮询线程,轮询控制器如图3所示,主要有三项任务:一是负责进行虚拟机的调度,按照round-robin的调度算法分配给虚拟机运行的时间片;二是对被调度到的虚拟机进行物理队列的调度,将虚拟队列与物理队列进行绑定与解绑;三是通过i/o轮询线程处理i/o任务,具体地,会轮询虚拟机的虚拟提交队列,将虚拟提交队列中的nvme指令转发到绑定的物理队列上,然后会轮询虚拟机的虚拟完成队列,向虚拟机注入中断通知nvme指令完成信息,还会轮询硬件物理完成队列,通过轮询代替中断,有效降低时延,将物理完成队列中的nvme完成信息写入到对应的虚拟完成队列。为了降低轮询带来的cpu损耗,提供一个检测虚拟机i/o活动的机制,当虚拟机在一段时间内没有i/o活动时,会标识该虚拟机为idle状态,将其移出调度队列,直到有新的i/o活动。
135.不同于传统mdev方案一个mdev设备需要一个nvme分区,本发明只需要创建一个
nvme分区,再将该分区均分成多个小片段,虚拟机申请存储资源只需要指定需要的片段数目,系统便寻找可以分配的连续片段,将该连续片段分配给该虚拟机,并记录该片段在分区中的起始偏移量,当虚拟机需要访问存储资源时,只要将slba加上该起始偏移量即可得到真正的读写位置。
136.传统mdev方案中通过模拟页表实现软件iommu来进行gpa的地址翻译过程,本发明将虚拟机gpa的翻译逻辑硬件卸载到硬件iommu,从而优化了查询软件iommu的cpu资源开销。首先需要给系统申请一个iommu domain,通过该domain可以进行iommu页表的映射和反映射,然后基于事件通知链机制向vfio notifier注册内存空间变化的回调函数,当虚拟机的i/o空间发现变化时,通过回调函数可以获取相应的内存空间,再将内存空间通过vfio_pin_pages接口获取连续的物理页的起始地址hpa并将物理页固定住,防止被换页换出,最后通过iommu map/unmap接口创建gpa翻译到hpa的页表,供后续翻译查询页表使用。为了解决不同虚拟机gpa可能冲突的问题,给不同虚拟机设定不同的起始gpa偏移量,以此来识别不同的gpa地址空间。
137.以下通过举例来详细说明本发明的运行过程:
138.实验采用的nvme设备是400gb的intel optane ssd dc p5800x。服务器平台配置则为双20核心intel xeon gold 6248cpu,睿频2.5ghz,40线程,系统内存为384gb。服务器运行ubuntu 18.04 64bit操作系统,linux 5.0版本内核。安全容器采用kata-container镜像为ubuntu 18.04服务器版操作系统,原生linux 5.4.60内核。容器启动硬件配置为1个cpu和384m内存。将nvme设备分为两个分区,分区1为300g,供虚拟机和安全容器使用,划分1024个片段,即一个片段300m。
139.假设我们要运行两组实验,一组运行80个安全容器,另外一组160个安全容器。每个安全容器使用1个片段,即300m空间大小,8个物理队列给安全容器使用,创建8个轮询控制器,即8个轮询线程,每个轮询控制器使用一个1个物理队列,80个安全容器实验组每个线程负责轮询10个安全容器,160个安全容器实验组每个线程负责轮询20个安全容器。
140.实验采用fio(flexible i/o tester)作为微基准测试工具,由于更加关注可扩展性,所以负载为iodepth为1,numjobs为1的轻负载,读写类型为随机读,块大小为4k。
141.测试结果分别展示在图4,图5和图6,图4为80个安全容器运行的情况,可以看到只用8个物理队列和8个轮询线程就可以支撑起80个安全容器,由于是轻负载,此时并未达到nvme设备的负载上限,安全容器的性能表现都比较稳定,可以看到各个安全容器之间的性能表现差异很小。这一结果充分体现了各个安全容器之间资源配置的公平性和性能隔离性。图5为160个安全容器运行的情况,可以看到在轮询安全容器数目提升一倍的情况下,单个容器的性能大概是80个安全容器实验组的一半。图6是这两个实验组的整体累加性能比较,可以看到当轮询线程数目和物理队列数目固定时,容器数目提升一倍只造成很小的系统整体性能损失,只有2%,这一结果充分体现了系统对高可扩展性的支持。
142.本发明还提供一种可扩展性的nvme存储虚拟化系统,所述系统包括如下模块:
143.模块m1:输入系统分配给虚拟机/安全容器的物理队列数目,构建物理资源池,剩余设备物理队列将预留给原生nvme驱动,给普通容器使用;模块m1.1:根据输入系统的物理队列数目获取原生nvme驱动中相应的物理队列数目,标识为mdev queue,与原生nvme驱动其他物理队列进行区分;模块m1.2:将所有的mdev queues进行包装,添加mdev需要使用的
属性,用全局结构pool维护;模块m1.3:提供轮询控制器模块申请物理队列资源的接口,分配给轮询控制器所需的物理队列资源。
144.模块m2:输入系统所需要的轮询控制器数目,系统创建相应数目的轮询控制器,每个轮询控制器创建一个i/o轮询线程,处理i/o任务;模块m2.1:向物理资源池申请需要的物理队列资源,添加到预备物理资源池;模块m2.2:创建i/o轮询线程,并绑定到cpu核心上;模块m2.3:轮询控制器初始化虚拟机链表,创建虚拟机/安全容器时根据其虚拟控制器id分配到相应的轮询控制器,添加到虚拟机链表上;模块m2.4:i/o轮询线程遍历虚拟机链表,判断虚拟机是否有i/o任务需要处理,按设定的调度算法调度虚拟机;模块m2.5:初始化i/o上下文,根据虚拟机的虚拟队列从预备物理资源池获取物理队列,将物理队列与虚拟队列进行绑定,物理队列分为1:1物理队列以及1:n物理队列;模块m2.6:i/o轮询线程处理i/o任务,包括从虚拟提交队列读取nvme指令、翻译nvme指令和提交nvme指令;从虚拟完成队列写入nvme指令完成信息;从物理完成队列读取nvme指令完成信息;模块m2.7:将物理队列与虚拟队列进行解绑,返回模块m2.4。
145.模块m3:输入虚拟机/安全容器需要的存储资源数量,存储资源管理模块分配给相应的存储资源;模块m3.1:通过fdisk创建一个nvme分区,所有mdev设备共用该分区;模块m3.2:将该nvme分区划分成固定大小的份额;模块m3.3:输入虚拟机/安全容器需要的存储资源数量,系统分配给相应的存储资源片段,记录该片段在分区的起始偏移量;下次分配从未分配的片段开始;模块m3.4:根据该片段在分区的起始偏移量翻译nvme指令中的start logical block address,完成对相应存储资源的访问。
146.模块m4:虚拟机/安全容器被分配给对应的轮询控制器;模块m4.1:设定round-robin的时间片vctrl_poll_ms以及虚拟机进入idle状态的时间阈值idle_timeout_ms,设n为一个轮询控制器需要调度的总虚拟机数量,求出idle_timeout_ms:
147.idle_timeout_ms=vctrl_poll_ms*n*2
148.模块m4.2:通过last记录虚拟机刚被调度的时间,now记录虚拟机当前的时间,设now与last的差值为δ,如果δ《vctrl_poll_ms,则说明虚拟机仍拥有执行i/o任务的时间片,继续执行i/o任务;如果δ≥vctrl_poll_ms,则调度下一个虚拟机;模块m4.3:通过last_io_t记录虚拟机最后一次执行i/o任务的时间,设当前时间now与last_io_t的差值为β,如果β》idle_timeout_ms,说明虚拟机无i/o活动的时间已经超过阈值idle_timeout_ms,进入idle状态,不再需要被调度,等到有i/o任务后再重新加入调度队列。
149.模块m5:轮询控制器给虚拟机/安全容器分配物理队列,i/o轮询线程处理虚拟机/安全容器的i/o任务,通过nvme指令地址翻译模块进行地址翻译;模块m5.1:加载nvme模块时创建iommu domain;模块m5.2:虚拟机i/o地址空间发生变化时,添加一个虚拟机各异的起始偏移量,调用vfio_pin_pages接口获取连续的物理页的起始地址hpa,将物理页固定住,通过iommu domain提供的接口进行iommu映射和反映射,记录gpa与hpa的映射关系;模块m5.3:翻译nvme指令,将nvme指令中的gpa添加一个虚拟机各异的起始偏移量;模块m5.4:iommu将gpa翻译成hpa,进行dma操作,完成i/o读写任务;模块m5.5:卸载nvme模块时释放iommu domain的资源。
150.模块m6:判断i/o任务是否结束,若没有结束则返回模块m5继续执行。
151.本领域技术人员知道,除了以纯计算机可读程序代码方式实现本发明提供的系统
及其各个装置、模块、单元以外,完全可以通过将方法步骤进行逻辑编程来使得本发明提供的系统及其各个装置、模块、单元以逻辑门、开关、专用集成电路、可编程逻辑控制器以及嵌入式微控制器等的形式来实现相同功能。所以,本发明提供的系统及其各项装置、模块、单元可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置、模块、单元也可以视为硬件部件内的结构;也可以将用于实现各种功能的装置、模块、单元视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
152.以上对本发明的具体实施例进行了描述。需要理解的是,本发明并不局限于上述特定实施方式,本领域技术人员可以在权利要求的范围内做出各种变化或修改,这并不影响本发明的实质内容。在不冲突的情况下,本技术的实施例和实施例中的特征可以任意相互组合。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献