雲端計算與虛擬化之KVM入門最佳實踐
1.1雲端計算概述
雲計算是一種按使用量付費的模式,這種模式提供可用的、便捷的、按需的網路訪問,進入可配置的計算資源共享池(資源包括網路,服務器,存儲,應用程式,服務),這些資源能夠被快速提供,只需投入很少的管理工作,或與服務供應商進行很少的互動。
在雲端計算之前的模式和技術
1、IDC託管
2、IDC租用
3、虛擬主機(賣空間)
4、VPS:虛擬專用主機 openvz(通過超賣技術坑人) xen(不支援超賣)
相對雲端計算,傳統資料中心面臨的問題
1、資源利用率低
2、資源分配不合理
3、難以實現真正的自動化運維
雲端計算特點和優勢
1、雲計算是一種使用模式,不是一種技術。(通過網路、彈性擴充套件、按需付費)
2、雲端計算使用方法必須通過網路來訪問。
3、雲端計算的優勢是彈性計算(按需付費)。
1.1.1雲端計算的特點
1、資源池化
2、無處不在的網路訪問
3、隨需應變的自助服務
4、可測量的服務
5、快速的伸縮
雲端計算五大特點,如圖1-1
圖1-1
1.1.2雲端計算服務模型
雲端計算服務模型如圖1-2
圖1-2
IaaS 基礎設施即服務
消費者通過Internet 可以從完善的計算機基礎設施獲得服務。這類服務稱為基礎設施即服務。基於 Internet 的服務(如儲存和資料庫)是 IaaS的一部分。Internet上其他型別的服務包括平臺即服務和軟體即服務。
PaaS 平臺即服務
把伺服器平臺作為一種服務提供的商業模式。而云計算時代相應的伺服器平臺或者開發環境作為服務進行提供就成為了
SaaS 軟體即服務
它是一種通過Internet提供軟體的模式,廠商將應用軟體統一部署在自己的伺服器上,客戶可以根據自己實際需求,通過網際網路向廠商定購所需的應用軟體服務,按定購的服務多少和時間長短向廠商支付費用,並通過網際網路獲得廠商提供的服務。使用者不用再購買軟體,而改用向提供商租用基於Web的軟體,來管理企業經營活動,且無需對軟體進行維護,服務提供商會全權管理和維護軟體,軟體廠商在向客戶提供網際網路應用的同時,也提供軟體的離線操作和本地資料儲存,讓使用者隨時隨地都可以使用其定購的軟體和服務。對於許多小型企業來說,
1.1.3雲端計算部署模型
公有云(Public Cloud)
公有云通常指第三方提供商為使用者提供的能夠使用的雲,公有云一般可通過internet使用,可能是免費或成本低廉,公有云的核心屬性是共享資源服務。這種雲有許多例項,可在當今整個開放的共有網路中提供服務。例如:阿里雲、騰訊雲、×××、百度雲、盛大雲、迅達雲、等等。
私有云(Private Clouds)
私有云是為一個客戶單獨使用而構建的,因而提供對資料、安全性和服務質量的最有效控制。該公司擁有基礎設施,並可以控制在此基礎設施上部署應用程式的方式。私有云可部署在企業資料中心防火牆內,也可以將它們部署在一個安全的主句託管場所,私有云的核心屬性是專有資源。
混合雲(Hybrid Cloud)
混合雲融合了公有云和私有云,是近年來雲端計算的主要模式和發展方向。我們已經知道私企業主要是面向企業使用者,處於安全考慮,企業更願意將資料存放在私有云中,但是同時又希望可以獲得公有云的計算資源,在這種情況下混合雲被越來越多的採用,它將公有云和私有云進行混合匹配,以獲得最佳的效果,這種個性的解決方案,達到二既省錢又安全的目的。
社群雲(Community Cloud)
社群雲是大的公有云範疇內的一個組成部分。是指在一定的地域範圍內,由雲端計算服務提供商統一提供計算資源、網路資源、軟體和服務能力所形成的雲端計算形式。即基於社群的網路互連優勢和技術易於整合特點,通過區域內各種計算能力進行統一服務形式的整合,結合社群內的使用者需求共性,實現面向區域使用者需求的雲端計算服務模式。例如:區域型和行業型。資源的高效共享。
1.2虛擬化概述
虛擬化,一種具體的技術,用來將物理機虛擬成為多個相互獨立的虛擬機器。在一臺計算機上同時執行多個邏輯計算機,每個邏輯計算機可執行不同的操作系統,並且應用程式都可以在相互獨立的空間內執行而互不影響,可以實現IT資源的動態分配、靈活排程、跨域共享,提高IT資源利用率,使IT資源能夠真正成為社會基礎設施,服務於各行各業中靈活多變的應用需求。從而顯著提高計算機的工作效率。
1.2.1虛擬化的分類
全虛擬化
半虛擬化
平臺虛擬化
軟體虛擬化
硬體虛擬化(Inter vt-x/EPT) (AMD AMD-v /RVI)
桌面虛擬化
應用虛擬化
以上各種虛擬化技術,百度百科都能查閱到相關資料。
1.2.2虛擬化的優勢
1)虛擬化可以虛擬出來多個作業系統,它們之間是相互獨立的,所以每個作業系統上所跑的應用程式是相互不影響的。
2)支援異構,linux系統可以虛擬化windows系統,方便不同場景系統的使用。
3)支援快照、克隆、還原等功能。
企業案例一
公司虛擬機器你也不知道能不能停,也不知道跑什麼了,然後問產品經理他也不知道,有可能有用你放著把。如果這是一臺物理機你看怎麼辦,真的很無奈、想改個啥你都不敢該,只能讓他跑在那裡。
企業案例二
公司這臺物理機有沒有用,所有人告訴你,沒事刪把肯定沒有用,然後到店慶的時候,產品經理過來了:我們去年店慶做了一個積分抽獎的活動,我花錢買的,我的程式碼哪去了,我的伺服器呢?伺服器早都格式化多少遍了,產品經理說那沒辦法,那麼趕緊聯絡提供商把,提供商倒閉了。怎麼辦,重新做唄。
如果有虛擬機器就好辦了,我把虛擬機器關了放在那,只要不刪除,是不是永遠都在,哪天用在起來就行了。無非就佔點硬碟,分配的時候,可以使用多少分配多少。
1.2.3虛擬化與雲端計算總結
雲端計算不等於虛擬化,兩者並不能相互比較。
雲端計算是一種資源和使用互動的方式。
虛擬化是一種具體的技術。
雲端計算要依賴虛擬化技術來實現的一種通過網路訪問獲取資源,流量,交付的使用模式。(例如:彈性計算)。
虛擬化相當於實幹家,而云計算是思想家。
虛擬化企業安裝實戰
KVM:核心級虛擬化技術(Kernel-based Virtual Machine)
結構簡單,包含兩個部分:
1)裝置驅動/dev/kvm, 針對模擬PC硬體的使用者空間元件
2) KVM需要CPU中虛擬化功能的支援,只可在具有虛擬化支援的CPU上執行,即具有VT功能的interCPU和具有ADM-V功能的AMD CPU
1.3.1KVM虛擬化特性
嵌入到Linux正式Kernel(提高相容性)
程式碼級資源呼叫(提高效能)
虛擬機器就是一個程序(記憶體易於管理)
直接支援NUMA技術(提高擴充套件性)
------RedHat收購KVM---------
保持開源發展模式
更好的商業支援及服務保障
安裝必備條件
實驗必備條件,必須開啟虛擬機器VT-EPT技術,在vmware虛擬機器選擇上即可。伺服器上預設是開啟狀態。
[[email protected]~]# egrep '(vmx|svm)' /proc/cpuinfo #如果過濾沒有代表不支援虛擬化
flags:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflushdts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmonpebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pnipclmulqdq vmx ssse3 fma cx16 pcid sse4_1sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrandhypervisor lahf_lm abm 3dnowprefetch ida arat epb xsaveopt pln pts dthermtpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseedadx smap
1.3.2安裝KVM虛擬機器
[[email protected]~]# cat /etc/redhat-release #檢視作業系統版本
CentOSLinux release 7.1.1503 (Core)
[[email protected]~]# yum install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install –y #安裝KVM
kvm:linux核心的一個模組,模組不需要安裝只需要載入,通過使用者態程式來管理即可。
qeum:虛擬化軟體,可以虛擬不同的CPU,支援異構(x86的架構可以虛擬化不是x86架構的)
qeum-kvm:使用者態管理kvm,網絡卡、音效卡、PCI裝置等都是需要qemu來管理。
[[email protected]~]# lsmod|grep kvm #檢視kvm核心是否被載入
kvm_intel 148081 0
kvm 461126 1 kvm_intel
[[email protected]~]# systemctl enable libvirtd.service #libvirtd加入開機啟動
[[email protected]~]# systemctl start libvirtd.service #啟動libvirtd
1.3.3建立一臺KVM虛擬機器
首先學習下virsh-install建立虛擬機器命令
--virt-type:指定虛擬機器型別(kvm、qemu、xen)
--name:指定虛擬機器的名稱
--raw:指定記憶體大小
--cpu:指定cpu的核數(預設為1)
--cdrom:指定映象
--disk:指定磁碟路徑(即上文建立的虛擬磁碟)
--network:指定網路類
[[email protected]~]# qemu-img create -f raw /opt/CentOS-7.1-x86_64.raw 10G #建立虛擬磁碟,-f指定格式,路徑/opt/CentOS-7.1-x86_64.raw,大小10G
[[email protected]~]# dd if=/dev/cdrom of=/opt/CentOS-7.1.iso#掛在映象,匯入至虛擬機器
[[email protected]~]# virt-install --name CentOS-7-x86_64 --virt-type kvm --ram 1024--cdrom=/opt/CentOS-7.1.iso --disk path=/opt/CentOS-7.1-x86_64.raw --networknetwork=default --graphics vnc,listen=0.0.0.0--noautoconsole #建立一臺KVM虛擬機器
Startinginstall...
Creatingdomain...| 0 B 00:03
Domaininstallation still in progress. You can reconnect to
theconsole to complete the installation process.
1.3.4VNC連線KVM虛擬機器
開啟一個VNC客戶端,輸入192.168.56.111:5900(第一個預設5900,第二個5901,以此類推)連線虛擬機器裡面建立的KVM虛擬機器,安裝CentOS7的過程,此處不在演示如何安裝。
安裝CentOS7,在啟動前修改核心讓網絡卡為eth0,如圖1-2
圖1-2
1.4KVM日常管理
[[email protected]]# virsh start CentOS-7-x86_64 #啟動剛才建立的CentOS7KVM虛擬機器
DomainCentOS-7-x86_64 started
[[email protected]]# virsh list #檢視KVM虛擬機器是否啟動
Id Name State
----------------------------------------------------
3CentOS-7-x86_64running
1.4.1CPU擴容
[[email protected]]# virsh edit CentOS-7-x86_64 #為了實現CPU的熱新增,就需要更改Cpu的最大值,當然熱新增值不能超過最大值
<vcpuplacement='auto' current="1">4</vcpu> #當前為1,自動擴容最大為4
[[email protected]]# virsh shutdown CentOS-7-x86_64 #關閉KVM虛擬機器
DomainCentOS-7-x86_64 is being shutdown
[[email protected]]# virsh start CentOS-7-x86_64 #啟動KVM虛擬機器
DomainCentOS-7-x86_64 started
[[email protected]]# virsh setvcpus CentOS-7-x86_64 2 --live #熱修改為2個cpu(不知減少),高版本自動啟用
[[email protected]]#grep processor /proc/cpuinfo |wc -l #通過vnc登入KVM虛擬機器檢視是否擴容成功
2
在建立虛擬機器時指定cpu
[[email protected]~]# virt-install --help|grep vcpus
--vcpus VCPUS 為虛擬機器配置的 vcpus 數。例如:
--vcpus 5
--vcpus5,maxcpus=10,cpuset=1-4,6,8
--vcpussockets=2,cores=4,threads=2,
1.4.2記憶體擴容
記憶體的設定擁有一個氣球(balloon)機制,可以增大減少,但是也要設定一個最大值,預設並沒有最大值,也可以在安裝時指定。
[[email protected]]# virsh edit CentOS-7-x86_64 #為了實現CPU的熱新增,就需要更改Cpu的最大值,當然熱新增值不能超過最大值
<memoryunit='KiB'>4194304</memory> #修改最大支援記憶體擴容為4G
<currentMemoryunit='KiB'>1048576</currentMemory> #當前KVM虛擬機器記憶體為1G
重啟虛擬機器
[[email protected]]# virsh shutdown CentOS-7-x86_64 #關閉KVM虛擬機器
DomainCentOS-7-x86_64 is being shutdown
[[email protected]]# virsh start CentOS-7-x86_64 #啟動KVM虛擬機器
DomainCentOS-7-x86_64 started
[[email protected]~]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd info balloon #檢視當前KVM記憶體大小
balloon:actual=1024
[[email protected]~]# virshqemu-monitor-commandCentOS-7.1-x86_64--hmp--cmdballoon#熱新增
unexpectedendofexpression
[[email protected]~]# virshqemu-monitor-commandCentOS-7.1-x86_64--hmp--cmdinfoballoon #在次檢視
balloon:actual=2001
1.4.3硬碟管理
更改虛擬機器中儲存,硬碟設定(不建議生產環境使用硬碟的擴大收縮模式,很容易產生故障)
[[email protected]~]# qemu-img --help |grep -i "formats:"
Supportedformats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppyhost_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftphttps http cloop bochs blkverify blkdebug
硬碟格式都可以通過qeum-img管理,具體qemu-img --help
全映象格式(代表raw):設定多大就是多大,寫入速度快,方便的轉換為其他格式,效能最優,但是佔用空間大。
稀疏格式(代表qcow2):支援壓縮,快照,映象,更小的儲存空間(即用多少佔多少)
1.4.4網路管理
預設情況KVM的網路是NAT模式,但是在生產情況,用的多的都是網橋模式。
修改eth0(這裡CentOS7的eth0在裝機時就指定了,那如果沒指定怎麼辦? http://www.xuliangwei.com/xubusi/102.html)
[[email protected]~]# brctl addbr br0 #新增一個網絡卡
[[email protected]~]# brctl show #檢視網絡卡資訊
bridgename bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.5254009f0311 yes virbr0-nic
[[email protected]~]# brctl addif br0 eth0 && ip addr del dev eth0 192.168.56.111/24&&ifconfig br0 192.168.56.111/24 up && route add default gw192.168.56.2 && iptables -F #把eth0加入網橋,使用橋接模式,給br設定ip,新增路由閘道器,關閉防火牆
[[email protected]~]# ifconfig br0 #檢視網橋的IP
br0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.56.111 netmask 255.255.255.0 broadcast 192.168.56.255
inet6 fe80::20c:29ff:fe5d:cc27 prefixlen 64scopeid 0x20<link>
ether 00:0c:29:5d:cc:27 txqueuelen 0(Ethernet)
RX packets 4813 bytes 472527 (461.4 KiB)
RX errors 0 dropped 0overruns 0 frame 0
TX packets 2705 bytes 510369 (498.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0collisions 0
[[email protected]~]# virsh edit CentOS-7-x86_64 #編輯虛擬機器的網路配置使用br0網橋模式
<interface type='bridge'> #虛擬機器網路連線方式
<mac address='52:54:00:22:04:0f'/> #為虛擬機器分配MAC地址,務必唯一,如果是dhcp獲得同樣IP會引起衝突
<source bridge='br0'/> #當前主機網橋名稱
重啟虛擬機器
[[email protected]]# virsh shutdown CentOS-7-x86_64 #關閉KVM虛擬機器
DomainCentOS-7-x86_64 is being shutdown
[[email protected]]# virsh start CentOS-7-x86_64 #啟動KVM虛擬機器
DomainCentOS-7-x86_64 started
#然後配置靜態IP地址,重啟網絡卡,即可以通過xshell連線上KVM虛擬機器了。
1.5KVM常用管理
[[email protected]~]# virt-install #建立kvm虛擬機器
[[email protected]~]# virsh list #檢視正在執行的KVM虛擬機器
[[email protected]~]# virsh list --all #檢視所有KVM虛擬機器
[[email protected]~]# virsh start name #啟動KVM虛擬機器
[[email protected]~]# virsh shutdown name #正常關閉KVM虛擬機器
[[email protected]~]# virsh destroy name #強制關閉KVM虛擬機器(類似於直接斷電)
[[email protected]~]# virsh suspend name #掛起KVM虛擬機器
[[email protected]~]# virsh resume name #恢復掛起的KVM虛擬機器
[[email protected]~]# virsh dumpxml name #檢視KVM虛擬機器配置檔案
[[email protected]~]# virsh edit name #編輯KVM虛擬機器的xml配置檔案
[[email protected]~]# virsh undefine name #徹底刪除KVM虛擬機器,不可逆,如果想找回來,需要備份/etc/libvirt/qemu的xml檔案)
1.6KVM效能優化
1.6.1CPU優化
inter的cpu的執行級別,按許可權級別高低Ring3->Ring1->Ring0(Ring2和Ring1暫時用不上)Ring3為使用者態,Ring0為核心態
Ring3的使用者態是沒有許可權管理硬體的,需要切換到核心態Ring0,這樣的切換(系統呼叫)稱為上下文切換,物理機到虛擬機器多次的上下文切換,勢必會導致效能出現問題。對於全虛擬化,inter實現了技術VT-x,在CPU硬體上實現了加速轉換,CentOS7預設是不需要開啟的。
CPU快取繫結
[[email protected]~]# lscpu|grep cache #centos7自帶檢視cpu資訊命令
L1dcache: 32K
L1icache: 32K
L2cache: 256K
L3cache: 3072K
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 125718(1指的是cpu1,也可以繫結到多個cpu上,25718是指的pid).
cpu繫結的優點:提高效能,20%以上
cpu繫結的缺點:不方便遷移,靈活性差
1.6.2記憶體優化
宿主機虛擬記憶體-> 宿主機實體記憶體
虛擬機器的虛擬記憶體 -> 虛擬機器的實體記憶體
VMM通過採用影子列表解決記憶體轉換的問題,影子頁表是一種比較成熟的純軟體的記憶體虛擬化方式,但影子頁表固有的侷限性,影響了VMM的效能,例如,客戶機中有多個CPU,多個虛擬CPU之間同步頁面資料將導致影子頁表更新次數幅度增加,測試頁表將帶來異常嚴重的效能損失。如下圖1-1為影子頁表的原理圖
圖1-1
在此之際,Inter在最新的Core I7系列處理器上集成了EPT技術(對應AMD的為RVI技術),以硬體輔助的方式完成客戶實體記憶體到機器實體記憶體的轉換,完成記憶體虛擬化,並以有效的方式彌補了影子頁表的缺陷,該技術預設是開啟的,如下圖1-2為EPT技術的原理。
圖1-2
KSM記憶體合併
宿主機上預設會開啟ksmd程序,該程序作為核心中的守護程序存在,它定期執行頁面掃描,識別副本頁面併合並副本,釋放這些頁面以供它用,CentOS7預設是開啟狀態
[[email protected]~]# ps aux|grep ksmd|grep -v grep
root 2800.0 0.0 00 ? SN 04:220:00 [ksmd]
大頁記憶體,CentOS7預設開啟的
[[email protected]~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always]madvise never
[[email protected]~]# ps aux|grep hugepage|grep -v grep
root 2810.0 0.0 00 ? SN 04:220:03 [khugepaged]
Linux預設的記憶體頁面大小都是4K,HugePage程序會將預設的每個記憶體頁面可以調整為2M
1.6.3磁碟IO優化
IO排程演算法,也叫電梯演算法,詳情請看趙班長部落格:http://www.unixhot.com/article/4
1、Noop Scheduler:簡單的FIFO佇列,最簡單的排程演算法,由於會產生讀IO的阻塞,一般使用在SSD硬碟,此時不需要排程,IO效果非常好
2、Anticipatory IO Scheduler(asscheduler)適合大資料順序順序儲存的檔案伺服器,如ftp server和web server,不適合資料庫環境,DB伺服器不要使用這種演算法。
3、Deadline Schedler:按照截止時間的排程演算法,為了防止出現讀取被餓死的現象,按照截止時間進行調整,預設的是讀期限短於寫期限,就不會產生餓死的狀況,一般應用在資料庫
4、Complete Fair Queueing Schedule:完全公平的排隊的IO排程演算法,保證每個程序相對特別公平的使用IO
[[email protected]~]# dmesg|grep -i "scheduler" #檢視本機Centos7預設所支援的排程演算法
[ 1.332147] io scheduler noop registered
[ 1.332151] io scheduler deadline registered(default)
[ 1.332190] io scheduler cfq registered
臨時更改某個磁碟的IO排程演算法,將deadling模式改為cfq模式
[[email protected]~]# cat /sys/block/sda/queue/scheduler
noop[deadline] cfq
[[email protected]~]# echo cfq >/sys/block/sda/queue/scheduler
[[email protected]~]# cat /sys/block/sda/queue/scheduler
noopdeadline [cfq]
[[email protected]~]# vim /boot/grub/menu.lst #使更改的IO排程演算法永久生效,需要更改核心引數
kernel/boot/vmlinuz-3.10.0-229.el7 ro root=LABEL=/ elevator=deadline rhgb quiet
1.7虛擬化映象製作
1.在開始建立過虛擬磁碟,並命名為CentOS-7.1-x86_64.raw,這個是虛擬機器映象。
[[email protected]~]# ll /opt/
total5203344
-rw-r--r-- 1 qemu qemu4310695936 12月 28 04:46CentOS-7.1.iso
-rw-r--r--.1 qemu qemu 10737418240 12月 28 08:55CentOS-7.1-x86_64.raw
2. 分割槽的時候,只分一個/分割槽(不需要swap分割槽)。
3. 刪除網卡里面{UUID,MAC}
4. 如果有/etc/udev/rules.d/70-persistent-ipoib.rules 則刪除。
5. iptables關閉、selinux關閉
6.安裝基礎軟體包。(net-tools lrzsz screen tree vim wget)
轉載於:https://blog.51cto.com/liangweilinux/1729162