恆天雲技術分享:http://www.hengtianyun.com/download-show-id-11.htmlhtml
KVM 是 kernel-based Virtual Machine 的簡稱,是一個開源的系統虛擬化模塊,自Linux 2.6.20以後集成在Linux的各個主要發行版本中。它使用Linux自身的調度器進行管理,因此相對於Xen,其核心源碼不多。KVM目前已成爲學術界的主流VMM之一。KVM的虛擬化須要硬件支持(如Intel VT技術或者AMD V技術)。是基於硬件的徹底虛擬化。而Xen早期則是基於軟件模擬的Para-Virtualization,新版本則是基於硬件支持的徹底虛擬化。但Xen自己有本身到進程調度器,存儲管理模塊等,因此代碼較爲龐大。廣爲流傳的商業系統虛擬化軟件VMware ESX系列也是基於軟件模擬的Para-Virtualization。linux
KVM (全稱是 Kernel-based Virtual Machine) 是 Linux 下 x86 硬件平臺上的全功能虛擬化解決方案,包含一個可加載的內核模塊 kvm.ko 提供和虛擬化核心架構和處理器規範模塊。
算法
使用 KVM 可容許多個包括 Linux 和 Windows 每一個虛擬機有私有的硬件,包括網卡、磁盤以及圖形適配卡等。
windows
性能的損耗是關鍵。KVM是全虛擬化技術,全虛擬化有一個軟件模擬硬件層,有必定的損耗,特別是IO這一塊,所以咱們須要優化。
後端
KVM虛擬環境性能優化的幾個措施緩存
KVM原本性能已經很不錯了,但還有一些微調措施來進一步提升KVM性能。
性能優化
virtio是KVM的半虛擬化機制,用以提升IO性能,使用virtio能夠顯著提升KVM性能。大部分的linux都已經集成virtio驅動,windows則因沒有集成virtio驅動因此須要手動安裝。
架構
針對客戶機塊設備的緩存,drive有一個子選項cache來設置緩存模式。兩個主要的選項爲writeback和writethrough,man手冊是這樣說的
異步
By default, writethrough caching is used for all block device. This means that the host page cache will be used to read and write data but write notification will be sent to the guest only when the data has been reported as written by the storage subsystem. Writeback caching will report data writes as completed as soon as the data is present in the host page cache. This is safe as long as you trust your host. If your host crashes or loses power, then the guest may experience data corruption.
oop
writethrough寫操做時不使用主機的緩存,只有當主機接受 到存儲子系統寫操做完成的通知後,主機才通知客戶機寫操做完成,也就是說這是同步的。而writeback則是異步的,它使用主機的緩存,當客戶機寫入主機緩存後馬上會被通知寫操做完成,而此時主機還沒有將數據真正寫入存儲系統,以後待合適的時機主機會真正的將數據寫入存儲。顯然writeback會更快, 可是可能風險稍大一些,若是主機忽然掉電,就會丟失一部分客戶機數據。
這樣使用writeback選項
-drive file=debian.img,if=virtio,index=0,media=disk,format=qcow2,cache=writeback CDROM設備也可使用writeback選項
磁盤IO要通過調度才能夠寫入磁盤,這種調度又稱做電梯算法。對於客戶機對磁盤的IO操做實際上要通過三次IO調度才能真正訪問到物理磁盤,客戶機對虛擬磁盤執行一次IO調度,KVM主機對全部上層的IO執行一次調度,當KVM主機將IO提交給磁盤陣列時,磁盤陣列也會對IO進行調度,最後纔會真正讀寫物理磁盤。
客戶機看到的磁盤只不過是主機的一個文件,因此其IO調度並沒有太大意義,反而會影響IO效率,因此能夠經過將客戶機的IO調度策略設置爲NOOP來提升性能。NOOP就是一個FIFO隊列,不作IO調度。
linux客戶機使用grub2引導時,能夠經過給內核傳遞一個參數來使用NOOP調度策略 編輯文件/etc/default/grub
行GRUB_CMDLINE_LINUX_DEFAULT=」quiet splash」後添加elevator=noop,變成爲 GRUB_CMDLINE_LINUX_DEFAULT=」quiet splash elevator=noop」
而後 $ sudo update-grub
頁共享早已有之,linux中稱之爲COW(copy on write)。內核2.6.32以後又引入了KSM。KSM特性可讓內核查找內存中徹底相同的內存頁而後將他們合併,並將合併後的內存頁打上COW標記。KSM對KVM環境有很重要的意義,當KVM上運行許多相同系統的客戶機時,客戶機之間將有許多內存頁是徹底相同的,特別是只讀的內核代碼頁徹底能夠 在客戶機之間共享,從而減小客戶機佔用的內存資源,從而能夠同時運行更多的客戶機。
Debian系統中KSM默認是關閉的,經過如下命令來開啓KSM
# echo 1 > /sys/kernel/mm/ksm/run
關閉KSM
# echo 0 > /sys/kernel/mm/ksm/run
這樣設置後,從新啓動系統KSM會恢復到默認狀態,還沒有找個哪一個內核參數能夠設置在/etc/sysctl.conf中讓KSM持久運行。
能夠在/etc/rc.local中添加
echo 1 > /sys/kernel/mm/ksm/run
讓KSM開機自動運行
經過/sys/kernel/mm/ksm目錄下的文件來查看內存頁共享的狀況,pages_shared文件中記錄了KSM已經共享的頁面數。
國人對KSM作了進一步優化,這就是UKSM(Ultra KSM)項目,聽說比KSM掃描更全面,頁面速度更快,並且CPU佔用率更低,但願此項目能儘快進入內核mainline。
KSM會稍微的影響系統性能,以效率換空間,若是系統的內存很寬裕,則無須開啓KSM,若是想盡量多的並行運行KVM客戶機,則能夠打開KSM。
經過爲客戶機提供巨頁後端內存,減小客戶機消耗的內存並提升TLB命中率,從而提高KVM性能。x86 CPU一般使用4K內存頁,但也有能力使用更大的內存頁,x86_32可使用4MB內存頁,x86_64和x86_32 PAE可使用2MB內存頁。x86使用多級頁表結構,通常有三級,頁目錄表->頁表->頁,因此經過使用巨頁,能夠減小頁目錄表和也表對內存的消耗。固然x86有缺頁機制,並非全部代碼、數據頁面都會駐留在內存中。
首先掛裝hugetlbfs文件系統
#mkdir /hugepages
#mount -t hugetlbfs hugetlbfs /hugepages
而後指定巨頁須要的內存頁面數
#sysctl vm.nr_hugepages=xxx
最後指定KVM客戶機使用巨頁來分配內存
kvm -mem-path /hugepages
也可讓系統開機自動掛載hugetlbfs文件系統,在/etc/fstab中添加
hugetlbfs /hugepages hugetlbfs defaults 0 0
在/etc/sysctl.conf中添加以下參數來持久設定巨頁文件系統須要的內存頁面數
vm.nr_hugepages=xxx
巨頁文件系統須要的頁面數能夠由客戶機須要的內存除以頁面大小也就是2M來大致估算。