1、查看kvm虚拟机vcpu的qemu线程
ps -elo ruser,pid,ppid,lwp,psr,args |awk '/^qemu/{print $1,$2,$3,$4,$5,$6,$8}'
注:vcpu是不同的线程,而不同的线程是跑在不同的cpu上,一般情况,虚拟机在运行时自身会点用3个cpus,为保证生产环境的稳定性,一个cpu(s)为10核的宿主机,最多给虚拟分7个vcpu,否者会出满载工作的时候出现超线程的情况。如果有两个逻辑cpu具有相同的"core id",那么说是超线程。
2、cpu绑定操作
说到这,既然我们的操作系统还有cpu特性都采用了numa架构,那么我们完全可以通过调整kvm对应的numa关系来达到kvm cpu这方面的优化。这里,我们一般是通过cpu绑定的方法来做相关操作的。
那么具体的操作是怎么样的呢?那么接下来我们通过一个例子来演示。这里是一台物理机,之前我们看过了,现在上面装好了kvm,然后运行着几个虚拟机,我们用 virsh list 命令可以查看到当前运行的虚拟机列表。
比如我们要看这个win7-ent虚拟机里vcpu对应物理cpu的情况,那么可以运行:
# virsh vcpuinfo win7-ent 可以查看
这个虚拟机是2个vcpu 双核的,然后都是跑在了物理机的cpu8上,使用的时间是2964.6s。最后一个是cpu的亲和性,这个yyyyy 表示的是使用的物理cpu内部的逻辑核,一个y就代表其中一个cpu逻辑核。全部是y ,那么说明这台物理机的24个cpu核,这个cpu都能调度使用。
当然,我们可以进入virsh ,然后运行emulatorpin win7-ent, 通过这个命令我们可以更详细的得到这个虚拟机可以用哪几个核:
我们可以看到目前这个虚拟机0-23的cpu它都能调度使用。
那么以上就是查看虚拟机cpu numa调度的信息,如果我们要把虚拟机绑定到固定的cpu上,我们就要做以下操作:
# virsh emulatorpin win7-ent 18-23 --live
通过这个命令,我们把这个win7的虚拟机vcpu绑定在了18-23这6个cpu之间的核上。
我们用命令查看下
emulatorpin win7-ent
我们也可以用virsh dumpxml win7-ent 查看确认:
这是让虚拟机里的vcpu一起绑定的方法。
那么有的人会疑问,一个虚拟机我有两个vcpu, 比如这个win7 ,它就是双核的,我想让里面的vcpu1和vcpu2分别绑定在不同的物理cpu上可以吗?怎么操作呢?这也是可以的,我们通过下面的方法可以进行相关的vcpu分别绑定
# virsh vcpupin win7-ent 0 22
# virsh vcpupin win7-ent 1 23
# virsh dumpxml win7-ent
# virsh vcpuinfo win7-ent
这里要注意的是,你把虚拟机用reboot重启,这个绑定配置还是生效的,但是你shutdown的话,cpu绑定的效果会失效。我们要让vm关机然后起来也生效,就必须把参数写入到虚拟机的xml里,然后保存,这样关机了也不会失效,这里要注意下
# virsh edit vm1
添加:
<cputune>
<vcpupin vcpu='0' cpuset='22'/>
<vcpupin vcpu='1' cpuset='23'/></cputune>
以上就是cpu绑定技术的操作。通过这样的操作,我们可以在一台多cpu的物理机上固定几个cpu给虚拟机用。当然,至于为什么可以这样做,前面我们提到了关于numa的原理,如果固定了虚拟机的cpu,那么它就不会去找远端节点了,另外就是有些场景下,一物理机多个cpu,如果前面几个cpu负载很高,利用率大,后面几个cpu利用率低,那么我们可以协调下,做cpu的绑定,平衡下cpu的负载。
注:通过直接在xml定义,需要使用virsh define /etc/libvirt/qemu/vm.xml重新导入虚拟机。
发表评论