【恆天雲技術分享系列3】KVM效能調優

恆天雲發表於2014-09-19

 

KVM是什麼 

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。

KVM (全稱是 Kernel-based Virtual Machine) 是 Linux 下 x86 硬體平臺上的全功能虛擬化解決方案,包含一個可載入的核心模組 kvm.ko 提供和虛擬化核心架構和處理器規範模組。 

使用 KVM 可允許多個包括 Linux 和 Windows 每個虛擬機器有私有的硬體,包括網路卡、磁碟以及圖形適配卡等。 

KVM為什麼要調優 

效能的損耗是關鍵。KVM是全虛擬化技術,全虛擬化有一個軟體模擬硬體層,有一定的損耗,特別是IO這一塊,因此我們需要最佳化。 

KVM如何調優

KVM虛擬環境效能最佳化的幾個措施

KVM本來效能已經很不錯了,但還有一些微調措施來進一步提高KVM效能。 

1. virtio 

virtio是KVM的半虛擬化機制,用以提高IO效能,使用virtio可以顯著提高KVM效能。大部分的linux都已經整合virtio驅動,windows則因沒有整合virtio驅動所以需要手動安裝。 

2. 使用writeback快取選項 

針對客戶機塊裝置的快取,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. 

writethrough寫操作時不使用主機的快取,只有當主機接受 到儲存子系統寫操作完成的通知後,主機才通知客戶機寫操作完成,也就是說這是同步的。而writeback則是非同步的,它使用主機的快取,當客戶機寫入主 機快取後立刻會被通知寫操作完成,而此時主機尚未將資料真正寫入儲存系統,之後待合適的時機主機會真正的將資料寫入儲存。顯然writeback會更快, 但是可能風險稍大一些,如果主機突然掉電,就會丟失一部分客戶機資料。 

這樣使用writeback選項 

-drive file=debian.img,if=virtio,index=0,media=disk,format=qcow2,cache=writeback CDROM裝置也可以使用writeback選項 

3. 客戶機的磁碟IO排程策略 

磁碟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 

4. 開啟KSM(Kernel Samepage Merging) 

頁共享早已有之,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。 

5. KVM Huge Page Backed Memory 

透過為客戶機提供巨頁後端記憶體,減少客戶機消耗的記憶體並提高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來大體估算。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29800029/viewspace-1274471/,如需轉載,請註明出處,否則將追究法律責任。

相關文章