前面我們成功地把 KVM 跑起來了,有了些感性認識,這個對于初學者非常重要。不過還不夠,我們多少得了解一些 KVM 的實作機制,這對以後的工作會有幫助。
KVM 的虛拟化是需要 CPU 硬體支援的。還記得我們在前面的章節講過用指令來檢視 CPU 是否支援KVM虛拟化嗎?
root@ubuntu:~# egrep -o '(vmx|svm)' /proc/cpuinfo vmx
如果有輸出 vmx 或者 svm,就說明目前的 CPU 支援 KVM。CPU 廠商 Intel 和 AMD 都支援虛拟化了,除非是非常老的 CPU。
一個 KVM 虛機在主控端中其實是一個 qemu-kvm 程序,與其他 Linux 程序一樣被排程。
比如在我的實驗機上運作的虛機 kvm1 在主控端中 ps 能看到相應的程序。
虛機中的每一個虛拟 vCPU 則對應 qemu-kvm 程序中的一個線程。看下圖
在這個例子中,主控端有兩個實體 CPU,上面起了兩個虛機 VM1 和 VM2。
VM1 有兩個 vCPU,VM2 有 4 個 vCPU。可以看到 VM1 和 VM2 分别有兩個和 4 個線程在兩個實體 CPU 上排程。
這裡也示範了另一個知識點,即虛機的 vCPU 總數可以超過實體 CPU 數量,這個叫 CPU overcommit(超配)。
KVM 允許 overcommit,這個特性使得虛機能夠充分利用主控端的 CPU 資源,但前提是在同一時刻,不是所有的虛機都滿負荷運作。
當然,如果每個虛機都很忙,反而會影響整體性能,是以在使用 overcommit 的時候,需要對虛機的負載情況有所了解,需要測試。
KVM 通過記憶體虛拟化共享實體系統記憶體,動态配置設定給虛拟機。看下圖
為了在一台機器上運作多個虛拟機,KVM 需要實作 VA(虛拟記憶體) -> PA(實體記憶體) -> MA(機器記憶體)直接的位址轉換。虛機 OS 控制虛拟位址到客戶記憶體實體位址的映射 (VA -> PA),但是虛機 OS 不能直接通路實際機器記憶體,是以 KVM 需要負責映射客戶實體記憶體到實際機器記憶體 (PA -> MA)。具體的實作就不做過多介紹了,大家有興趣可以查查資料。
還有一點提醒大家,記憶體也是可以 overcommit 的,即所有虛機的記憶體之和可以超過主控端的實體記憶體。但使用時也需要充分測試,否則性能會受影響。
下一節我們讨論 KVM 如何實作存儲虛拟化。
本文轉自CloudMan6 51CTO部落格,原文連結:http://blog.51cto.com/cloudman/1749799