玩轉OpenStack--6>CPU 和記憶體虛擬化原理
玩轉OpenStack--6>CPU 和記憶體虛擬化原理
前面我們成功地把 KVM 跑起來了,有了些感性認識,這個對於初學者非常重要。不過還不夠,我們多少得了解一些 KVM 的實現機制,這對以後的工作會有幫助。
CPU 虛擬化
KVM 的虛擬化是需要 CPU 硬體支援的。還記得我們在前面的章節講過用命令來檢視 CPU 是否支援KVM虛擬化嗎?
[email protected]:~# 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 的,即所有虛機的記憶體之和可以超過宿主機的實體記憶體。但使用時也需要充分測試,否則效能會受影響。