VMware——虚拟机处理器核数与物理cpu的关系

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

虚拟机处理器核数与物理cpu的关系

2019年07月21日

vCPU,顾名思义,是虚拟CPU。创建虚拟机时,需要配置vCPU资源。因此vCPU是虚拟机的部件。因此脱离VM,谈论vCPU是没有意义的。

虚拟化管理系统(例如VMware Workstation)如何调度vCPU,取决于系统内的虚拟机数目以及虚拟机配置的vCPU的情况。

Windows系统里的信息

1、当系统内VM所需的vCPU总数少于物理CPU的核数(包括超线程Core)时,虚拟化管理系统为vCPU 分配的资源不超过一个物理CPU核。 vCPU与物理核的分配关系可以是绑定的,也可能是动态的。

比如服务器有20个核心,你创建了2个VM,每个VM 4个vCPU,那么这两个VM最多能够使用服务器的8个核心。如下面三幅图所示,物理机6核心,虚拟机vCPU为2核心,可以看出虚拟机CPU使用率100%时物理机使用率33%。

2、当系统内的VM所需要的vCPU核大于物理CPU核数时,虚拟化管理系统首先按照时间片轮流调度一遍,然后如果还有剩余的CPU资源,则给所需要的vCPU。比如系统配置了40个vCPU,只有20个物理核。那么平均每个vCPU获取一个核心50%的资源。由于一些VM忙,一些VM空闲,虚拟化系统会在一个调度周期内,划分出若干时间片,轮流给每个vCPU使用。忙的vCPU可以使用完整个时间片,而闲的vCPU用不完整个时间片,会提前释放资源。这样在一个调度周期内,对每个vCPU都调度一遍后还有空闲的时间,调度器会把剩余的资源去调度忙的vCPU。这样兼顾公平和效率。这中调度算法具体下来,大致是如下效果:系统有1个CPU 2.0 Ghz,两个VM,分配1个vCPU。如果VM1 和 VM2都忙,那么各自相当于拥有一个1.0 Ghz的

CPU。如果VM1很忙,VM1只需要 500Mhz的处理能力,那么在VM1看来,相当于暂时获得了 1.5Ghz的处理器。

3、通过对Xen的测试,系统所有虚拟机的vCPU的总数目小于和等于CPU核数时,VM的性能是比较稳定的。 VM的vCPU基本上绑定到了一个CPU核。当vCPU数目大于物理核数时,VM的性能稳定性变差。

确实如此,我用VMware Workstation 15.1做过测试,当先CPU总数大于物理核数时,经常出现物理CPU 和vCPU负载都100%的情况,物理机系统和虚拟机系统都卡死了。其实系统负载并不大,估计是调度出了问题。

Linux系统里的信息

在linux下的/proc/cpuinfo文件里,保存了cpu的详细的信息,有兴趣的可以打开看看。

如果还不够理解,那么看下面的例子:processor代表vCPU的核心,physical ID代表物理CPU编号,core ID代表物理核心编号,siblings代表物理CPU的线程数,cpu cores代表物理CPU的核数。

从表中可以看到有两个物理cpu,一个cpu双核四线程,共计八个逻辑cpu。

此例说明有逻辑处理器0 和 4 驻留在物理封装 0 的内核 0 上。这就表示逻辑处理器 0 和 4 支持超线程(HT)技术。相同的工作可用于封装 0 内核1 上的逻辑处理器 2 和 6,封装 1 内核 2 上的逻辑处理器 1 和 5,以及封装 1 内核 3 上的逻辑处理器 3 和7。此系统支持超线程(HT)技术,因为两个逻辑处理器共享同一个内核。有两种方式可以确定是否支持多内核。由于内核 0 和 1 存在于封装0 上,而内核 2 和 3 存在于封装 1 上,所以这是一个多内核系统。此外,cpu cores 条目为2,也说明有两个内核驻留在物理封装中。这是一个多路系统,因为有两个封装。

下面我们考虑,kvm(LINUX系统的虚拟化程序)虚拟出来的虚拟机(vm)是运行在单独的一个逻辑cpu还是可以分别在各个cpu之间运行?虚拟机cpu(vcpu)是什么概念?物理机(host)怎么看待kvm和vcpu?为了搞懂这个概念我们还是要回到命令行中看。举例说明:

我这里有一个虚拟机叫core8,它含有8个虚拟cpu它的进程编号是20736.就是说core8在host看来就是一个进程而已,这个集成的编号是20736.那么现在提出一个问题,这个core8的8个vcpu是怎么个情况呢?在哪里运行呢?这时还是得借助命令行。我们在host里使用ps指令,但是不能单纯了用ps,还要借助于参数:ps -eL//e的意思是打印所有进程,L的意思是连线程也不放过。我这里只显示一下和我们的20736进程相关的信息:

你会看到和20736相关的有九行,那么这九行是什么呢?

首先第一列都是20736,第二列里只有第一行是20736,后面的都不是。那么我们这时就应该明白了,对于host来说,kvm虚拟机是一个进程(20736),虚拟机的vcpu都是这个进程衍生出来的线程。这就是为什么除了20736还有另外八行的原因。

那么我们接着询问,这八个线程是跑在同一个逻辑cpu里吗?为了回答这个问题,我们接着做实验:

还是借助于ps指令:ps -eLo ruser,pid,ppid,lwp,psr| awk ‘{if($5==1) print$0}’

解释为:ps命令显示当前系统的进程信息的状态,它的“-e”参数用于显示所有的进程,“-L”参数用于将线程(LWP,light-weightprocess)也显示出来,“-o”参数表示以用户自定义的格式输出(其中“psr”这列表示当前分配给进程运行的处理器编号,“lwp”列表示线程的ID,“ruser”表示运行进程的用户,“pid”表示进程的ID,“ppid”表示父进程的ID,)。结合ps和awk工具的使用,是为了分别打印出来运行在不同的逻辑cpu上的进程线程情况。上面的指令就是打印出1号(从0开始编号)cpu的进行线程情况,我们这里只列出和我们相关的:

这时你会看到,哦,20736号进程衍生出来的线程只有一部分运行在逻辑cpu1上,其它的线程在其它的cpu上了。

这时就大概明白了,不同的vcpu只是不同的线程,而不同的线程是跑在不同的cpu上的。

相关文档
最新文档