KVM虛擬化技術詳解(四)--KVM的優化

目錄:
(4.1)KVM虛擬機性能優化思路及方案
(4.2)利用tuned優化
(4.3)配置KSM
(4.4)通過配置大頁優化guestos
(4.5)配置CPU的親和性
(4.6)半虛擬化驅動


(4.1)KVM虛擬機性能優化思路及方案
通過前面的學習我們已經可以正常的創建虛擬機了,當然運行虛擬機不是難點,難點在於怎樣讓我們創建的虛擬機運行的更高效。我們要運行的KVM虛擬機一般要從內存來考慮,考慮每臺虛擬機消耗內存的大小;同時還要從CPU資源來考慮,確保每臺虛擬機有足夠的CPU資源使用,還要保證每臺虛擬機使用CPU資源時不會越界而導致系統管理異常;還要從虛擬機的網絡消耗來考慮確保網絡傳輸通暢,以及服務在運行時網絡的可靠性保證等;最後還要從虛擬機硬盤的IO速率來考慮,保證數據傳輸時的IO高可靠傳輸。


(4.2)利用tuned優化
(4.2.1)首先我們檢查一下系統中tuned服務是否是正常的運行的。
# yum list tuned*
# systemctl list-unit-files | grep tuned
# systemctl is-active tuned
KVM虛擬化技術詳解(四)--KVM的優化
(4.2.2)tuned服務爲我們提供了一系列的優化方案,對系統不同的用途可以採用不同的方案,我們可以使用如下的命令進行查看,其中balanced表示優化負載均衡,desktop表示優化桌面的,network-latency表示優化網絡延遲的,network-throughput表示優化網絡吞吐量的,powersave表示使用節電模式優化,virtual-guest表示優化客戶機的,virtual-host表示優化宿主機的。
# tuned-adm list
KVM虛擬化技術詳解(四)--KVM的優化
(4.2.3)如果我們想知道每個優化方案的具體內容,可以進入到/usr/lib/tuned/目錄中查看,可以發現virtual-guest中設置的vm.dirty_ratio值就是/proc/sys/vm/目錄下的dirty_ratio
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.2.4)我們也可以自己定製一個方案kvm-os,在tuned.conf配置文件中修改vm.dirty_ratio值爲20
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.2.5)此時我們發現kvm-os這個方案已經生成了,接着我們設置當前生效的方案爲kvm-os,同時發現在我們的系統中/proc/sys/vm/dirty_ratio的值也已經由之前的30變成當前的20了
# tuned-adm list
# tuned-adm profile kvm-os
# cat /proc/sys/vm/dirty_ratio
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.2.6)我們如果只想查看當前系統使用的方案可以使用active的參數查看,如果我們想查看系統的推薦的優化方案則可以使用recommend參數
# tuned-adm active
# tuned-adm recommend
KVM虛擬化技術詳解(四)--KVM的優化


(4.3)配置KSM
(4.3.1)我們如果從內存方面來考慮優化時,主要會從三個方面入手,分別是balloon、KSM、大頁。首先是balloon氣球,它主要是通過balloon來實現內存的一種動態收縮,一般如果我們需要修改虛擬機的內存是通過關閉虛擬機後,然後去設置虛擬機的內存大小,正常情況下是無法實現在線修改的,但是我們使用了balloon技術後就可以實現在線修改虛擬機內存大小的需求
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.2)在Linux系統中默認是開啓balloon服務的。
# grep -i balloon /boot/config-3.10.0-229.el7.x86_64
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.3)我們在vms002主機上打開KVM環境中的rhel7.1虛擬機,查詢到rhel7.1虛擬機的可用內存爲2G左右。然後我們可以設置rhel7.1虛擬機的balloon氣球的大小爲512M,也可以設置rhel7.1虛擬機的balloon氣球的大小爲1024M,所以可以看出來balloon的數值減小則虛擬機的可用內存減小,balloon的數值增大則虛擬機的可用內存增大。
# virsh --help | grep qemu
# virsh qemu-monitor-command rhel7-1 --hmp --cmd info balloon
# virsh qemu-monitor-command rhel7-1 --hmp --cmd balloon 512
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.4)雖然基於內核的虛擬機KVM被設計爲自調優,但是可以調整一些參數使KVM主機性能更好。最重要的參數之一就是內核同頁合併KSM(kernel samepage merging),這一特性允許內核更有效地處理內存。KSM允許Linux內核識別出包含相同內容頁的內存頁,然後合併這些內存頁,將數據整合在一個位置可以多次引用。在我們的物理機中如果使用了KSM技術,是可以很好的節約我們的內存空間提升效率的。內存的最小單位是page(頁),現在假設我們的物理機上有兩臺虛擬機,vm1和vm2這兩臺虛擬機都是會消耗物理機的內存的,所以虛擬機裏的內存數據,最終還是保存在物理機的內存中承載的,現在假設vm1和vm2兩臺虛擬機都各自消耗了1G的內存,此時在物理機中一共消耗2G的內存,此時如果這兩個系統是相同的,且運行的服務也是相同的,那麼此時vm1的內存中和vm2的內存中應該會存在很多的相同數據,例如有800M的相同數據,那麼通過KSM技術便可以將這800M的數據合併在一起共同使用,此時兩臺虛擬機一共佔用的實際物理總內存就會由原來的2048M減少到現在的1248M的空間,這樣可以極大的節約我們的物理內存資源。這樣就讓我們一個物理機4G內存,運行30-50臺虛擬機就變成了可能,不過此時還會有其他的問題,例如我們的硬盤可能無法支撐如此多的虛擬機同時運行時的大量IO讀寫,且我們的CPU如果不夠強悍的話可能也是會佔用到我們其他服務對CPU資源的使用。
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.5)現在我們在/var/lib/libvirt/images目錄中方兩個相同的鏡像small1.img和small2.img,分別給small1.img和small2.img鏡像的內存大小都設置爲2048M,並設置好網卡,硬盤,顯示協議的配置信息。
注意:我們可以在虛擬機中設置如下的信息,指定虛擬機不使用共享頁
# virsh edit small1
<memoryBacking>
<nosharepages/>
</memoryBacking>
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.6)如果我們想要使用KSM技術,則必須要開啓ksm.service和ksmtuned.service這兩個服務。
# systemctl list-unit-files | grep ksm
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.7)我們進入到/sys/kernel/mm/ksm/目錄下,此處的配資文件就是對我們的KSM屬性進行設置的。
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.8)/sys/kernel/mm/ksm/目錄下run參數一般有3個可用值:0、1、2,其中run值爲0代表的是停止相同頁掃描,但是已經合併的相同頁會繼續保留;如果設置的run值爲1代表激活相同頁合併的掃描;如果設置的run值爲2代表的是停止掃描,已經合併的相同頁會分開。我們將small1和small2兩臺虛擬機啓動起來後,然後讓small1虛擬機和small2虛擬機消耗足夠大的內存,將兩臺虛擬機都掛載到內存中,同時在small1虛擬機上創建一個文件大小爲2G,名稱爲file的文件,並將創建的2G文件拷貝到small2虛擬機上。
# mount -t tmpfs none /mnt
# dd if=/dev/zero of=file bs=1G count=2
# scp file 192.168.122.159:/mnt/
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.9)由於KSM中run的值默認的狀態是1,所以是啓用相同頁合併的功能的,此時我們將run的值修改爲2即停止掃描,並將已經合併的相同頁分開。可以發現此時兩臺虛擬機small1和small2所使用的共享內存已經分開了,所以物理機vms002主機消耗由926M增加到了3661M。這就是使用KSM技術給我們內存使用效率帶來極大提升的一個表現方式。
# echo 2 > /sys/kernel/mm/ksm/run
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.10)如果我們想要計算使用KSM實際節省了多少的內存,計算正在被合併的page的數量,則可以查看pages_sharing參數,已知系統裏page的默認大小值爲4096b即4K,所以計算出801794個pages_sharing值爲3132M,大約爲3G左右的內存空間。
# getconf -a | grep -i page
# echo 801794*4/1024 | bc
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.11)sleep_millisecs表示的是掃描的時間間隔,KSM需要去掃描內存,找到那些相同頁,然後把這些相同頁合併,因爲KSM需要通過掃描操作而找到相同頁,但是掃描不可能一直進行,正常的是要有間隔的,所以sleep_millisecs參數就是設置這個間隔參數的,sleep_millisecs參數的默認單位是毫秒,例如在我的主機中cat sleep_millisecs的參數值爲41毫秒。每隔41ms掃描一次,掃描的時候,run裏的值會被自動設置爲1,待掃描完成後,run裏的值會自動設置爲0。
KVM虛擬化技術詳解(四)--KVM的優化
(4.3.12)pages_unshared表示的是在內存中沒有共同數據而無法合併的頁;pages_volatile表示的是在內存中有一部分的數據變化非常的頻繁,而導致內存是無法合併的;pages_to_scan表示的是從上次休眠到這次休眠之間掃描了多少個頁面。
KVM虛擬化技術詳解(四)--KVM的優化


(4.4)通過配置大頁優化guestos
配置大頁即通過配置page的大小,選擇合適的page從而優化我們的虛擬機的運行效率。CPU在執行任務的時候,一次只能執行一個任務,例如CPU在執行一個任務的時候,時間片到期了,那麼CPU便會將當前執行的任務封存起來去執行下一個任務,但是對每個任務來說,每個進程都會感覺自己是獨享內存的,這個內存叫做線性內存,我們使用ps命令查看的VSZ就是這個線性內存。這個線性內存需要映射到物理內存裏,這種映射關係叫做PTE,這個條目被保存在TLB的計算機硬件資源上,其中TLB名爲旁路轉換緩衝,它是CPU的一個緩存硬件。CPU在進行內存的切換的時候,一般是以頁爲單位進行切換的,而page頁的大小默認是4k,如果某個應用程序消耗大量的內存,此時產生PTE的條目就會很多,切換時就會增加CPU的負載,而我們減緩這個負載的方法就是增大page的單位大小,這樣所產生的PTE的條目就會降低,從而使得我們應用程序所運行的環境得到了優化。在我們的x86結構的服務器中,它支持的page的大小有3種:4k、2M(透明大頁)、1G,默認的page頁大小爲4k,當設置的page大小爲2M或者1G的時候我們稱之爲大頁或者巨頁,當我們運行消耗很大內存的應用程序的時候,我們分配給這個應用程序大頁,就可以很好的提高我們讀取內存的性能。
KVM虛擬化技術詳解(四)--KVM的優化
(4.4.1)我們通過查看/proc/meminfo就可以瞭解到當前系統中大頁的配置使用情況,當前系統中大頁的個數HugePages_Total爲0,且大頁的默認大小Hugepagesize爲2M
# cat /proc/meminfo | grep Huge
KVM虛擬化技術詳解(四)--KVM的優化
(4.4.2)我們也是可以對我們大頁的默認值進行設置的,我們進入到/proc/sys/vm/目錄下,其中nr_hugepages表示設置大頁的數值,我們設置爲2500個,所以此時我們系統中一共有2500*2M即5G左右的大頁內存空間可用。
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.4.3)以上的設置只是當前生效,在系統重啓後就會失效了,如果我們希望系統在重啓後也仍然能夠生效,則應該把設置寫入到/etc/sysctl.conf的配置文件中
# sysctl -a | grep nr_hugepages >> /etc/sysctl.conf
KVM虛擬化技術詳解(四)--KVM的優化
(4.4.4)接着我們配置一個虛擬機來使用大頁,我們編輯rhel7-1虛擬機,添加使用大頁的參數,將虛擬機啓動後
# virsh edit rhel7-1
<memoryBacking>
<hugepages/>
</memoryBacking>
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.4.5)此時發現(2500-444)*2M=4112M,約等於4G內存,和我們開啓的rhel7-1虛擬機使用的內存一致。這就是我們通過配置大頁優化guestos
# grep -i hugepage /boot/config-3.10.0-229.el7.x86_64---查看系統是否支持hugepage 選項
# cat /proc/meminfo | grep Huge
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.4.6)我們目前使用的大頁,系統默認設置的值爲2M,我們也可以通過修改配置文件,將默認的大頁值修改爲1G,hugepagesz=1GB表示設置大頁的值爲1G,hugepages=5表示設置大頁的個數爲5個,default_hugepagesz=1GB表示在使用大頁時如果沒有指定默認是掛載1個大頁。然後更新一下內核參數,並將系統重啓一下。
# vim /etc/default/grub
# grub2-mkconfig -o /boot/grub2/grub.cfg
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.4.7)此時我們發現系統中的已經生成了單位大小爲1G的大頁且有5個,我們將rhel7-1虛擬機啓動起來後,便開始使用3個1G的巨頁運行虛擬機了,這樣便可以有效的提高我們內存和CPU的使用效率。
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化


(4.5)配置CPU的親和性
(4.5.1)我們的主機是有2顆可用的CPU,所以正常情況下我們的虛擬機的進程是運行在任意的CPU上的。
# ps mo pid,lwp,comm,psr,args pgrep qemu-kvm
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.5.2)如果我們希望每個虛擬機運行在各自的CPU上,不會互相搶佔資源,則可以通過在KVM虛擬機中設置CPU的親和性,設置rhel7-1虛擬機的進程在1號CPU上運行,設置rhel7-2虛擬機得進程默認是在0號CPU上運行,我們使用top命令查詢到兩臺虛擬機的進程,最終發現兩臺虛擬機都運行在各自設置的CPU上了。
# virsh edit rhel7-1
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化


(4.6)半虛擬化驅動
在之前的虛擬機P2V遷移過程中,我們的宿主機KVMhost使用的是rhel6.6系統,被遷移的物理機TestRhel7使用的是rhel7.1系統,一般來說我們在做P2V時,就是在被遷移的物理機中,找一張光盤,從光盤引導,然後把這個系統裏的數據從本地硬盤遷移到宿主機KVMhost的硬盤裏。被遷移的物理機是Linux系統時遷移後是可以正常在宿主機中運行的,但是當被遷移的物理機是Windows系統時卻會出現無法正常運行的情況。一般我們把Windows系統安裝在物理機上的時候,都會在物理機裏安裝驅動,這些都是真實的硬件驅動,但是如果被遷移到宿主機的KVM環境裏後,例如無法識別KVM環境裏的硬盤virtio類型,所以就會導致無法正常開機。所以對Windows系統進行P2V之前,需要先在Windows系統裏安裝對應的軟件包纔可以,包括:virtio-win-1.1.16(disk driver).vfd和libguestfs-winsupport-1.0-7.el6.x86_64.rpm。其中virtio-win就是半虛擬化驅動,libguestfs-winsupport就是提供了對NTFS文件系統支持的驅動程序。
(4.6.1)對Windows系統做P2V的過程:1.首先在被遷移的物理機裏安裝virtio-win和libguestfs-winsuppor驅動程序;2.插入P2V光盤,開始進行P2V遷移;3.在宿主機啓動被遷移的虛擬機。
KVM虛擬化技術詳解(四)--KVM的優化
(4.6.2)對Windows系統做V2V的過程:1.首先在Windows虛擬機裏安裝virtio-win和libguestfs-winsuppor驅動程序;2.把Windows虛擬機的硬盤文件及配置文件拷貝到KVM宿主機裏;3.開始對硬盤格式進行轉換及配置文件格式轉換和文件修改;4.在宿主機啓動被遷移的虛擬機。
KVM虛擬化技術詳解(四)--KVM的優化
(4.6.3)接着我們使用一臺rhel6.6的系統模擬物理機,在rhel6.6物理機的KVM環境中安裝一臺Win7系統,用軟盤的方式添加virtio-win的驅動
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.6.4)接着要選擇加載驅動程序項,將軟盤的Win7加載進來,此時就能正常的看到硬盤分區信息了
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.6.5)安裝好系統後會發現網卡不能識別,這是由於KVM中的Windows虛擬機缺少驅動的原因造成的,此時我們需要將RHEV-toolsSetup_3.5_9.iso這個鏡像導入到Windows虛擬機中,首先將CD驅動器彈出,然後設置掛載RHEV-toolsSetup_3.5_9.iso這個鏡像,此時找到RHEV-toolsSetup軟件運行安裝起來即可。
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
(4.6.6)所有驅動程序安裝完畢後需要將系統重啓一下,此時我們的系統便正常的獲取了IP地址了,同時發現相關的設備也已經安裝上了Redhat提供的設備驅動正常運行了。
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化
KVM虛擬化技術詳解(四)--KVM的優化

—————— 本文至此結束,感謝閱讀 ——————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章