【恆天雲技術分享系列3】KVM效能調優
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- GaussDB技術解讀系列:效能調優
- 技術更新!10個MySQL效能調優技巧MySql
- iOS核心動畫高階技術(十二) 效能調優iOS動畫
- 個推技術分享:效能提升60%↑ 成本降低50%↓ Spark效能調優看這篇就夠了!Spark
- 技術分享 | 調整 max-write-buffer-size 優化 pika 效能10倍的案例優化
- Mysql 效能調優 一 3MySql
- kvm移植技術
- 個推技術分享 | 掌握這兩個調優技巧,讓TiDB效能提速千倍TiDB
- 京東小程式接入ARVR的技術方案和效能調優VR
- Mysql技術內幕InnoDB儲存引擎--《九》效能調優MySql儲存引擎
- 前端技術分享:頁面效能優化問題覆盤前端優化
- 恆訊科技技術分享:雲端計算中的核心技術有哪些?
- KVM虛擬機器的效能優化-免費分享公開課虛擬機優化
- 前端優化系列 – JS混淆引入效能天坑前端優化JS
- 前端優化系列 - JS混淆引入效能天坑前端優化JS
- 恆訊科技分析雲服務的核心技術
- 天翼雲混合雲容災技術解析
- Netflix分享Node.js效能調優Node.js
- KVM 虛擬化技術
- Golang pprof 效能調優實戰,效能提升 3 倍!Golang
- Spring Boot Serverless 實戰系列 | 效能調優Spring BootServer
- 前端不哭!最新優化效能經驗分享來啦 | 技術頭條前端優化
- 個推技術實踐 | Spark效能調優看這篇,效能提升60%↑ 成本降低50%↓Spark
- KVM虛擬機器的效能優化虛擬機優化
- Spark 效能調優--資源調優Spark
- Spark 效能調優--Shuffle調優 SortShuffleManagerSpark
- Linux工具效能調優系列二:buffer和cacheLinux
- UI技術總結--效能優化UI優化
- 【效能調優】效能測試、分析與調優基礎
- apache kafka技術分享系列(目錄索引)ApacheKafka索引
- ElasticSearch效能調優Elasticsearch
- Nginx 效能調優Nginx
- iOS效能調優iOS
- php效能調優PHP
- Java效能調優Java
- Spark效能調優Spark
- oracle效能調優Oracle
- 技術分享 | 雲原生多模型 NoSQL 概述模型SQL