支持虛擬化的條件
intel的cpu:vmx
AMD的cpu:svm
本文使用的是vmware workstation,cpu要開啓以下兩個條件便可. 若是是物理機,須要在bios裏面設置,默認都是開啓狀態。 node
在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 xsaveoptlinux
安裝kvm
[root@linux-node1 ~]#yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install -yios
kvm: linux內核的一個模塊,模塊不須要安裝,只須要加載
qemu:虛擬化軟件,能夠虛擬不一樣的CPU,支持異構(x86的架構能夠虛擬化出不是x86架構的)
qemu-kvm:用戶態管理kvm,網卡,聲卡,PCI設備等都是qemu來管理的web
建立一個虛擬磁盤,-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.servicevim
啓動libvirt,查看狀態,關鍵字:activecentos
開始裝一臺虛擬機
在vmware上掛載一個鏡像api
導入到宿主機中,固然時間可能較長
[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,以此類推。。。)
安裝的時候選Press Tab for full configuration options on menu items.
在安裝啓動時加上參數:
net.ifnames=0 biosdevname=0
這樣安裝就會修改默認的網卡名稱爲eth0
設置分區:
虛擬機基本操做學習
生成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
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
[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)
cpu的熱添加(cpu只支持熱添加,不支持熱減小)
[root@linux-node1 ~]# virsh setvcpus CentOS-7.1-x86_64 2 --live
再到虛擬機中查看cpu信息
cat /proc/cpuinfo (就2個CPU)
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
虛擬機裏查看內存
對內存進行熱添加並查看
[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
虛擬機裏查看內存
更改虛擬機中存儲,硬盤設置(不建議在生產環境使用硬盤的擴大收縮模式,很容易產生故障)
[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,在物理網卡和虛擬網絡接口之間傳遞數據
修改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)
掛起虛擬機
[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爲內核態
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之間同步頁面數據將致使影子頁表更新次數幅度增長,測試頁表將帶來異常嚴重的性能損失。以下圖爲影子頁表的原理圖
在此之際,Intel在最新的Core I7系列處理器上集成了EPT技術(對應AMD的爲RVI技術),以硬件輔助的方式完成客戶物理內存到機器物理內存的轉換,完成內存虛擬化,並以有效的方式彌補了影子頁表的缺陷,該技術默認是開啓的,以下圖爲EPT技術的原理
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。
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
選 Administration Portal
安裝客戶端
[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