kvm虚拟vcpu亲缘性绑定脚本

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进行绑定。

blog图片

两种方案都是同样的,但是有细微的调整,第一个使用了数组调用变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
num=`virsh list |tr -d 'a-zA-Z-'|awk '{$1=null;print $0}'|grep -v "^$"|wc -l` 
he=`cat /proc/cpuinfo| grep "processor"| wc -l`
inum=`expr $num - 1`
henum1=`expr $he / 2 - 1`
henum2=`expr $he / 2`
henum3=`expr $he - 1`
xiaoji=(`virsh list |tr -d 'a-zA-Z-'|awk '{$1=null;print $0}'|grep -v "^$"`)
for ((i=0;i<=$inum;i++))
do

if [ `expr $i / 2` -eq 0 ];then

for ((a=0;a<=1;a++))
do
virsh vcpupin ${xiaoji[$i]} $a 0-$henum1
done
else
for ((a=0;a<=1;a++))
do
virsh vcpupin ${xiaoji[$i]} $a $henum2-$henum3
done
fi

done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
num=`virsh list |tr -d 'a-zA-Z-'|awk '{$1=null;print $0}'|grep -v "^$"|wc -l` 
he=`cat /procuinfo| grep "processor"| wc -l`
henum1=`expr $he / 2 - 1`
henum2=`expr $he / 2`
henum3=`expr $he - 1`
for ((i=1;i<=$num;i++));do
xiaoji=`virsh list |tr -d 'a-zA-Z-'|awk '{$1=null;print $0}'|grep -v "^$"|sed -n ${i}p`
if [ `expr $i % 2` -eq 0 ];then

for ((a=0;a<=1;a++));do
echo virsh vcpupin $xiaoji $a 0-$henum1
done
else
for ((a=0;a<=1;a++));do
echo virsh vcpupin $xiaoji $a $henum2-$henum3
done
fi

这个是脚本的测试
blog图片

numastat -c qemu-kvm
检查绑定情况