vcpupin命令设置虚拟机某个vcpu在某个固定cpu上运行
进程的处理器亲和性和VCPU绑定
什么是进程亲和性:简单的一句话就是我这个Linux进程到底可以在哪几个cpu上做负载均衡。
KVM虚拟机是一个普通的linux进程,vcpu是一个线程,我们可以在宿主机上将vcpu线程对应的tid绑定到指定的cpu上。应用场景
用户希望把虚拟机的VCPU绑定在特定物理CPU上,VCPU只在绑定的物理CPU上调度,达到隔离VCPU并提升虚拟机性能的目的。如果没有作VCPU绑定,则虚拟机的VCPU可以在所有物理CPU上调度。
绑定vcpu到指定的cpu上,的确会提高性能,因为在vcpu的线程在物理cpu做负载均衡的时候,会有一些必要的数据结构初始化(vmlaunch)相对于VM-Entry来说是比较奢侈的,
加上cache的命中,性能必然会有所提高,但破坏了负载均衡。当绑定在同一cpu上的两个vcpu同时高负载的时候,性能就会大打折扣,而其他的cpu也没有得到充分的利用。
在KVM环境中,一般并不推荐手动设置qemu进程的处理器亲和性来绑定vCPU,但是,在非常了解系统硬件架构的基础上,根据实际应用的需求,可以将其绑定到特定的CPU上,从而提高客户机中的CPU执行效率或实现CPU资源独享的隔离性
Taskset是以task(也就是虚拟机)为单位,也就是以虚拟机上的所有cpu为一个单位,与物理机上的cpu进行绑定,
它不能指定虚拟机上的某个vcpu与物理机上某个物理cpu进行绑定,其粒度较大。
vcpupin命令就可以单独把虚拟机上的vcpu与物理机上的物理cpu进行绑定。
比如vm1和vm2都有3个vcpu(core),物理机有8个cpu(8个core,假如每个core一个线程),taskset能做到把vm2的3个vcpu同时绑定到一个或者多个cpu上,
但vcpupin能把vm1的每个vcpu与每个cpu进行绑定。

两种方案都是同样的,但是有细微的调整,第一个使用了数组调用变量。
1 | num=`virsh list |tr -d 'a-zA-Z-'|awk '{$1=null;print $0}'|grep -v "^$"|wc -l` |
1 | num=`virsh list |tr -d 'a-zA-Z-'|awk '{$1=null;print $0}'|grep -v "^$"|wc -l` |
这个是脚本的测试
numastat -c qemu-kvm
检查绑定情况