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重新導入虛擬機。