二:虛擬化之KVM(下)
閱讀(636)
一:虛擬機磁盤的格式:
1.1:根據存儲數據方式的不同可以分爲兩種格式,一種是稀疏模式。一種是全鏡像模式,全鏡像模式無法做快照,IO層面是有qemu模擬的,CPU和內存是有KVM實現的,以下是KVM的功能:
KVM 所支持的功能包括:支持CPU 和 memory 超分(Overcommit)支持半虛擬化I/O (virtio)支持熱插拔 (cpu,塊設備、網絡設備等)支持對稱多處理(Symmetric Multi-Processing,縮寫爲 SMP )支持實時遷移(Live Migration)支持 PCI 設備直接分配和 單根I/O 虛擬化 (SR-IOV)支持 內核同頁合併 (KSM )支持 NUMA (Non-Uniform Memory Access,非一致存儲訪問結構 )
1.2:KVM工具集合:
libvirt:操作和管理KVM虛機的虛擬化 API,使用 C 語言編寫,可以由 Python,Ruby, Perl, PHP, Java 等語言調用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。Virsh:基於 libvirt 的 命令行工具 (CLI)Virt-Manager:基於 libvirt 的 GUI 工具virt-v2v:虛機格式遷移工具virt-* 工具:包括 Virt-install (創建KVM虛機的命令行工具), Virt-viewer (連接到虛機屏幕的工具),Virt-clone(虛機克隆工具),virt-top 等sVirt:安全工具
1.3:磁盤格式:
1.3.1:raw:指定多大就創建多大,直接佔用指定大小的空間:
老牌的格式了,用一個字來說就是裸,也就是赤裸裸,你隨便dd一個file就模擬了一個raw格式的鏡像。由於裸的徹底,性能上來說的話還是不錯的。目前來看,KVM和XEN默認的格式好像還是這個格式。因爲其原始,有很多原生的特性,例如直接掛載也是一件簡單的事情。裸的好處還有就是簡單,支持轉換成其它格式的虛擬機鏡像對裸露的它來說還是很簡單的(如果
其它格式需要轉換,有時候還是需要它做爲中間格式),空間使用來看,這個很像磁盤,使用多少就是多少(du -h看到的大小就是使用大小),但如果你要把整塊磁盤都拿走的話得全盤拿了(copy鏡像的時候),會比較消耗網絡帶寬和I/O。接下來還有個有趣的問題,如果那天你的硬盤
用着用着不夠用了,你咋辦,在買一塊盤。但raw格式的就比較犀利了,可以在原來的盤上追加空間:
dd if=/dev/zero of=zeros.raw bs=1024k count=4096(先創建4G的空間)
cat foresight.img zeros.raw > new-foresight.img(追加到原有的鏡像之後)
當然,好東西是吹出來的,誰用誰知道,還是有挺多問題的。由於原生的裸格式,不支持snapshot也是很正常的。傳說有朋友用版本管理軟件對raw格式的文件做版本管理從而達到snapshot的能力,估計可行,但沒試過,這裏也不妄加評論。但如果你使用LVM的裸設
備,那就另當別論。說到LVM還是十分的犀利的,當年用LVM做虛擬機的鏡像,那性能槓槓的。而且現在好多兄弟用虛擬化都採用LVM來做的。在LVM上做了很多的優化,國外聽說也有朋友在LVM增量備份方面做了很多的工作。目前來LVM的snapshot、性能、可擴展性方面都還是有相當的
效果的。目前來看的話,備份的話也問題不大。就是在虛擬機遷移方面還是有很大的限制。但目前虛擬化的現狀來看,真正需要熱遷移的情況目前需求還不是是否的強烈。雖然使用LVM做虛擬機鏡像的相關公開資料比較少,但目前來看犧牲一點靈活性,換取性能和便於管理還是不錯的選擇。對於LVM相關的特性及使用可以參考如下鏈接:
http://www.ibm.com/developerworks/linux/library/l-lvm2/index.html
1.3.2:cow:
曾經qemu的寫時拷貝的鏡像格式,目前由於歷史遺留原因不支持窗口模式。從某種意義上來說是個棄嬰,還沒得它成熟就死在腹中,後來被qcow格式所取代。
1.3.3:qcow:
一代的qemu的cow格式,剛剛出現的時候有比較好的特性,但其性能和raw格式對比還是有很大的差距,目前已經被新版本的qcow2取代。其性能可以查看如下鏈接:
http://www.linux-kvm.org/page/Qcow2
1.3.4:qcow2,是openstack默認也是比較推薦的格式,將差異保存在一個文件,文件比較小而且做快照也比較小,空間是動態增長的:
現在比較主流的一種虛擬化鏡像格式,經過一代的優化,目前qcow2的性能上接近raw裸格式的性能,這個也算是redhat的官方渠道了,對於qcow2的格式,幾點還是比較突出的,qcow2的snapshot,可以在鏡像上做N多個快照:更小的存儲空間,即使是不支持holes的文件系統也可以(這下du -h和ls -lh看到的就一樣了),支持多個snapshot,對歷史snapshot進行管理,支持zlib的磁盤壓縮,支持AES的加密
1.3.5:vmdk
VMware的格式,這個格式說的蛋疼一點就有點牛X,原本VMware就是做虛擬化起家,自己做了一個集羣的VMDK的pool,做了自己的虛擬機鏡像格式。又拉着一些公司搞了一個OVF的統一封包。從性能和功能上來說,vmdk應該算最出色的,由於vmdk結合了VMware的很多能力,目前來看,KVM和XEN使用這種格式的情況不是太多。但就VMware的Esxi來看,它的穩定性和各方面的能力還是可圈可點。
1.3.6:vdi
VirtualBox 1.1 compatible p_w_picpath format, for exchanging p_w_picpaths with VirtualBox.SUN收購了VirtualBox,Oracle又收購了SUN,這麼說呢,vdi也算虛擬化這方面的一朵奇葩,可惜的是入主的兩家公司。SUN太專注於技術(可以說是IT技術最前端也不爲過),Oracle又是開源殺手(mysql的沒落)。單純從能力上來說vdi在VirtualBox上的表現還是不錯的。也是不錯的workstation級別的產品。
1.4:磁盤格式的轉換:
1.4.1:raw轉換爲qcow2:
此步驟使用qemu-img工具實現,如果機器上沒有,可以通過rpm或yum進行安裝,包名爲qemu-img。 qemu-img是專門虛擬磁盤映像文件的qemu命令行工具。 具體命令如下: qemu-img convert -f raw centos.img -O qcow2 centos.qcow2 參數說明:convert 將磁盤文件轉換爲指定格式的文件 -f 指定需要轉換文件的文件格式 -O 指定要轉換的目標格式 轉換完成後,將新生產一個目標映像文件,原文件仍保存。
1.4.2:qcow2轉換爲raw:
# qemu-img convert -O qcow2 my.raw myqow.qcow
1.4.3:VMDK轉換爲qcow2:
# qemu-img convert -f vmdk -O qcow2 xxx.vmdk xxx.img
http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/index.html
1.5:raw實際空間的大小:
[root@linux-node1 opt]# qemu-img convert -O qcow2 CentOS-7-x86_64.raw myqcow.qcow[root@linux-node1 opt]# ll -h總用量 7.4G-rw-r--r-- 1 qemu qemu 4.1G 9月 3 13:23 CentOS-7-x86_64-DVD-1511.iso-rw-r--r-- 1 root root 10G 9月 10 11:09 CentOS-7_x86_64.raw-rw-r--r-- 1 qemu qemu 10G 9月 22 21:16 CentOS-7-x86_64.raw #raw格式直接佔用實際分配的空間大小-rw-r--r-- 1 root root 1.1G 9月 22 21:17 myqcow.qcow #轉化怒爲qcow2格式之後在佔用的是實際空間大小
1.6:查看磁盤詳細信息:
[root@linux-node1 opt]# qemu-img info CentOS-7-x86_64.raw #查看raw格式的磁盤信息p_w_picpath: CentOS-7-x86_64.raw file format: raw virtual size: 10G (10737418240 bytes)disk size: 1.1G[root@linux-node1 opt]# qemu-img info myqcow.qcow #查看qcow格式的磁盤信息p_w_picpath: myqcow.qcow file format: qcow2 virtual size: 10G (10737418240 bytes)disk size: 1.1Gcluster_size: 65536Format specific information: compat: 1.1 lazy refcounts: false
二:關於網絡:
2.1:默認是使用的nat網絡,會稱爲虛擬機的瓶頸,因此需要創建一個橋接網卡並把虛擬機橋接至網卡,然後將虛擬機橋接一下即可使用物理網絡:
2.1.1:通過命令創建橋接網卡:
[root@linux-node1 opt]# brctl addbr br0
[root@linux-node1 opt]# brctl addif br0 eth0 #會斷網,這是將br0和eth0進行關聯
ip addr del dev eth0 192.168.56.11/24 #刪除網卡的IP地址信息
ifconfig br0 192.168.56.11/24 up #爲br0配置IP並啓動網卡,此時可以遠程連接
[root@linux-node1 ~]# route add default gw 192.168.56.2
[root@linux-node1 ~]# ping www.baidu.com
PING www.a.shifen.com (112.80.248.73) 56(84) bytes of data.
64 bytes from 112.80.248.73: icmp_seq=1 ttl=128 time=70.0 ms
64 bytes from 112.80.248.73: icmp_seq=2 ttl=128 time=74.7 ms
2.1.2:通過配置文件文件創建橋接網卡:
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-eth0 ifcfg-br0
# vim ifcfg-eth0 #去掉eth0網卡配置文件中的UUID/MAC/IP等信息BOOTPROTO=static DEVICE=eth0 ONBOOT=yes BRIDGE=br0 #添加一個橋接到br0的配置NM_CONTROLLED=no
br0的配置信息如下:
# vim ifcfg-br0 #裏面也不要有UUID和MAC等信息,IP地址配置成eth0使用的地址即可,當然也可以是其他可以使用的IPTYPE=Bridge #類型爲橋接BOOTPROTO=static DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=br0 #網卡名稱DEVICE=br0 #設備名稱ONBOOT=yes IPADDR=192.168.10.128NETMASK=255.255.255.0GATEWAY=192.168.10.2DNS1=192.168.10.2
#最後重啓服務器,驗證重啓服務器之後br0網卡生效,然後在服務器上創建的虛擬機就可以通過橋接網卡的方式使用和物理機同網段的IP地址連接外網了:
2.2:修改虛擬機配置文件:
[root@linux-node1 ~]# virsh edit CentOS-7-x86_64
<interface type='bridge'> #類型改爲bridge <mac address='52:54:00:60:84:d0'/> <source bridge='br0'/> #注意是bridgr='br0' <model type='virtio'/> #類型爲通過virtio實現的 <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
2.3:重啓虛擬機:
[root@linux-node1 ~]# virsh shutdown CentOS-7-x86_64域 CentOS-7-x86_64 被關閉[root@linux-node1 ~]# virsh start CentOS-7-x86_64域 CentOS-7-x86_64 已開始
2.3:編輯虛擬機網卡,配置IP和網關:
2.4:將上一步保存退出後重啓網絡訪問並測試連接及確認可以通過外網安裝服務:
三:宿主機的優化:
全虛擬化和半虛擬化,內核態Ring 0可以直接訪問周邊的硬件設備,CPU、內存、網卡和硬盤等,應用運行在Ring 3是用戶態,用戶態不能直接操作硬件,如果要操作硬件會產生系統調用,客戶端的操作系統不能工作在Ring 0,因此Intel 提供vt-x提供加速上下文切換,KVM在系統裏面是一個qemu進程,進程要受到CPU的調度,在多核CPU進程可能會被調度到任意CPU核心,CPU的一級緩存是使用靜態內存做的,二級緩存是使用高速的動態內存,緩存是將經常訪問的數據緩存下來以加速訪問速度,將進程綁定在一個CPU可以提高緩存的命中率:
3.1:CPU綁定優化:
[root@linux-node1 ~]# taskset --help用法:taskset [選項] [掩碼 | cpu列表] [pid|命令 [參數...]]選項: -a, --all-tasks 在給定 pid 的所有任務(線程)上操作 -p, --pid 在存在的給定 pid 上操作 -c, --cpu-list 以列表格式顯示和指定 CPU -h, --help 顯示此幫助 -V, --version 輸出版本信息默認行爲是運行一條新命令: taskset 03 sshd -b 1024您可以獲取現有任務的掩碼: taskset -p 700或設置掩碼: taskset -p 03 700使用逗號分隔的列表格式而不是掩碼: taskset -pc 0,3,7-11 700列表格式中的範圍可以帶一個跨度參數: 例如 0-31:2 與掩碼 0x55555555 等效[root@linux-node1 ~]# taskset -cp 2 42340 #將進程號爲42340的進程指定運行在第二核心CPUpid 42340's current affinity list: 0-3 pid 42340's new affinity list: 2
3.2:內存優化:
3.2.1:內存EPT技術:
系統將內存識別爲虛擬內存,包含物理內存和交換分區,KVM是一個進程,EPT是Intel用於加快內存映射的技術
3.2.2:大頁內存,加快內存尋址:
[root@linux-node1 ~]# cat /proc/meminfo MemTotal: 3866944 kBMemFree: 166796 kBMemAvailable: 1775636 kBBuffers: 1632 kBCached: 1691036 kBSwapCached: 52 kBActive: 1682932 kBInactive: 1594028 kBActive(anon): 1090476 kBInactive(anon): 558692 kBActive(file): 592456 kBInactive(file): 1035336 kBUnevictable: 0 kBMlocked: 0 kBSwapTotal: 2097148 kBSwapFree: 2096024 kBDirty: 36 kBWriteback: 0 kBAnonPages: 1584492 kBMapped: 78708 kBShmem: 64876 kBSlab: 283776 kBSReclaimable: 234440 kBSUnreclaim: 49336 kBKernelStack: 10528 kBPageTables: 10088 kB NFS_Unstable: 0 kBBounce: 0 kBWritebackTmp: 0 kBCommitLimit: 4030620 kBCommitted_AS: 2855828 kBVmallocTotal: 34359738367 kBVmallocUsed: 193548 kBVmallocChunk: 34359483232 kBHardwareCorrupted: 0 kBAnonHugePages: 1181696 kBHugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kB #Centos 7默認已開啓DirectMap4k: 100160 kBDirectMap2M: 4093952 kB
3.2.3:開啓內存合併:
[root@linux-node1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled #將連續的沒有使用的內存合併爲2M一個表,減少內存碎片[always] madvise never
3.2.4:IO優化
使用virtIO半虛擬化的IO技術,讓磁盤知道其運行在虛擬機環境當中
3.2.5:磁盤的調度算法:順序讀寫遠大於隨機讀寫,系統的IO調度器是
[root@linux-node1 ~]# cat /sys/block/sda/queue/scheduler #Centos 7默認只有3個,Centos 6有4個
noop:不進行調度,用於SSD
[deadline]:最後期限算法,防止寫操作因爲不能讀取而被餓死的情況
cfq:完全公平,公平分配IO訪問,Centos 6的默認算法
3.2.6:寫入磁盤的幾種方式:
writeback:同時使用了虛擬機和物理機的pagecache,會被同時寫入到虛擬機和物理機的pagecache在寫入到物理磁盤緩存,這種方式寫入速度快但是假如突然斷電會導致出現數據丟失而導致數據一致性出現問題,本方式性能最好但是不安全。
None:將數據直接寫入到物理磁盤緩存在寫入磁盤,速度次於writeback。
writethrough:直接寫入到物理磁盤,突然斷電的話數據丟失最少,但是速度比較慢,因爲繞過了上面的兩層pagecache即沒有使用緩存。
web站點適用於使用writeback,即讀多寫少的情況,對於需要提供數據安全的場景必須數據庫等推薦使用writethrough,KVM默認就是使用的writethrough: