KVM

支持虛擬化的條件
intel的cpu:vmx
AMD的cpu:svm
本文使用的是vmware workstation,cpu要開啓如下兩個條件即可. 如果是物理機,需要在bios裏面設置,默認都是開啓狀態。

在cpuinfo中可以查看具體的支持虛擬化的信息
[root@linux-node1 ~]# grep -E "svm|vmx" /proc/cpuinfo (可以看到支持vmx)
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl
xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ida arat epb pln pts dtherm hwp hwp_noitfy hwp_act_window hwp_epp tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt

安裝kvm
[root@linux-node1 ~]#yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -y

kvm: linux內核的一個模塊,模塊不需要安裝,只需要加載
qemu:虛擬化軟件,可以虛擬不同的CPU,支持異構(x86的架構可以虛擬化出不是x86架構的)
qemu-kvm:用戶態管理kvm,網卡,聲卡,PCI設備等都是qemu來管理的

創建一個虛擬磁盤,-f 指定格式,路徑是/opt/CentOS-7.1-x86_64.raw,大小爲10G
[root@linux-node1 ~]# qemu-img create -f raw /opt/CentOS-7.1-x86_64.raw 10G
Formatting '/opt/CentOS-7.1-x86_64.raw', fmt=raw size=10737418240

顯示內核中kvm的狀態
[root@linux-node1 ~]# lsmod|grep kvm
kvm_intel 170181 0
kvm 554609 1 kvm_intel

[root@linux-node1 ~]#systemctl enable libvirtd.service
[root@linux-node1 ~]#systemctl start libvirtd.service
[root@linux-node1 ~]#systemctl status libvirtd.service

啓動libvirt,查看狀態,關鍵字:active
KVM

開始裝一臺虛擬機
在vmware上掛載一個鏡像
KVM

導入到宿主機中,當然時間可能較長
[root@linux-node1 ~]# dd if=/dev/cdrom of=/opt/CentOS-7.1-x86_64.iso
8830976+0 records in
8830976+0 records out
4521459712 bytes (4.5 GB) copied, 150.23 s, 30.1 MB/s

[root@linux-node1 ~]#ls /opt/
CentOS-7.1-x86_64.iso CentOS-7.1-x86_64.raw

使用命令創建一臺虛擬機
首先學virt-install命令,在這裏使用–help查看,並且只學習重要的,其他的稍後會有提供
virt-install –help
-n(Name):指定虛擬機的名稱
–memory(–raw):指定內存大小
–cpu:指定cpu的核數(默認爲1)
–cdrom:指定鏡像
–disk:指定磁盤路徑(即上文創建的虛擬磁盤)
–virt-type:指定虛擬機類型(kvm,qemu,xen)
–network:指定網絡類型

執行創建虛擬機命令
[root@linux-node1 ~]#virt-install --name CentOS-7.1-x86_64 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.1-x86_64.iso --disk path=/opt/CentOS-7.1-x86_64.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
Starting install...
Domain installation still in progress. You can reconnect to
the console to complete the installation process.

[root@linux-node1 ~]#iptables -F

找任意電腦安裝Tightvnc view VNC客戶端。可以遠程監控安裝情況。
VNC 192.168.1.103:5900(第一臺使用5900,第二臺是5901,以此類推。。。)
KVM

安裝的時候選Press Tab for full configuration options on menu items.
KVM
在安裝啓動時加上參數:
net.ifnames=0 biosdevname=0

這樣安裝就會修改默認的網卡名稱爲eth0
KVM
設置分區:

KVM

虛擬機基本操作學習
生成kvm虛擬機:virt-install
查看在運行的虛擬機:virsh list
查看所有虛擬機:virsh list -all
查看kvm虛擬機配置文件:virsh dumpxml name
啓動kvm虛擬機:virsh start name
正常關機:virsh shutdown name
非正常關機(相當於物理機直接拔掉電源):virsh destroy name
刪除:virsh undefine name(徹底刪除,找不回來了,如果想找回來,需要備份/etc/libvirt/qemu的xml文件)
根據配置文件定義虛擬機:virsh define file-name.xml
掛起,終止:virsh suspend name
恢復掛起狀態:virsh resumed name

啓動剛纔創建的虛擬機
[root@linux-node1 ~]# virsh list --all
Id Name State

  • CentOS-7.1-x86_64 shut off
    [root@linux-node1 ~]# virsh start CentOS-7.1-x86_64
    Domain CentOS-7.1-x86_64 started
    [root@linux-node1 ~]# virsh list --all
    Id Name State

    3 CentOS-7.1-x86_64 running

在主機中查看剛創建的虛擬機的ip由來
[root@linux-node1 ~]# ps aux | grep dns
nobody 32622 0.0 0.0 15556 192 ? S 15:44 0:00 /usr/sbin/dnsm
asq --conf-file=/var/lib/libvirt/dnsmasq/default.conf
KVM
[root@linux-node1 ~]#cat /var/lib/libvirt/dnsmasq/default.conf
裏面有dhcp-range
dhcp-range=192.168.122.2,192.168.122.254

虛擬機中安裝 yum install net-tools

編輯kvm的xml文件,更改虛擬機CPU配置
配置虛擬機的cpu,兩種方式(啓動的時候指定核數,更改xml)
第一種方法:爲了實現cpu的熱添加,就需要更改cpu的最大值,當然熱添加的個數不能超過最大值
[root@linux]#virsh edit CentOS-7.1-x86_64
<vcpu placement='auto' current="1">4</vcpu> 當前爲1,自動擴容,最大爲4

重啓虛擬機
[root@linux-node1 ~]# virsh shutdown CentOS-7.1-x86_64
Domain CentOS-7.1-x86_64 is being shutdown
[root@linux-node1 ~]# virsh list --all
[root@linux-node1 ~]# virsh start CentOS-7.1-x86_64
Domain CentOS-7.1-x86_64 started
[root@linux-node1 ~]# virsh list --all

登錄虛擬機上,查看cpu信息,確認cpu的個數,下面開始進行cpu熱添加
cat /proc/cpuinfo (就1個CPU)

KVM
cpu的熱添加(cpu只支持熱添加,不支持熱減少)
[root@linux-node1 ~]# virsh setvcpus CentOS-7.1-x86_64 2 --live
再到虛擬機中查看cpu信息
cat /proc/cpuinfo (就2個CPU)
KVM

kvm版本較高,並不需要echo “1”到/sys/devices/system/cpu/cpu1/online 進行激活,本版本已經自動可以激活

虛擬機中查看cat /sys/devices/system/cpu/cpu1/online
1

第二種方法:安裝的時候指定
virt-install -vcpus 5 -vcpus 5,maxcpus=10,cpuset=1-4,6,8 -vcpus sockets=2,cores=4,thread=2

編輯kvm的xml文件,更改虛擬機內存配置
內存的設置擁有一個“氣球(balloon)機制”,可以增大減少,但是也要設置一個最大值,默認並沒有設置最大值,也可以在安裝的時候指定,這裏不再重複此方法
[root@linux-node1 ~]# virsh edit CentOS-7.1-x86_64
<memory unit='KiB'>4194304</memory> 把最大內存改爲4G
<currentMemory unit='KiB'>1048576</currentMemory> 當前內存爲1G

重啓虛擬機並查看當前狀態的內存使用情況
[root@linux-node1 ~]# virsh shutdown CentOS-7.1-x86_64
[root@linux-node1 ~]# virsh list --all
[root@linux-node1 ~]# virsh start CentOS-7.1-x86_64
[root@linux-node1 ~]# virsh list --all

[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info balloon
balloon: actual=4096

虛擬機裏查看內存
KVM

對內存進行熱添加並查看
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd balloon 2000
[root@linux-node1 ~]# virsh qemu-monitor-command CentOS-7.1-x86_64 --hmp --cmd info balloon
balloon: actual=2000

虛擬機裏查看內存

KVM

更改虛擬機中存儲,硬盤設置(不建議在生產環境使用硬盤的擴大收縮模式,很容易產生故障)
[root@linux-node1 ~]# qemu-img --help |grep -i "formats:" (查看支持硬盤的格式)
Supported formats: vvfat vpc vmdk vhdx vdi sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg cloop bochs blkverify blkdebug
kvm支持很多種硬盤格式
硬盤格式總體上分爲兩種:1爲全鏡像格式,2爲稀疏格式
全鏡像格式(典型代表raw格式),其特點:設置多大就是多大,寫入速度快,方便的轉換爲其他格式,性能最優,但是佔用空間大
稀疏模式(典型代表qcow2格式),其特點:支持壓縮,快照,鏡像,更小的存儲空間(即用多少佔多少)
硬盤格式都可以通過qemu-img管理,詳情qemu-img -help

編輯kvm的xml文件,更改虛擬機網橋連接配置
Kvm虛擬機網絡默認情況是NAT情況。
但是在生產情況,使用更多的是橋接模式,更改虛擬機爲網橋模式,原理圖如下,網橋的基本原理就是創建一個橋接接口br0,在物理網卡和虛擬網絡接口之間傳遞數據
KVM
修改eth0(這裏Centos7的eth0在裝機的時候就指定,不需要特意指定了)
添加一個網橋並查看
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.52540050ea92 yes virbr0-nic
vnet0

[root@linux-node1 ~]# brctl addbr br0

[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.52540050ea92 yes virbr0-nic
vnet0

把eth0加入網橋,使用橋接模式,給br設置ip,添加路由網關,關閉防火牆(192.168.1.103不是剛纔所創建的kvm虛擬機的ip地址)
[root@linux-node1 ~]# brctl addif br0 eth0 && ip addr del dev eth0 192.168.1.103/24 && ifconfig br0 192.168.1.103/24 up && route add default gw 192.168.1.1 && iptables -F

然後,編輯虛擬機的網絡配置使用br0網橋模式 (刪除紅色)
[root@linux-node1 ~]# virsh edit CentOS-7.1-x86_64
<interface type='network'>
<mac address='52:54:00:aa:bf:d9'/>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<interface type="bridge"> <!--虛擬機網絡連接方式-->
<source bridge="br0" /> <!-- 當前主機網橋的名稱-->
<mac address="52:54:00:aa:bf:d9" /> <!--爲虛擬機分配mac地址,務必唯一,如果是dhcp獲得同樣ip,引起衝突-->
</interface>

重啓虛擬機,網橋模式生效,此時使用ssh便可以鏈接到所創建的虛擬機了,在vmvare機器上使用ifconfig查看詳情(剛纔所創建的kvm的ip地址192.168.1.112)
KVM

掛起虛擬機
[root@linux-node1 ~]# virsh suspend xxx
[root@linux-node1 ~]# virsh list --all

恢復虛擬機
[root@linux-node1 ~]# virsh resume xxx
[root@linux-node1 ~]# virsh list --all

強制關閉虛擬機
[root@linux-node1 ~]#virsh destroy xxx

刪除虛擬機: 刪除關閉了的虛擬機
[root@linux-node1 ~]#virsh undefine xxx

KVM的優化(以下操作不是直接在kvm上,是在192.168.1.103上操作)
cpu的優化
intel的cpu的運行級別,按權限級別高低Ring3->Ring2->Ring1->Ring0,(Ring2和Ring1暫時沒什麼卵用)Ring3爲用戶態,Ring0爲內核態
KVM
Ring3的用戶態是沒有權限管理硬件的,需要切換到內核態Ring0,這樣的切換(系統調用)稱之爲上下文切換,物理機到虛擬機多次的上下文切換,勢必會導致性能出現問題。對於全虛擬化,inter實現了技術VT-x,在cpu硬件上實現了加速轉換,CentOS7默認是不需要開啓的。

cpu的緩存綁定cpu的優化
[root@linux]# lscpu|grep cache
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 8192K
L1 L2 L3 三級緩存和CPU綁定
L1是靜態緩存,造價高,L2,L3是動態緩存,通過脈衝的方式寫入0和1,造價較低。cache解決了cpu處理快,內存處理慢的問題,類似於memcaced和數據庫。如果cpu調度器把進程隨便調度到其他cpu上,而不是當前L1,L2,L3的緩存cpu上,緩存就不生效了,就會產生miss,爲了減少cache miss,需要把KVM進程綁定到固定的cpu上,可以使用taskset把某一個進程綁定(cpu親和力綁定,可以提高20%的性能)在某一個cpu上,例如:taskset -cp 1 25718(1指的是cpu1,也可以綁定到多個cpu上,25718是指的pid).
cpu綁定的優點:提高性能,20%以上
cpu綁定的缺點:不方便遷移,靈活性差

內存的優化
內存尋址:宿主機虛擬內存 -> 宿主機物理內存
虛擬機的虛擬內存 -> 虛擬機的物理內存
以前VMM通過採用影子列表解決內存轉換的問題,影子頁表是一種比較成熟的純軟件的內存虛擬化方式,但影子頁表固有的侷限性,影響了VMM的性能,例如,客戶機中有多個CPU,多個虛擬CPU之間同步頁面數據將導致影子頁表更新次數幅度增加,測試頁表將帶來異常嚴重的性能損失。如下圖爲影子頁表的原理圖
KVM
KVM
在此之際,Intel在最新的Core I7系列處理器上集成了EPT技術(對應AMD的爲RVI技術),以硬件輔助的方式完成客戶物理內存到機器物理內存的轉換,完成內存虛擬化,並以有效的方式彌補了影子頁表的缺陷,該技術默認是開啓的,如下圖爲EPT技術的原理
KVM
KSM內存合併
宿主機上默認會開啓ksmd進程,該進程作爲內核中的守護進程存在,它定期執行頁面掃描,識別副本頁面併合並副本,釋放這些頁面以供它用,CentOS7默認是開啓的
[root@localhost ~]# ps aux|grep ksmd|grep -v grep
root 27 0.0 0.0 0 0 ? SN 13:22 0:00 [ksmd]

大頁內存,CentOS7默認開啓的
[root@localhost ~]#cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
[root@localhost ~]#ps aux |grep khugepage|grep -v grep
root 27 0.0 0.0 0 0 ? SN 02:39 0:00 [khugepaged]

Linux平臺默認的內存頁面大小都是4K,HugePage進程會將默認的的每個內存頁面可以調整爲2M。

磁盤IO的優化
IO調度算法,也叫電梯算法,詳情請看http://www.unixhot.com/article/4
① Noop Scheduler:簡單的FIFO隊列,最簡單的調度算法,由於會產生讀IO的阻塞,一般使用在SSD硬盤,此時不需要調度,IO效果非常好
② Anticipatory IO Scheduler(as scheduler)適合大數據順序順序存儲的文件服務器,如ftp server和web server,不適合數據庫環境,DB服務器不要使用這種算法。
③ Deadline Schedler:按照截止時間的調度算法,爲了防止出現讀取被餓死的現象,按照截止時間進行調整,默認的是讀期限短於寫期限,就不會產生餓死的狀況,一般應用在數據庫
④ Complete Fair Queueing Schedule:完全公平的排隊的IO調度算法,保證每個進程相對特別公平的使用IO

查看本機Centos7默認所支持的調度算法
[root@localhost ~]# dmesg|grep -i "scheduler"
[ 0.662373] io scheduler noop registered
[ 0.662374] io scheduler deadline registered (default)
[ 0.662391] io scheduler cfq registered

臨時更改某個磁盤的IO調度算法,將deadling模式改爲cfq模式
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
[root@localhost ~]# echo cfq >/sys/block/sda/queue/scheduler
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]

使更改的IO調度算法永久生效,需要更改內核參數(elevator=deadline或者 elevator=noop等)
[root@localhost ~]#vi /boot/grub/menu.lst (新版centos可能在vi /boot/grub2/grub.cfg)
kernel /boot/vmlinuz-3.10.0-229.el7 ro root=LABEL=/ elevator=deadline rhgb quiet

cache的優化
關於write through和write back,默認write through即可
Write-back
在這種策略下,當數據被寫到raid卡的cache中,控制器就向IO調度器返回了寫操作完成信號; 雙刃劍,它雖然帶來了IO性能的提升,但是隨之而來的風險:因爲cache是ROM,假設服務器突然斷電,則cache中的數據可能丟失; 爲了解決這個問題,raid卡加加裝一塊鋰電池(BBU),即當服務器斷電時,能把cache中的數據刷到磁盤上;同樣的道理,BBU又成爲一個風險點,因爲鋰電池需要保證始終有足夠的電量來保證能將cache中的數據寫到磁盤上,raid卡會加入一個BBU的管理策略,learn cycle(充放電週期,一般有30/90天,讓電池充放電一次,持續約6小時),那麼這6小時又稱爲一個風險點;所以raid卡又會增加一個策略:No WB when bad bbu,即當BBU壞掉,或者BBU正在充放電時,禁用write-back,此時Write policy就會變成:write-through。
KVM
Write through
只有當數據被寫到物理磁盤中,控制器才向IO調度器返回了寫操作完成信號; 這種策略以犧牲IO性能,來保證數據安全性,淘寶這邊的策略:因爲Write-Through的io性能無法滿足業務的需求,所以我們這邊會採用另一個模式:WB when bad bbu,即不管bbu狀態是否正常,我們都會採用write-back,那數據安全怎麼辦?服務器異常斷電的情況,在我們這邊概率極低;即便很不幸的我們IDC局部斷電了,我們也有主備模式來保證數據的相對安全;我們會監控BBU的狀態,一旦發生了BBU failed,我們會將安排停機更換

創建虛擬機鏡像
虛擬磁盤及鏡像
由於在一開始創建了虛擬磁盤,並命名爲CentOS-7.1-x86_64.raw,這就是虛擬機的鏡像。
[root@localhost ~]# cd /opt/
[root@chuck opt]# ls
CentOS-7.1-x86_64.iso CentOS-7.1-x86_64.raw rh
鏡像製作原則
分區的時候,只分一個/根分區,並不需要swap分區,由於虛擬機的磁盤性能就不好,如果設置了swap分區,當swap工作的時候,性能會更差。例如阿里雲主機,就沒有交換分區。
鏡像製作需要刪除網卡(eth0)(/etc/sysconfig/network scripts/ifcfg-eth0)中的UUID和MAC項,如果有udev(/etc/udev/rules.d/70-persistent-ipoib.rules)的規則也要刪除
關閉selinux,關閉iptables
安裝基礎軟件的包:net-tools lrzsz screen tree vim wget

KVM管理平臺:
OpenStack
oVirt (小規模部署,推薦ovirt)管理端+客戶端組成。oVrit Engine(相當於vCenter) oVirt主機/節點(相當於ESXi)

https://www.ovirt.org/download/

[root@localhost opt]# yum localinstall http://resources.ovirt.org/pub/yum-repo/ovirt-release36.rpm
[root@localhost opt]# yum install -y ovirt-engine
安裝oVrit Engine
[root@localhost opt]# engine-setup (基本使用默認配置安裝)(沒說明的都選默認)
Configure VDSM on this host? (Yes, No) [No]: 默認
Firewall manager to configure (iptables): iptables
Use weak password? (Yes, No) [No]: yes
Local ISO domain ACL: *(rw)

安裝後,登陸 https://192.168.1.103
KVM
選 Administration Portal
KVM

安裝客戶端
[root@localhost opt]# yum localinstall http://resources.ovirt.org/pub/yum-repo/ovirt-release36.rpm
[root@localhost opt]# yum install -y ovirt-engine-setup-plugin-allinone

KVM

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