kvm中的cpu配置

 在QEMU/KVM中,qemu提供對cpu的模擬,展現給客戶機一定的cpu數目和cpu特性;在KVM打開的情況下,客戶機中cpu指令的執行有硬件處理器的虛擬化功能來輔助執行,具有非常高的效率。

  Qemu/kvm爲客戶機提供一套完整的硬件系統環境,在客戶機看來其所擁有的cpu即是vcpu(virtual CPU)。在KVM環境中,每個客戶機都是一個標準的Linux進程(qemu進程),而每一個vCPU在宿主機中是Qemu進程派生的一個普通線程。

  在普通的Linux系統中,進程一般有兩種執行模式:內核模式和用戶模式。在KVM環境中,增加了第三種模式:客戶模式。

  • 用戶模式(User Mode)

  主要處理I/O的模擬和管理,由Qemu的代碼實現。

  • 內核模式(Kernel Mode)

  主要處理特別需要高性能和安全相關的指令,如處理客戶模式到內核模式的轉換,處理客戶模式下的I/O指令或其他特權指令引起的退出(VM-Exit),處理影子內存管理(shadow MMU)。

  • 客戶模式(Guest Mode)

  主要執行Guest 中的大部分指令,I/O和一些特權指令除外(他們會引起VM-Exit,被Hypervisor截獲並模擬)。


(我們一直強調一個問題)KVM中的一個客戶機作爲一個用戶空間進程(qemu-kvm)運行的,它和其他普通的用戶進程一樣由內核來調度使其運行在物理cpu上,不過它由KVM模塊控制,可以在上面的三種執行模式下運行。

多個客戶機就是宿主機中的多個QEMU進程,而一個客戶機的多個vCPU就是一個QEMU進程中的多個線程。

在客戶機系統中,同樣分別運行着客戶機的內核和客戶機的用戶空間應用程序。

  • KVM環境下的SMP

smp,對稱多處理器,在虛擬機環境下可以有兩種方式實現(個人認爲,其實質是一樣的)

  1  對於物理硬件非SMP環境,設置虛擬機爲smp,多個vcpu在宿主硬件上分時調度。

  2  對於物理硬件爲SMP環境,設置虛擬機爲smp,多個vcpu在宿主機上被分配到多個cpu上同時執行。

在qemu-kvm的命令中,“-smp”參數即是爲了配置客戶機的smp系統,

  -smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]

  maxcpus最爲虛擬機可以使用的vcpu最大值,用於動態添加vcpu,需要虛擬機支持。(在rhel6.5 beta中,測試很完美,加速qemu-ga的guest-set-cpus,可以平滑的將虛擬機的資源做調控)

疑問:

  KVM環境下的smp的架構是如何處理時限的,也就是cores * 2,socket * 2 ,threads * 2與 cores * 1,socket * 8,thread * 1  有什麼本質的區別?

  因爲爲虛擬機提供計算的vcpu在宿主機上實際爲一個線程,線程上並不會對cores、sockets或者threads做明確區分,也就是整體設置2*2*2 和 1*8*1是沒區別的。

  不過在虛擬機內部,可能會有系統傾向於(服務器的設別程度)多物理插槽,或者多物理核心。(之前遇到的win2k8(非Datacenter)的情況就是,無法識別超過8個的vcpu,但是設置成2*6*1 即可實現12個vcpu的服務器

  • KVM環境下的CPU過載使用

  CPU的過載使用和內存的過載是完全不同的兩種用法。CPU是服務器的計算資源,如果沒有應用使用cpu,則會被系統idel佔用。分配cpu資源的時候也是不會說我給分配20%或30%,而是調整優先級。

  CPU的過載簡單的理解就是vcpus的總是大於物理服務器的cpu個數,當虛擬機不是cpu滿載的時候,是不會對整體的性能造成影響的。因爲我們的系統本身的進程數就遠大於cpu的個數,而客戶機的進程和普通的進程沒有區別,只是有多個vcpu的線程。

!!!強烈不推薦的做法:單臺客戶機的vcpu總是大於宿主機cpu個數。性能會嚴重受到影響。

當然,因爲服務器上的任何功能都是和cpu關聯的,(內存分配、I/O等等),所以我自己不是很推薦虛擬機跑計算密集型的應用或者集中跑密集型的應用(就是大部分的虛擬機都是計算型的)。

  • CPU模型

  每一種VMM(Virtual Machine Monitor)都會定義自己的策略,讓客戶及看起來有一個默認的CPU模型。(對於cpu的一些特性還是非常模糊,就像模型我還是完全不知道有什麼作用)

  有的Hypervisor會簡單的將宿主機中的CPU的類型和特性直接傳遞給客戶機使用

  而Qemu/kvm在默認情況下會客戶機提供一個名爲qemu64和qemu32的基本cpu模型。qemu/kvm的這種策略會帶來一些好 處,如可以對cpu特性提供一些高級的過濾功能,還可以將物理平臺根據提供的基本cpu模型進行分組。從而讓客戶機在同一組硬件平臺上的動態遷移更加平滑 和安全。(之前有一次就是將虛擬機遷移到另一臺機器上,但無法卻無法遷移回來,因爲缺少cpu指令集)

可以只用qemu-kvm -cpu ?  查看

  什麼是進程親和性:簡單的一句話就是我這個Linux進程到底可以在哪幾個cpu上做負載均衡。

  KVM虛擬機是一個普通的linux進程,vcpu是一個線程,我們可以在宿主機上將vcpu線程對應的tid綁定到指定的cpu上。

  taskset -p [mask] pid

  綁定vcpu到指定的cpu上,的確會提高性能,因爲在vcpu的線程在物理cpu做負載均衡的時候,會有一些必要的數據結構初始化 (vmlaunch)相對於VM-Entry來說是比較奢侈的,加上cache的命中,性能必然會有所提高,但破壞了負載均衡。當綁定在同一cpu上的兩 個vcpu同時高負載的時候,性能就會大打折扣,而其他的cpu也沒有得到充分的利用。

  在KVM環境中,一般並不推薦手動設置qemu進程的處理器親和性來綁定vCPU,但是,在非常瞭解系統硬件架構的基礎上,根據實際應用的需求,可以將其綁定到特定的CPU上,從而提高客戶機中的CPU執行效率或實現CPU資源獨享的隔離性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章