目录
背景
在虚拟化场景中,我们知道由cpu虚拟化出多个vcpu提供给上层的虚拟机使用。
在KVM中,每个vcpu实际上是虚拟机的线程
,即虚拟机
为进程
,vcpu
为它的线程
。
可以使用ps -ef
查看:
对于这些个线程来说,他们默认是允许被调度到任何cpu进行执行的,这样虽然提高了冗余,但不利于一些性能。
同时也需要注意,cpu和内存是有”距离“这一种说法的,cpu使用”较近“的内存,可以有效提升效率,这也就是我们常说的NUMA
。
性能调优
通过将超融合虚拟化中虚拟机的VCPU与物理CPU核进行绑定,可以避免CPU计算处理在各个物理CPU上的漂移,同时使各VCPU处于一个NUMA节点上,避免跨NUMA节点的性能开销。
NUMA
NUMA(Non-Uniform Memory Access,非统一内存访问)是一种计算机内存架构,主要用于多处理器系统中。它的特点是,处理器访问本地内存(与该处理器直接相连的内存)速度较快,而访问其他处理器的远程内存速度较慢。这种架构与传统的统一内存访问(UMA)架构不同,后者中所有处理器访问内存的速度是均等的。
NUMA的关键特性
- 本地内存和远程内存:
每个处理器节点都有自己的本地内存,访问速度较快。
处理器也可以访问其他节点的内存(远程内存),但由于需要通过互连网络,延迟较高。 - 高效扩展性:
适用于需要处理大规模数据的多处理器系统。
每个节点都可以拥有独立的内存,减少了内存访问的冲突和瓶颈。 - 缓存一致性:
通常会采用缓存一致性协议(如MESI协议)来确保多个处理器访问同一内存区域时的数据一致性。
vCPU绑定
有两种绑定方式:
- 整个VM的vCPU均绑定在一个CPU上。(进程级绑定)
- VM的某个vCPU绑定在一个CPU上。(线程级绑定)
第一种方式可以自行查阅taskset
,这里简单介绍一下第二种vcpupin
vCPU如何绑定CPU,步骤
使用
vcpupin
指令绑定的方式只在当前系统环境有效,实例重启后就会失效,要永久生效需要在xml配置文件中定义
这里不介绍怎么用xml,可以自行搜索
1. 查看vcpu运行状态
#查看vm列表
[root@localhost ~]# virsh list
Id Name State
----------------------
5 VM running
#下面的 5 表示本次为 VM 分配的虚机ID
#这个命令可以看到VM的vcpu运行在哪个cpu之上
[root@localhost ~]# virsh vcpuinfo 5
VCPU: 0
CPU: 1
State: running
CPU time: 54791.1s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 1
CPU: 0
State: running
CPU time: 54738.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 2
CPU: 3
State: running
CPU time: 54769.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 3
CPU: 0
State: running
CPU time: 54764.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
2. 查看vcpu可以运行在哪
#查看vcpu可以运行的cpu信息
[root@localhost ~]# virsh vcpupin 5
VCPU: CPU Affinity
----------------------------------
0: 0-23
1: 0-23
3: 0-23
4: 0-23
#默认4个vcpu没有进行绑定,可以在0-24号cpu上切换
3. 将vpu绑定在某个CPU上
将vm的0vcpu绑定到3cpu,1vcpu绑定到5cpu
virsh vcpupin 5 0 3
virsh vcpupin 5 1 5
4. 再次查看vcpu可以运行在哪些cpu
[root@localhost ~]# virsh vcpuinfo 5
VCPU: 0
CPU: 3
State: running
CPU time: 14.5s
CPU Affinity: ---y--------------------
VCPU: 1
CPU: 5
State: running
CPU time: 7.3s
CPU Affinity: -----y------------------
VCPU: 2
CPU: 3
State: running
CPU time: 54769.5s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
VCPU: 3
CPU: 0
State: running
CPU time: 54764.7s
CPU Affinity: yyyyyyyyyyyyyyyyyyyyyyyy
[root@localhost ~]# virsh vcpupin 5
VCPU: CPU Affinity
----------------------------------
0: 3
1: 5