1. VCPU信息查看

1.1 VCPU与CPU对应关系

1
virsh vcpuinfo [vm_name]

宿主机有一个物理CPU,8个物理核。此处的物理核,是指全部的逻辑CPU核,包括开启了超线程,即/proc/cpuinfo中列表的全部CPU核。如无特殊说明,下同。

center

如图可以看到,VCPU0被调度到物理核4上,VCPU1被调度到物理核5上。 CPU Affinity yyyyyyyy 代表物理核0~7均可以设置绑定,如果不可绑定会显示’-‘。

1.2 查看虚拟机可使用的逻辑CPU核

1
virsh emulatorpin [vm_name]

如图同样可以看到0~7核均可以设置绑定

2. VCPU在线绑定的方法

2.1 让VCPU只在部分物理核上调度

1
virsh emulatorpin [vm_name] [num1-num2] --live

此时,dumpxml,会在XML中显示出当前VCPU的绑定关系:

1
2
3
4
5
6
  ...
  <vcpu placement='static'>2</vcpu>
    <cputune>
      <emulatorpin cpuset='6-7'/>
    </cputune>
  ...

2.2 VCPU与物理核一对一绑定

通常的应用场景下,需要VCPU与物理核一对一绑定,使其它的VCPU不能争抢当前VCPU资源,实现资源配置的需求。

1
virsh vcpupin [vm_name] [VCPU_NUM] [CPU_NUM]

XML文件中会有如下变更:

1
2
3
4
5
6
7
8
  ...
  <vcpu placement='static'>2</vcpu>
    <cputune>
      <vcpupin vcpu='0' cpuset='7'/>
      <vcpupin vcpu='1' cpuset='6'/>
      <emulatorpin cpuset='6-7'/>
    </cputune>
  ...

执行virsh reboot使虚拟机重启,绑定关系依然存在。

3. CPU绑定的原理

上述的CPU绑定方法,是libvirt通过cgroup实现的,有关cgroup的介绍可以通过Docker基础技术:Linux CGroup了解基本概念。

4. CPU绑定的应用场景

在虚拟机出现计算压力较大时,就可以考虑进行CPU的绑定。

例如,宿主机上运行着2台VM,VM1,VM2。VM1需要长时间跑一些压缩算法,CPU压力较大,VM2则做一些文件处理,主要瓶颈在I/O。这时,观察宿主机的物理CPU核的使用情况,发现CPU0 ~ CPU3的使用率在20%左右,而CPU4 ~ CPU7的使用率在80%左右,就可以考虑将VM1的VCPU绑定到CPU0 ~ CPU3,而将VM2的VCPU绑定到CPU4 ~ CPU7,这样可以使得需要大运算量的VM能够使用更多的计算资源,实现整体性能的提升。

5. 版权声明

本文内容的绝大部分节选自《深度实践KVM》的第三章,如有侵犯原作者权益,请联系本Blog.

6. References

[1] Docker基础技术:Linux CGroup

[2] 深度实践KVM:核心技术、管理运维、性能优化与项目实施