一种基于KVM虚拟化技术的处理器隔离方法及装置与流程

文档序号:12463488阅读:432来源:国知局
一种基于KVM虚拟化技术的处理器隔离方法及装置与流程

本发明涉及计算机虚拟化技术领域,特别是涉及一种基于KVM虚拟化技术的处理器隔离方法及装置。



背景技术:

目前,随着计算机硬件的发展,人们对最大化利用硬件资源的需求日益迫切。从上世纪六、七十年代虚拟机概念的提出,到现在虚拟化技术的日益成熟,为人们这些需求的实现提供了有利的解决方案。基于IntelVT技术的KVM虚拟机,是一种采用硬件辅助虚拟化的全虚拟化方案,并在Linux内核版本2.6.20之后,以模块的形式集成到内核的各个主要发行版本。KVM虚拟机吸收了QEMU、Bochs、UML、Virtual PC等传统虚拟机的长处和优势,利用硬件辅助的虚拟化技术,使虚拟机的大多数指令可以直接在物理处理器上运行,具有更加优越的效率和性能,但是需要运行的任务都是随意在虚拟机上的处理器核中进行,不能充分利用处理器的资源。



技术实现要素:

本发明的目的是提供一种基于KVM虚拟化技术的处理器隔离方法及装置,以实现充分利用处理器的资源。

为解决上述技术问题,本发明提供一种基于KVM虚拟化技术的处理器隔离方法,包括:

通过修改qemu源码生成对应的KVM虚拟机;

当创建客户机时,将所述KVM虚拟机与客户机进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。

优选的,所述通过修改qemu源码生成对应的KVM虚拟机,包括:

修改qemu源码,增加-cpuid的命令选项,完成对参数的解析以及绑定操作,生成对应的KVM虚拟机。

优选的,当创建客户机时,将KVM虚拟机与客户机进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行,包括:

当创建客户机时,根据解析获得的cpuid参数,对KQEMU应用进程、KVM线程、异步IO事件处理线程运用linux内核的Affinity机制进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。

优选的,所述方法还包括:

当运行多个客户操作系统Guest OS时,通过配置CPU参数将各个Guest OS运行在不同的处理器核上。

本发明还提供一种基于KVM虚拟化技术的处理器隔离装置,该装置包括:

修改模块,用于通过修改qemu源码生成对应的KVM虚拟机;

绑定模块,用于当创建客户机时,将所述KVM虚拟机与客户机进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。

优选的,所述修改模块包括:

修改单元,用于修改qemu源码;

解析单元,用于增加-cpuid的命令选项,完成对参数的解析以及绑定操作,生成对应的KVM虚拟机。

优选的,绑定模块,用于当创建客户机时,将所述KVM虚拟机与客户机进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行,包括:

绑定模块,用于当创建客户机时,根据解析获得的cpuid参数,对KQEMU应用进程、KVM线程、异步IO事件处理线程运用linux内核的Affinity机制进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。

优选的,所述装置还包括:

配置模块,用于当运行多个客户操作系统Guest OS时,通过配置CPU参数将各个Guest OS运行在不同的处理器核上。

本发明所提供的一种基于KVM虚拟化技术的处理器隔离方法及装置,通过修改qemu源码生成对应的KVM虚拟机;当创建客户机时,将所述KVM虚拟机与客户机进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。可见,通过修改qemu源码生成特定的KVM虚拟机,在创建客户机的时候实现绑定,使客户机只能在指定核上的运行,不发生迁移,实现了对处理器的隔离,达到最大化利用处理器资源,提高虚拟化CPU的效率,实现充分利用处理器的资源。

附图说明

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

图1为本发明所提供的一种基于KVM虚拟化技术的处理器隔离方法的流程图;

图2为KVM虚拟机架构示意图;

图3为KVM工作模型示意图;

图4为客户操作系统与CPU核的绑定示意图;

图5为KVM虚拟机进程绑定实现过程示意图;

图6为本发明所提供的一种基于KVM虚拟化技术的处理器隔离装置的结构示意图。

具体实施方式

本发明的核心是提供一种基于KVM虚拟化技术的处理器隔离方法及装置,以实现充分利用处理器的资源。

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

请参考图1,图1为本发明所提供的一种基于KVM虚拟化技术的处理器隔离方法的流程图,该方法包括:

S11:通过修改qemu源码生成对应的KVM虚拟机;

S12:当创建客户机时,将KVM虚拟机与客户机进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。

可见,该方法通过修改qemu源码生成特定的KVM虚拟机,在创建客户机的时候实现绑定,使客户机只能在指定核上的运行,不发生迁移,实现了对处理器的隔离,达到最大化利用处理器资源,提高虚拟化CPU的效率,实现充分利用处理器的资源。

基于上述方法,进一步的,步骤S11的过程包括:修改qemu源码,增加-cpuid的命令选项,完成对参数的解析以及绑定操作,生成对应的KVM虚拟机。

进一步的,步骤S12的过程包括:当创建客户机时,根据解析获得的cpuid参数,对KQEMU应用进程、KVM线程、异步IO事件处理线程运用linux内核的Affinity机制进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。

进一步的,所述方法还包括:当运行多个客户操作系统Guest OS时,通过配置CPU参数将各个Guest OS运行在不同的处理器核上。

基于上述方法,具体的,通过修改qemu源码生成特定的KVM虚拟机。在创建客户机的时候实现绑定,使客户机只能在指定核上的运行,不发生迁移,实现了一种KVM虚拟化技术中处理器隔离的设计。首先修改qemu源码,增加-cpuid的命令选项,完成对参数的解析以及相关的绑定操作。其次,根据解析获得的cpuid参数,对KQEMU应用进程KVM线程、异步IO事件处理线程运用Linux内核的Affinity机制进行绑定,实现对处理器的隔离。当运行多个Guest OS时,只需在运行时指定CPU参数,即可让各个Guest OS始终运行在指定的核上,进而能够充分有效地利用计算机硬件资源。

其中,对KVM虚拟机的绑定,实现了KVM虚拟机处理器核之间的隔离,使KVM虚拟机在指定的物理CPU核上运行,不发生核间的迁移,从而达到物理CPU资源的指定使用。为了充分利用处理器的资源,往往需要虚拟机在某一指定个核上运行,而其它的核上运行特定的任务,本方法基于CPU的亲和性(Affinity),采用进程绑定,实现了对处理器的隔离。

KVM是基于Intel VT技术并结合QEMU来提供设备虚拟化的虚拟机。通过分析和研究KVM虚拟机的创建、运行机制,从进程控制的角度对KVM虚拟机进行隔离,实现了KVM虚拟机在创建、运行时都保持在指定的核上运行,达到最大化利用处理器资源的目的。本方法可以最大化利用处理器资源的目的,提高虚拟化CPU的效率。

具体的,关于KVM虚拟机架构,KVM虚拟机由两部分构成:一部分是以模块形式集成到Linux内核的KVM Driver,负责管理虚拟硬件资源,并创建一个字符设备(/dev/kvm),通过ioctl接口与用户空间的设备通信,以及完成虚拟机内存的分配、虚拟机寄存器的读写以及虚拟机CPU的运行等。因此,每个虚拟机被Linux核心当作是一个标准的进程。另一个部分是KQEMU,即针对有虚拟化支持的X86处理器而修改过的QEMU。KQEMU主要是完成对硬件的模拟,通过/dev/kvm与KVM Driver交互。KVM虚拟机架构如图2所示:在Intel VT-x技术下有两种工作模式:VMX rootoperation模式和VMX non-root operation模式。在这两种模式下,KVM虚拟机充分利用硬件的支持,实现了系统的虚拟化。KVM的KVM Driver和KQEMU分别运行于Kernel模式的和User模式。这里的Kernel模式和User模式实际上指的是VMX root operation模式下的特权级0和特权级3。在图2中,Linux Kernel、KVM Driver和/dev/kvm都属于VMX root operation模式。另外,KVM将客户机所在的运行模式称为Guest模式,即VMX的VMX non-root operation模式。

关于QEMU和KVM工作原理,Intel VT-x是与处理器管理相关的硬件虚拟化技术。在VT-x的支持下,KVM中的每个虚拟机可具有多个虚拟处理器VCPU,每个VCPU对应一个QEMU的线程,这个QEMU线程代表了KVM虚拟机的运行。没有硬件支持的纯QEMU虚拟机和利用硬件支持实现虚拟化的KVM虚拟机的差异也就在这里。为了更加形象地说明KVM和QEMU间的关系,本文称它为KVM线程,而将创建客户机的应用程序QEMU称为QEMU进程。QEMU应用程序在创建或者说在加载一个Guest OS后,就转换为KVM线程运行。VCPU的创建、初始化、运行以及退出处理都在KVM线程上下文中进行,需要Kernel、User和Guest三种模式相互配合,其工作模型如图3所示:从图3可看出,KVM线程以ioctl的方式与KVM内核模块间进行交互,指示KVM内核模块进行VCPU的创建和初始化等操作,而KVM内核模块与客户机之间通过VM Exit和VM entry操作进行切换。初始化工作完成之后,KVM线程以ioctl的方式向KVM内核模块发出运行VCPU的指示,后者执行虚拟机进入操作(VM entry),将处理器由Kernel模式切换到Guest模式,转而运行客户机。但此时仍处于KVM线程上下文中,且正在执行ioctl系统调用的kernel模式处理程序。客户机在运行过程中,如发生异常或外部中断等事件,或执行I/O操作,可能导致虚拟机退出操作(VMexit),将处理器状态由Guest模式切换回Kernel模式。KVM内核模块检查发生VM exit的原因,如果VM exit由I/O操作导致,则执行系统调用返回操作,将I/O操作交给处于User模式的QEMU进程来处理,这时QEMU会创建一个新的QEMU线程来完成这些I/O处理,之后再次执行ioctl,指示KVM将处理器切换到Guest模式,恢复客户机的运行;如果VM exit由其它原因导致,则由KVM内核模块负责处理,并在处理后切换处理器到Guest模式,恢复客户机的运行。由以上分析可知,KVM虚拟化技术中物理CPU核的隔离实现,与KQEMU应用程序、KVM线程、异步IO事件处理这三方面有着密切的联系。

关于虚拟机CPU进程隔离实现,在KVM虚拟机运行的过程中,与虚拟机处理器紧密相关的重要数据结构VMCS保存在内存中,包含了虚拟CPU的相关寄存器的内容和虚拟CPU相关的控制信息,每个VMCS对应一个虚拟CPU。但VMCS具有“迁移性”,使用时需要与物理CPU绑定。例如,某个VMCS先和物理CPU0绑定,并在某个时刻解除绑定关系,下一个时刻可能会重新绑定到物理CPU1上。在任意给定时刻,VMCS与物理CPU是一对一的绑定关系,即一个VMCS只能与一个物理CPU绑定。因此,多核条件下要实现Guest OS在一个虚拟的单核平台上运行,就需要考虑KQEMU应用程序、KVM线程、异步IO事件处理与CPU的绑定关系。利用CPU的亲和性(Affinity),通过设置这三方面的Affinity属性,可以将Guest OS进程绑定到指定的核上运行,从而实现虚拟的单核平台。例如,在创建虚拟机时将两个Guest OS进程绑定到指定的CPU核上,使其在整个运行期间不发生迁移,如图4所示:根据KVM原理和机制的分析,可以通过以下方案实现绑定操作:修改、优化KQEMU源代码,生成特定的KVM虚拟机。在创建客户机的时候实现绑定,使客户机只能在指定核上的运行,不发生迁移。本方法是基于Qemu源代码的修改,绑定时机实现过程也简单明了。

关于处理器隔离的实现,Linux的线程在核内是以轻量级进程的形式存在的,而实现是在核外。它拥有独立的进程表项,其创建、删除等操作都是在核外POSIX thread库中进行。与fork()调用创建一个进程的方法不同,pthread_create()创建的线程并不具备与主线程同样的执行序列,而是使其运行start_routine()函数。因此,用fork创建的父子进程之间的Affinity具有继承性,而调用pthread_create()创建的父子进程之间则没有这种继承性,KQEMU和KVM之间则是后者的情况。因此,仅通过设置KQEMU的Affinity属性不能实现KVM虚拟机处理器的隔离。需分为两部分处理:①从启动QEMU的命令获取cpuid参数。这需要对KQEMU源代码进行修改,增加-cpuid的命令选项,完成对参数的解析以及相关的绑定操作。主要涉及KQEMUOption、KQEMU_options等几个选项变量。②根据解析获得的cpuid参数,对KQEMU应用进程KVM线程、异步IO事件处理线程运用Linux内核的Affinity机制进行绑定,实现对处理器的隔离。图5是以双核处理器为例实现KVM虚拟机绑定的主要过程。

关于实验结果与分析,需要验证的是客户机的创建、客户机的运行,以及客户机的异步IO事件处理。例如,本实验中使用的测试平台是:处理器是intel(R)CoreTMi3-6100U CPU 2.30GHz,内存为DDR3-1600 2G,操作系统内核版本是Linux-4.0.33。GuestOS运行测试程序是计算Fibonacci前35项和,每计算一次休眠15毫秒。执行命令qemu-system-x86_64Guestos.img–m512–cpuid 1,在启动Guest OS时指定创建Guest OS进程的处理器参数cpuid,使创建客户机的进程在指定的核1运行。用top命令的p和H参数,观察KVM虚拟机运行时的进程号和线程号。例如t1时刻为“19:33:34”,QEMU进程号为3905,KVM线程号为3906,异步IO事件处理线程号为3910。例如t2时刻为“20:43:20”,KQEMU进程号为3905,KVM线程号为3906,异步IO事件处理线程号为4212。此时线程号为3910的aio线程消失,动态产生aio线程4212。根据Linux内核的PID命名规则可知,PID逐渐递增,aio线程的产生是一个动态过程,根据Guest OS的需要而产生。经过长时间的实验观察,虽然运行Guest OS时CPU核1的利用率达到94.7%左右,KVM虚拟机始终保持在指定的核1运行,即使核0十分空闲,仍不会发生迁移。可以通过taskset命令查看这三个进程的Affinity值,得到进一步的验证,当Affinity值为2(即0x00000010),表示相应进程或线程运行在核1上。

请参考图6,图6为本发明所提供的一种基于KVM虚拟化技术的处理器隔离装置的结构示意图,该装置包括:

修改模块101,用于通过修改qemu源码生成对应的KVM虚拟机;

绑定模块102,用于当创建客户机时,将KVM虚拟机与客户机进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。

可见,该装置通过修改qemu源码生成特定的KVM虚拟机,在创建客户机的时候实现绑定,使客户机只能在指定核上的运行,不发生迁移,实现了对处理器的隔离,达到最大化利用处理器资源,提高虚拟化CPU的效率,实现充分利用处理器的资源。

基于上述装置,具体的,修改模块包括:

修改单元,用于修改qemu源码;

解析单元,用于增加-cpuid的命令选项,完成对参数的解析以及绑定操作,生成对应的KVM虚拟机。

进一步的,绑定模块,用于当创建客户机时,将KVM虚拟机与客户机进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行,包括:绑定模块,用于当创建客户机时,根据解析获得的cpuid参数,对KQEMU应用进程、KVM线程、异步IO事件处理线程运用linux内核的Affinity机制进行绑定,使客户机在KVM虚拟机中指定的处理器核上运行。

进一步的,所述装置还包括:配置模块,用于当运行多个客户操作系统Guest OS时,通过配置CPU参数将各个Guest OS运行在不同的处理器核上。

以上对本发明所提供的一种基于KVM虚拟化技术的处理器隔离方法及装置进行了详细介绍。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以对本发明进行若干改进和修饰,这些改进和修饰也落入本发明权利要求的保护范围内。

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