目錄:
(4.1)KVM虛擬機性能優化思路及方案
(4.2)利用tuned優化
(4.3)配置KSM
(4.4)經過配置大頁優化guestos
(4.5)配置CPU的親和性
(4.6)半虛擬化驅動vim
(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
(4.2.2)tuned服務爲咱們提供了一系列的優化方案,對系統不一樣的用途能夠採用不一樣的方案,咱們可使用以下的命令進行查看,其中balanced表示優化負載均衡,desktop表示優化桌面的,network-latency表示優化網絡延遲的,network-throughput表示優化網絡吞吐量的,powersave表示使用節電模式優化,virtual-guest表示優化客戶機的,virtual-host表示優化宿主機的。
# tuned-adm list
(4.2.3)若是咱們想知道每一個優化方案的具體內容,能夠進入到/usr/lib/tuned/目錄中查看,能夠發現virtual-guest中設置的vm.dirty_ratio值就是/proc/sys/vm/目錄下的dirty_ratio
(4.2.4)咱們也能夠本身定製一個方案kvm-os,在tuned.conf配置文件中修改vm.dirty_ratio值爲20
(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
(4.2.6)咱們若是隻想查看當前系統使用的方案可使用active的參數查看,若是咱們想查看系統的推薦的優化方案則可使用recommend參數
# tuned-adm active
# tuned-adm recommend性能優化
(4.3)配置KSM
(4.3.1)咱們若是從內存方面來考慮優化時,主要會從三個方面入手,分別是balloon、KSM、大頁。首先是balloon氣球,它主要是經過balloon來實現內存的一種動態收縮,通常若是咱們須要修改虛擬機的內存是經過關閉虛擬機後,而後去設置虛擬機的內存大小,正常狀況下是沒法實如今線修改的,可是咱們使用了balloon技術後就能夠實如今線修改虛擬機內存大小的需求
(4.3.2)在Linux系統中默認是開啓balloon服務的。
# grep -i balloon /boot/config-3.10.0-229.el7.x86_64
(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
(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資源的使用。
(4.3.5)如今咱們在/var/lib/libvirt/images目錄中方兩個相同的鏡像small1.img和small2.img,分別給small1.img和small2.img鏡像的內存大小都設置爲2048M,並設置好網卡,硬盤,顯示協議的配置信息。
注意:咱們能夠在虛擬機中設置以下的信息,指定虛擬機不使用共享頁
# virsh edit small1
<memoryBacking>
<nosharepages/>
</memoryBacking>
(4.3.6)若是咱們想要使用KSM技術,則必需要開啓ksm.service和ksmtuned.service這兩個服務。
# systemctl list-unit-files | grep ksm
(4.3.7)咱們進入到/sys/kernel/mm/ksm/目錄下,此處的配資文件就是對咱們的KSM屬性進行設置的。
(4.3.8)/sys/kernel/mm/ksm/目錄下run參數通常有3個可用值:0、一、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/
(4.3.9)因爲KSM中run的值默認的狀態是1,因此是啓用相同頁合併的功能的,此時咱們將run的值修改成2即中止掃描,並將已經合併的相同頁分開。能夠發現此時兩臺虛擬機small1和small2所使用的共享內存已經分開了,因此物理機vms002主機消耗由926M增長到了3661M。這就是使用KSM技術給咱們內存使用效率帶來極大提高的一個表現方式。
# echo 2 > /sys/kernel/mm/ksm/run
(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
(4.3.11)sleep_millisecs表示的是掃描的時間間隔,KSM須要去掃描內存,找到那些相同頁,而後把這些相同頁合併,由於KSM須要經過掃描操做而找到相同頁,可是掃描不可能一直進行,正常的是要有間隔的,因此sleep_millisecs參數就是設置這個間隔參數的,sleep_millisecs參數的默認單位是毫秒,例如在個人主機中cat sleep_millisecs的參數值爲41毫秒。每隔41ms掃描一次,掃描的時候,run裏的值會被自動設置爲1,待掃描完成後,run裏的值會自動設置爲0。
(4.3.12)pages_unshared表示的是在內存中沒有共同數據而沒法合併的頁;pages_volatile表示的是在內存中有一部分的數據變化很是的頻繁,而致使內存是沒法合併的;pages_to_scan表示的是從上次休眠到此次休眠之間掃描了多少個頁面。服務器
(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的時候咱們稱之爲大頁或者巨頁,當咱們運行消耗很大內存的應用程序的時候,咱們分配給這個應用程序大頁,就能夠很好的提升咱們讀取內存的性能。
(4.4.1)咱們經過查看/proc/meminfo就能夠了解到當前系統中大頁的配置使用狀況,當前系統中大頁的個數HugePages_Total爲0,且大頁的默認大小Hugepagesize爲2M
# cat /proc/meminfo | grep Huge
(4.4.2)咱們也是能夠對咱們大頁的默認值進行設置的,咱們進入到/proc/sys/vm/目錄下,其中nr_hugepages表示設置大頁的數值,咱們設置爲2500個,因此此時咱們系統中一共有2500*2M即5G左右的大頁內存空間可用。
(4.4.3)以上的設置只是當前生效,在系統重啓後就會失效了,若是咱們但願系統在重啓後也仍然可以生效,則應該把設置寫入到/etc/sysctl.conf的配置文件中
# sysctl -a | grep nr_hugepages >> /etc/sysctl.conf
(4.4.4)接着咱們配置一個虛擬機來使用大頁,咱們編輯rhel7-1虛擬機,添加使用大頁的參數,將虛擬機啓動後
# virsh edit rhel7-1
<memoryBacking>
<hugepages/>
</memoryBacking>
(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
(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
(4.4.7)此時咱們發現系統中的已經生成了單位大小爲1G的大頁且有5個,咱們將rhel7-1虛擬機啓動起來後,便開始使用3個1G的巨頁運行虛擬機了,這樣即可以有效的提升咱們內存和CPU的使用效率。網絡
(4.5)配置CPU的親和性
(4.5.1)咱們的主機是有2顆可用的CPU,因此正常狀況下咱們的虛擬機的進程是運行在任意的CPU上的。
# ps mo pid,lwp,comm,psr,args pgrep qemu-kvm
(4.5.2)若是咱們但願每一個虛擬機運行在各自的CPU上,不會互相搶佔資源,則能夠經過在KVM虛擬機中設置CPU的親和性,設置rhel7-1虛擬機的進程在1號CPU上運行,設置rhel7-2虛擬機得進程默認是在0號CPU上運行,咱們使用top命令查詢到兩臺虛擬機的進程,最終發現兩臺虛擬機都運行在各自設置的CPU上了。
# virsh edit rhel7-1負載均衡
(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.在宿主機啓動被遷移的虛擬機。
(4.6.2)對Windows系統作V2V的過程:1.首先在Windows虛擬機裏安裝virtio-win和libguestfs-winsuppor驅動程序;2.把Windows虛擬機的硬盤文件及配置文件拷貝到KVM宿主機裏;3.開始對硬盤格式進行轉換及配置文件格式轉換和文件修改;4.在宿主機啓動被遷移的虛擬機。
(4.6.3)接着咱們使用一臺rhel6.6的系統模擬物理機,在rhel6.6物理機的KVM環境中安裝一臺Win7系統,用軟盤的方式添加virtio-win的驅動
(4.6.4)接着要選擇加載驅動程序項,將軟盤的Win7加載進來,此時就能正常的看到硬盤分區信息了
(4.6.5)安裝好系統後會發現網卡不能識別,這是因爲KVM中的Windows虛擬機缺乏驅動的緣由形成的,此時咱們須要將RHEV-toolsSetup_3.5_9.iso這個鏡像導入到Windows虛擬機中,首先將CD驅動器彈出,而後設置掛載RHEV-toolsSetup_3.5_9.iso這個鏡像,此時找到RHEV-toolsSetup軟件運行安裝起來便可。
(4.6.6)全部驅動程序安裝完畢後須要將系統重啓一下,此時咱們的系統便正常的獲取了IP地址了,同時發現相關的設備也已經安裝上了Redhat提供的設備驅動正常運行了。ide
—————— 本文至此結束,感謝閱讀 ——————性能