一种虚拟化IO性能优化方法及系统与流程

文档序号:12596577阅读:572来源:国知局
一种虚拟化IO性能优化方法及系统与流程

本发明涉及虚拟化技术领域,更具体地说,涉及一种基于virtio_blk的虚拟化IO性能优化方法及系统。



背景技术:

随着互联网时代信息、数据爆炸式增长,也带动了存储市场需求的不断增长和变化。为了更好的满足不同客户的需求(如同时提供nas和san服务),统一存储的概念也应运而生,基于虚拟化平台实现统一存储也成为主流技术之一。虚拟化平台主要包括CPU虚拟化、内存虚拟化以及IO虚拟化。其中CPU虚拟化、内存虚拟化技术已经可以通过硬件的方式去实现,实现技术已经很成熟。因此,IO虚拟化成为虚拟机IO性能最核心的技术,virtio应运而生。virtio一套是基于半虚拟化平台的IO虚拟化框架,该框架支持各种设备,如网络设备、SCSI设备,而virtio_blk就是用来提供块设备服务的。

因此,如何基于virtio_blk提高虚拟化IO性能,是本领域技术人员需要解决的问题。



技术实现要素:

本发明的目的在于提供一种基于virtio_blk的虚拟化IO性能优化方法及系统,以实现提高IO性能。

为实现上述目的,本发明实施例提供了如下技术方案:

一种基于virtio_blk的虚拟化IO性能优化方法,包括:

接收到bio请求时,通过BASE_BIO模块将bio请求存入目标队列;

当所述目标队列保存的bio请求数目大于预定阈值时,检测所述目标队列保存的bio请求是否存在相邻请求;

若存在,则将相邻请求封装为virtblk_requet,并执行kick操作;若不存在,则将每个bio请求封装为对应的virtblk_request,并执行kick操作。

其中,检测到所述目标队列保存的bio请求存在相邻请求之后,还包括:

按照预定规则,将相邻请求动态移动到所述目标队列的前端。

其中,所述按照预定规则,将相邻请求动态移动到所述目标队列的前端,包括:

根据检测到的每个相邻请求的请求数目,设定每个相邻请求的优先级,并根据每个相邻请求的优先级,动态调整每个相邻请求在所述目标队列的保存位置。

其中,检测到所述目标队列保存的bio请求不存在相邻请求之后,还包括:

设置与每个bio请求对应的计时器;

若检测到计时器超时,则将与超时的计数器对应的bio请求的处理优先级设置为最高。

其中,所述检测所述目标队列保存的bio请求是否存在相邻请求,包括:

检测所述目标队列保存的bio请求是否存在位于同一扇区、同一磁道、同一柱面或者同一磁盘中的一者的bio请求;

若存在,则将位于同一扇区、同一磁道、同一柱面或者同一磁盘中的bio请求作为一组相邻请求。

一种基于virtio_blk的虚拟化IO性能优化系统,包括:

Bio请求存入模块,用于接收到bio请求时,通过BASE_BIO模块将bio请求存入目标队列;

相邻请求检测模块,用于当所述目标队列保存的bio请求数目大于预定阈值时,检测所述目标队列保存的bio请求是否存在相邻请求;若存在,则触发第一封装模块;若不存在,则触发第二封装模块;

所述第一封装模块,用于将相邻请求封装为virtblk_requet;

所述第二封装模块,用于将每个bio请求封装为对应的virtblk_request;

执行模块,用于对封装后的virtblk_requet执行kick操作。

其中,还包括:

动态调整模块,用于按照预定规则,将相邻请求动态移动到所述目标队列的前端。

其中,所述动态调整模块根据检测到的每个相邻请求的请求数目,设定每个相邻请求的优先级,并根据每个相邻请求的优先级,动态调整每个相邻请求在所述目标队列的保存位置。

其中,还包括:

计时器设置模块,用于设置与每个bio请求对应的计时器;

处理优先级调整模块,用于检测到计时器超时,则将与超时的计数器对应的bio请求的处理优先级设置为最高。

其中,所述相邻请求检测模块通过检测所述目标队列保存的bio请求是否存在位于同一扇区、同一磁道、同一柱面或者同一磁盘中的一者的bio请求;若存在,则将位于同一扇区、同一磁道、同一柱面或者同一磁盘中的bio请求作为一组相邻请求。

通过以上方案可知,本发明实施例提供的一种基于virtio_blk的虚拟化IO性能优化方法及系统,包括:接收到bio请求时,通过BASE_BIO模块将bio请求存入目标队列;当所述目标队列保存的bio请求数目大于预定阈值时,检测所述目标队列保存的bio请求是否存在相邻请求;若存在,则将相邻请求封装为virtblk_requet,并执行kick操作;若不存在,则将每个bio请求封装为对应的virtblk_request,并执行kick操作。

可见,在本实施例中,BASE_BIO模块是以IO最小单位bio为粒度进行的从客户机到宿主机的IO转发,实现客户机IO路径的最短化;将相邻请求封装为virtblk_requet,可以在执行kick操作时,让qemu一次处理多个bio请求,减少了kick执行的次数,将更多的计算资源用于IO的处理,使得virtio_blk的IO路径更加简洁清晰,从而客户机IO路径的最短化,也缩短了virtio_blk整个IO路径,大大降低了客户机到宿主机的IO响应延迟,提高了系统整体的IOPS性能。

附图说明

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

图1为本发明实施例公开的一种基于virtio_blk的虚拟化IO性能优化方法流程示意图;

图2为本发明实施例公开的Virtio_blk IO路径图;

图3为本发明实施例公开的BASE_BIO模块IO路径图;

图4为本发明实施例公开的一种基于virtio_blk的虚拟化IO性能优化系统结构框图。

具体实施方式

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

本发明实施例公开了一种基于virtio_blk的虚拟化IO性能优化方法及系统,以实现提高IO性能。

参见图1,本发明实施例提供的一种基于virtio_blk的虚拟化IO性能优化方法,包括:

S101、接收到bio请求时,通过BASE_BIO模块将bio请求存入目标队列;

S102、当所述目标队列保存的bio请求数目大于预定阈值时,检测所述目标队列保存的bio请求是否存在相邻请求;

其中,所述检测所述目标队列保存的bio请求是否存在相邻请求,包括:

检测所述目标队列保存的bio请求是否存在位于同一扇区、同一磁道、同一柱面或者同一磁盘中的一者的bio请求;

若存在,则将位于同一扇区、同一磁道、同一柱面或者同一磁盘中的bio请求作为一组相邻请求。

具体的,在本实施例中,对IO请求进行排序,排序的原则是检测是否有相邻磁盘请求,比如若两个bio请求位于同一扇区、磁道、柱面或者磁盘,则视为相邻请求。

若存在,则执行S103、将相邻请求封装为virtblk_requet,并执行kick操作;

其中,检测到所述目标队列保存的bio请求存在相邻请求之后,还包括:

按照预定规则,将相邻请求动态移动到所述目标队列的前端。

其中,所述按照预定规则,将相邻请求动态移动到所述目标队列的前端,包括:

根据检测到的每个相邻请求的请求数目,设定每个相邻请求的优先级,并根据每个相邻请求的优先级,动态调整每个相邻请求在所述目标队列的保存位置。

具体的,在本实施例中,若存在相邻的IO请求,那么这些相邻请求会被动态的移动到队列的最前端,保证优先处理,然后将这些IO请求的封装为一个virtblk_requet,即把这些bio的内存描述信息都转化到vring中,执行kick操作(通知qemu处理IO)。这样做的目的让qemu一次就可以处理多个bio请求,减少了kick执行的次数,将更多的计算资源用于IO的处理。

若不存在,则执行S104、将每个bio请求封装为对应的virtblk_request,并执行kick操作。

其中,检测到所述目标队列保存的bio请求不存在相邻请求之后,还包括:

设置与每个bio请求对应的计时器;

若检测到计时器超时,则将与超时的计数器对应的bio请求的处理优先级设置为最高。

具体的,在本实施例中对于单个的bio请求设置对应的计时器,是为了防止大量顺序读写少量随机读写场景下,随机的IO请求长时间得不到响应,造成系统整体性能下降。

具体的,在介绍本实施例的优化方法之前,需要了解virtio_blk在客户机的原始IO路径。参见图2为本实施例提供的Virtio_blk IO路径图,如图2虚线1所示,IO经过文件系统处理后以bio的形式提交给通用块层;如图2虚线2所示在基于请求的IO路径中,多个相邻的bio请求首先会被封装到一个request结构,多个request会放到request队列并经过经过内核已支持的调度算法排序,经过排序的请求会通过q->request_fn继续向下,该函数已经被具体的底层模块实例化注册。对于Virtio_blk前端驱动而言,其注册的请求处理函数为virt_blk_request。该函数首先会将通用块层的请求封装为virtblk_request,具体实现原理为在virtblk_request结构保存了通用块层request中bio链表的首地址,接着会解析每一个bio中描述内存数据的segment信息,包括起始地址、页内偏移、长度。最后,virt_blk_request函数会将这些segment信息转化为virtio_queue中vring的信息,最后会通知qemu去处理此次IO请求。至此客户机完成了一次IO请求提交。

在上述virtio_blk的IO路径中基于请求的IO路径对于virtio框架没有存在的意义,理由如下:

1、对virtblk_request的封装其本质是将通用块层请求中bio的segment信息转化为virtqueue中vring的信息,使用和不使用通用块层请求对此次IO请求提交没有影响;

2、虽然通用块层会进行request的合并排序,考虑到宿主机在实际刷写磁盘的时候,每个IO都会经历宿主机的通用块层,对于客户机的这次合并排序,其作用是一致的,如果在客户机中直接在通用块上层进行基于bio的virtblk_request封装,避免了整个IO路径的重复冗余;

3、bio是描述一次完整IO的最小单位,不可再划分,因此不能再更高层次进行转发。

在本实施例中,通过开发BASE_BIO模块来解决上述问题,BASE_BIO模块是可配置安装的内核模块,跟普通的内核模块一样,既可以使用编译后insmod加载该模块的方式;也可以在将该模块的源码放置到内核源码树中,编写makefile文件,并在内核配置选项中打开该选项的方式。客户机内核块设备驱动初始化的流程中,当有IO下发的时候,就会进入BASE_BIO的业务流程。

如图3中虚线3(BASE_BIO)所示当bio通过q->make_request_fn进行提交时,实际是对virtblk_make_request回调函数的调用,就进入BASE_BIO模块的处理流程。该模块的功能主要包括:

1、将上层提交的bio请求暂存到一个队列中,在队列的长度到达阈值时,会对队列中暂存的IO请求进行排序。排序的原则是检测是否有相邻磁盘请求,比如若两个bio请求位于同一扇区、磁道、柱面或者磁盘,则视为相邻请求;

2、如果存在相邻的IO请求,那么这些请求会被动态的移动到队列的最前端,保证优先处理,然后将这些IO请求的封装为一个virtblk_requet,即把这些bio的内存描述信息都转化到vring中,执行kick操作(通知qemu处理IO)。这样做的目的让qemu一次就可以处理多个bio请求,减少了kick执行的次数,将更多的计算资源用于IO的处理;

3、对于不存在相邻的IO请求,那么一个bio对应一个virtblk_request,然后通知qemu去处理;同时,需要为这类bio设置计时器,当计时器超时后,这些bio的优先级会被设置为最高,优先被处理;这样设计的目的是为了防止大量顺序读写少量随机读写场景下,随机的IO请求长时间得不到响应,造成系统整体性能下降。

具体的,目前虚拟化IO性能优化的方法有各种各样的技术,对于kvm虚拟化平台,性能优化最有效的方法就是缩短IO在虚拟机和宿主机、宿主机和底层存储设备的IO路径,因此,在本实施例中基于virtio块设备IO虚拟化框架提出了的性能优化方法,将相邻的IO请求封装为一个virtblk_request,这样qemu一次就可以处理多个bio请求,减少了kick执行的次数,将更多的计算资源用于IO的处理,通过缩减虚拟机中的IO路径,从而缩减了IO响应延迟,提高虚拟化应用场景下存储系统的服务性能。

下面对本发明实施例提供的虚拟化IO性能优化系统进行介绍,下文描述的虚拟化IO性能优化系统与上文描述的虚拟化IO性能优化系统可以相互参照。

参见图4,本发明实施例提供的一种基于virtio_blk的虚拟化IO性能优化系统,包括:

Bio请求存入模块100,用于接收到bio请求时,通过BASE_BIO模块将bio请求存入目标队列;

相邻请求检测模块200,用于当所述目标队列保存的bio请求数目大于预定阈值时,检测所述目标队列保存的bio请求是否存在相邻请求;若存在,则触发第一封装模块;若不存在,则触发第二封装模块;

所述第一封装模块300,用于将相邻请求封装为virtblk_requet;

所述第二封装模块400,用于将每个bio请求封装为对应的virtblk_request;

执行模块500,用于对封装后的virtblk_requet执行kick操作。

基于上述技术方案,本方案还包括:

动态调整模块,用于按照预定规则,将相邻请求动态移动到所述目标队列的前端。

基于上述技术方案,所述动态调整模块根据检测到的每个相邻请求的请求数目,设定每个相邻请求的优先级,并根据每个相邻请求的优先级,动态调整每个相邻请求在所述目标队列的保存位置。

基于上述技术方案,本方案还包括:

计时器设置模块,用于设置与每个bio请求对应的计时器;

处理优先级调整模块,用于检测到计时器超时,则将与超时的计数器对应的bio请求的处理优先级设置为最高。

基于上述技术方案,所述相邻请求检测模块200通过检测所述目标队列保存的bio请求是否存在位于同一扇区、同一磁道、同一柱面或者同一磁盘中的一者的bio请求;若存在,则将位于同一扇区、同一磁道、同一柱面或者同一磁盘中的bio请求作为一组相邻请求。

本发明实施例提供的一种基于virtio_blk的虚拟化IO性能优化方法及系统,包括:接收到bio请求时,通过BASE_BIO模块将bio请求存入目标队列;当所述目标队列保存的bio请求数目大于预定阈值时,检测所述目标队列保存的bio请求是否存在相邻请求;若存在,则将相邻请求封装为virtblk_requet,并执行kick操作;若不存在,则将每个bio请求封装为对应的virtblk_request,并执行kick操作。

可见,在本实施例中,BASE_BIO模块是以IO最小单位bio为粒度进行的从客户机到宿主机的IO转发,实现客户机IO路径的最短化;将相邻请求封装为virtblk_requet,可以在执行kick操作时,让qemu一次处理多个bio请求,减少了kick执行的次数,将更多的计算资源用于IO的处理,使得virtio_blk的IO路径更加简洁清晰,从而客户机IO路径的最短化,也缩短了virtio_blk整个IO路径,大大降低了客户机到宿主机的IO响应延迟,提高了系统整体的IOPS性能。

本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。

对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。

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