KVM虚拟机CPU Pinning配置方法

作者:技术拾光

时间:2026-07-25

浏览:179

先来了解基本的信息。 1 宿主机CPU特性查看 使用 virsh nodeinfo 命令可以查看一些基本信息,虽然不够详细,但能获得大致概况。 virsh nodeinfo CPU model: x86_64 CPU(s): 32 CPU frequency: 1200 MHz CPU socket

文章目录

先来了解基本的信息。

1 宿主机CPU特性查看

使用 virsh nodeinfo 命令可以查看一些基本信息,虽然不够详细,但能获得大致概况。

virsh nodeinfo
CPU model: x86_64
CPU(s): 32
CPU frequency: 1200 MHz
CPU socket(s): 1
Core(s) per socket: 8
Thread(s) per core: 2
NUMA cell(s): 2
Memory size: 132119080 KiB

若要获取更详细的物理机CPU信息,例如物理CPU个数、每个CPU的核数以及是否开启超线程,则需要使用 virsh capabilities。

virsh capabilities

  
    36353332-3030-3643-5534-3235445a564a
    
      x86_64
      SandyBridge
      Intel
      
      
      
     ...
    
    ...
    
      
        
          
            
         ...
            
          
        
        
          
            
           ...
            
          
        
      
    
  
...

查看当前空闲内存可以使用 virsh freecell:

virsh  freecell --all
    0:     787288 KiB
    1:     94192 KiB
--------------------
Total: 881480 KiB

此外,物理CPU的特性也可以通过 /proc/cpuinfo 查看:

cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 62
model name : Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz
...
physical id : 0
siblings : 16
core id : 0
cpu cores : 8
...

综合以上信息,可以得出以下结论:

  • 物理CPU为 E5-2640V2,8核2颗,开启了超线程,因此在系统中可以看到32个CPU;
  • 物理机内存为128G。

2 虚拟机CPU使用情况查看

使用 virsh vcpuinfo 可以查看虚拟机的 vCPU 与物理CPU之间的对应关系。

virsh  vcpuinfo 21
VCPU: 0
CPU: 25
State: running
CPU time: 10393.0s
CPU Affinity: --------yyyyyyyy--------yyyyyyyy
VCPU: 1
CPU: 8
State: running
CPU time: 7221.2s
CPU Affinity: --------yyyyyyyy--------yyyyyyyy
...

可以看到,vcpu0 被调度到了物理机的CPU 25上,状态为 running,使用时间为10393.0秒。

CPU Affinity 行中的 yyyyyyy 表示该虚拟机可以使用的物理CPU内部的逻辑核。从上面可以看到,它可以在8-15和24-31这些CPU之间调度。为什么0-7和16-23不能用呢?这其实是系统的自动numa平衡服务在起作用——默认情况下,一个虚拟机只能使用同一颗物理CPU内部的逻辑核。

若要确认虚拟机具体能使用哪些物理逻辑CPU,可以使用 emulatorpin:

virsh # emulatorpin 21
emulator: CPU Affinity
----------------------------------
       *: 0-31

注意,0-31 全部可用。这意味着可以强制将CPU调度到任何一个物理CPU上。

3 在线pinning虚拟机的cpu

如果想强制让虚拟机只能在26-31这些CPU之间调度,可以执行以下操作:

virsh  emulatorpin 21 26-31 --live

验证结果:

virsh  emulatorpin 21
emulator: CPU Affinity
----------------------------------
       *: 26-31

查看 vcpuinfo:

virsh  vcpuinfo 21
VCPU: 0
CPU: 28
State: running
CPU time: 10510.5s
CPU Affinity: --------------------------yyyyyy
VCPU: 1
CPU: 28
State: running
CPU time: 7289.7s
CPU Affinity: --------------------------yyyyyy
...

查看对应的xml文件:

virsh # dumpxml 21

  cacti-230
  ...
  4
  
    
  

更进一步,可以强制让 vCPU 与物理机CPU一一绑定。例如强制 vcpu 0 绑定到物理CPU 28,vcpu 1 绑定到29,以此类推:

virsh  vcpupin 21 0 28
virsh  vcpupin 21 1 29
virsh  vcpupin 21 2 30
virsh  vcpupin 21 3 31

再次查看xml文件,配置已生效:

virsh # dumpxml 21

  ...
  4
  
    
    
    
    
    
  

通过 vcpuinfo 命令验证:

virsh  vcpuinfo 22
VCPU: 0
CPU: 28
State: running
CPU time: 1.8s
CPU Affinity: ----------------------------y---
VCPU: 1
CPU: 29
State: running
CPU time: 0.0s
CPU Affinity: -----------------------------y--
...

配置已生效。

4 cpu pinning简单的性能测试

CPU Pinning 对性能的影响究竟有多大?接下来进行一次简单的测试。测试环境如下:

  • 硬件:Intel(R) Xeon(R) CPU X5650 @ 2.67GHz,两颗
  • 宿主机系统:CentOS 7,内核 3.10.0-123.8.1.el7.x86_64
  • 虚拟机:CentOS 7,同样内核
  • 虚拟机配置:1颗CPU
  • 测试工具:UnixBench 5.1.2

首先查看不做CPU绑定的结果:

System Benchmarks Index Score              1444.7

然后查看做了CPU绑定的结果:

System Benchmarks Index Score              1464.1

直接比较:

  • 综合得分:绑定1464.1,不绑定1444.7,性能提升约1.34%
  • 浮点运算:绑定3928.7,不绑定3880.4,性能提升约1.24%

结论:CPU Pinning 确实能带来一定提升,但幅度有限,大约在1%多一点。对于大多数场景而言,这个收益并不显著,但在某些对CPU亲和性要求极高的场景下,值得采用。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›