O00六、CPU和內存虛擬化原理

 
前面咱們成功的把KVM跑起來了,有了些感性認識,這個對於初學者很是重要。不過還不夠,咱們多少要了解一些KVM的實現機制,這對後面工做會頗有幫助。
 
CPU 虛擬化
 
KVM 的虛擬化 是須要CPU硬件支持的。還記得咱們在前面的章節講過用命令來查看CPU是否支持KVM虛擬化嗎?
 
root@ubuntu:~# egrep -o '(vmx|svm)'  /proc/cpuinfo
vmx
vmx
vmx
vmx
 
若是輸出有 vmx 或者 svm ,就說明當前的CPU 支持 KVM 。 CPU 廠商 intel 和 AMD 都支持虛擬化,除非是很是老的 CPU。
 
一個 KVM 虛擬在宿主機中其實就是一個qemu-kvm 進程,與其餘 Linux進程同樣被調度。好比咱們在實驗機上運行的虛機 kvm1 ,在宿主機的ps中就能夠看到他的進程。
 
root@ubuntu:~# ps -ef | grep kvm1
libvirt+  4988     1  9 20:39 ?        00:00:05 qemu-system-x86_64 -enable-kvm -name kvm1 -S -machine pc-i440fx-xenial,accel=kvm,usb=off -cpu Haswell-noTSX -m 100 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 3a40949c-5e76-43b2-9a5c-60ebb442798d -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-kvm1/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x6.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x6 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x6.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x6.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 -drive file=/var/lib/libvirt/images/cirros-0.3.3-x86_64-disk.img,format=qcow2,if=none,id=drive-ide0-0-0 -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=30,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:47:ab:ab,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev spicevmc,id=charchannel0,name=vdagent -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off,seamless-migration=on -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vgamem_mb=16,bus=pci.0,addr=0x2 -device intel-hda,id=sound0,bus=pci.0,addr=0x4 -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 -chardev spicevmc,id=charredir0,name=usbredir -device usb-redir,chardev=charredir0,id=redir0 -chardev spicevmc,id=charredir1,name=usbredir -device usb-redir,chardev=charredir1,id=redir1 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x7 -msg timestamp=on
 
 
虛機中的每個虛擬 vCPU 則對應 qemu-kvm 進程中的一個線程。見下圖
 
 
在這個例子中,宿主機有兩個物理CPU,上面起了兩個虛機 VM1 和 VM2 。VM1 有兩個 vCPU,VM2有4個vCPU。能夠看到VM1 和 VM2分別有2個和4個線程在兩個物理CPU上調度。
 
這裏也演示了另外一個知識點,即虛機的vCPU總數能夠超過物理CPU數量,這個叫 CPU overcommit (超配)。KVM容許 overcomit ,這個特性使得虛機可以充分利用宿主機的CPU資源,但前提是在同一時刻不是全部的虛機都滿負荷運行。固然,若是每一個虛機都很忙,反而會影響總體性能,因此在使用 overcommit的時候,須要對虛機的負載狀況有所瞭解,須要測試。
 
內存虛擬化
 
KVM 經過內存虛擬化共享物理系統內存,動態分配給虛機。見下圖
 
 
爲了在一臺機器上運行多個虛機,KVM須要實現 VA (虛擬內存) -> PA (物理內存) -> MA (機器內存)之間的地址轉換。虛機OS控制 VA - PA ,物理機OS 控制 PA - MA。
 
內存也是能夠 overcommit 的,即全部虛機的內存之和能夠超過宿主機的物理內存,但使用時也須要充分測試,不然會影響性能。
相關文章
相關標籤/搜索