前面咱們成功地把 KVM 跑起來了,有了些感性認識,這個對於初學者很是重要。不過還不夠,咱們多少得了解一些 KVM 的實現機制,這對之後的工做會有幫助。ubuntu
KVM 的虛擬化是須要 CPU 硬件支持的。還記得咱們在前面的章節講過用命令來查看 CPU 是否支持KVM虛擬化嗎?
ide
root@ubuntu:~# egrep -o '(vmx|svm)' /proc/cpuinfo vmx性能
若是有輸出 vmx 或者 svm,就說明當前的 CPU 支持 KVM。CPU 廠商 Intel 和 AMD 都支持虛擬化了,除非是很是老的 CPU。測試
一個 KVM 虛機在宿主機中實際上是一個 qemu-kvm 進程,與其餘 Linux 進程同樣被調度。 好比在個人實驗機上運行的虛機 kvm1 在宿主機中 ps 能看到相應的進程。ui
虛機中的每個虛擬 vCPU 則對應 qemu-kvm 進程中的一個線程。看下圖spa
在這個例子中,宿主機有兩個物理 CPU,上面起了兩個虛機 VM1 和 VM2。 VM1 有兩個 vCPU,VM2 有 4 個 vCPU。能夠看到 VM1 和 VM2 分別有兩個和 4 個線程在兩個物理 CPU 上調度。線程
這裏也演示了另外一個知識點,即虛機的 vCPU 總數能夠超過物理 CPU 數量,這個叫 CPU overcommit(超配)。 KVM 容許 overcommit,這個特性使得虛機可以充分利用宿主機的 CPU 資源,但前提是在同一時刻,不是全部的虛機都滿負荷運行。 固然,若是每一個虛機都很忙,反而會影響總體性能,因此在使用 overcommit 的時候,須要對虛機的負載狀況有所瞭解,須要測試。orm
KVM 經過內存虛擬化共享物理系統內存,動態分配給虛擬機。看下圖
進程
爲了在一臺機器上運行多個虛擬機,KVM 須要實現 VA(虛擬內存) -> PA(物理內存) -> MA(機器內存)直接的地址轉換。虛機 OS 控制虛擬地址到客戶內存物理地址的映射 (VA -> PA),可是虛機 OS 不能直接訪問實際機器內存,所以 KVM 須要負責映射客戶物理內存到實際機器內存 (PA -> MA)。具體的實現就不作過多介紹了,你們有興趣能夠查查資料。內存
還有一點提醒你們,內存也是能夠 overcommit 的,即全部虛機的內存之和能夠超過宿主機的物理內存。但使用時也須要充分測試,不然性能會受影響。
下一節咱們討論 KVM 如何實現存儲虛擬化。