天天看點

Xen虛拟化技術實踐

 為了服務品質,最近把遊戲服務托管換到世紀互聯了,雖然貴,但是網絡穩定性能保證。

機房的記價都是按照機位來的,每1u機位的價格固定,外網帶寬價格固定,是以對于我們的服務來說,租用固定帶寬,然後内部組區域網路即可,即便是這樣,每個機位的價格還是不少。這次機器采購的時候,故意采購了更好的硬體配置,然後采用Xen虛拟化技術,将一個1u的機器虛出3~4台機器,以節省開支。

下面是對xen的知識整理:

1 xen

1.1 為什麼要用虛拟機?

    機器空閑,需要充分利用資源

    運作的程式有危險性,需要用獨立的機器處理,但又沒有空閑機器

    做一些測試性的操作

    建立脫離機器配置的服務,容易遷移到另外的伺服器,備份硬碟即可

1.2 XEN使用半虛擬化的環境所具備的特色

    虛擬機器的運作效率與實體機器的效能相當

    最多可支援到具有 32 顆以上 CPU 的主機環境

    支援 x86/32, x86/32 含 PAE 技術, 及 x86/64 的硬體平台環境

    良好的硬體驅動程式支援,幾乎支援所有的 Linux 裝置之驅動程式

1.3 安裝XEN

1.3.1 方式一(yum)

yum -y install kernel-xen

yum -y install xen xen-libs python-virtinst

安裝相應的軟體後,修改啟動檔案:

/boot/grub/menu.lst

把xen核心版本的作為預設啟動項,比如 title CentOS (2.6.18-164.15.1.el5xen) 重新開機機器後,“uname -r” 檢查是否核心帶有xen字尾

1.3.2 方式二(rpm)

1.安裝檔案

CD光牒 Server 目錄

kernel-xen

xen-lib

gnome-python2-gnomekeyring

CD光牒 VT 目錄

gnome-applet-vm-0.1.2-1.el5.i386.rpm

libvirt-0.1.8-15.el5.i386.rpm

libvirt-devel-0.1.8-15.el5.i386.rpm

libvirt-python-0.1.8-15.el5.i386.rpm

python-virtinst-0.99.0-2.el5.noarch.rpm

virt-manager-0.2.6-7.el5.i386.rpm

Virtualization-en-US-5.0.0-7.noarch.rpm

Virtualization-zh-CN-5.0.0-7.noarch.rpm

xen-3.0.3-25.el5.i386.rpm

xen-devel-3.0.3-25.el5.i386.rpm

在第五張安裝CD光牒的VT目錄中還有許多其他檔案,主要是Xen圖形管理工具的語言封包件,可以不用都安裝上。上邊列出的隻是主要的RPM包,如果在安裝過程中報告還需要其他的RPM,則從CD光牒中尋找并安裝即可。

2.首先安裝Kernel的RPM包,使用rpm -ivh 指令安裝。

[root@localhost ~]# rpm -ivh kernel-xen-2.6.18-8.el5.i686.rpm

warning: kernel-xen-2.6.18-8.el5.i686.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

Preparing... ########################################### [100%]

1:kernel-xen ########################################### [100%]

[root@localhost ~]# rpm -ivh xen-libs-3.0.3-25.el5.i386.rpm

warning: xen-libs-3.0.3-25.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

1:xen-libs ########################################### [100%]

[root@localhost ~]#

3.修改預設的Kernel啟動順序。編輯/etc/grub.conf,找到“default=1”這行,把數字改成“0” 。“0”表示啟動第一個核心,即Xen核心。“1”表示啟動第二個核心,即作業系統AS5原來的普通核心。如下圖中紅色的标記。

[root@localhost ~]# vi /etc/grub.conf

4.修改完畢後重新啟動系統。重新開機系統完成後,再安裝其他的RPM。

[root@localhost ~/xen]# rpm -ivh *.rpm

warning: gnome-applet-vm-0.1.2-1.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

1:Virtualization-en-US ########################################### [ 9%]

2:gnome-python2-gnomekeyr########################################### [ 18%]

3:Virtualization-zh-CN ########################################### [ 27%]

4:xen-devel ########################################### [ 36%]

5:libvirt ########################################### [ 45%]

6:xen ########################################### [ 55%]

7:python-virtinst ########################################### [ 64%]

8:libvirt-python ########################################### [ 73%]

9:virt-manager ########################################### [ 82%]

10:gnome-applet-vm ########################################### [ 91%]

11:libvirt-devel ########################################### [100%]

1.4 路由設定

*nat

:PREROUTING ACCEPT [2163219:107750400]

:POSTROUTING ACCEPT [6604:476359]

:OUTPUT ACCEPT [6604:476359]

-A POSTROUTING -s 192.168.122.0/255.255.255.0 -d ! 192.168.122.0/255.255.255.0 -j MASQUERADE

COMMIT

*filter

:INPUT ACCEPT [470097:452540975]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [346597:50757224]

-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT

-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT

-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT

-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT

-A FORWARD -d 192.168.122.0/255.255.255.0 -o virbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT

-A FORWARD -s 192.168.122.0/255.255.255.0 -i virbr0 -j ACCEPT

-A FORWARD -i virbr0 -o virbr0 -j ACCEPT

-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable

-A FORWARD -m physdev  --physdev-in vif19624.0 -j ACCEPT

主要有兩個: 1 本機需要作為forward網關,轉發虛拟機的網絡請求 2 對虛拟機的網絡請求進行路由轉換

自行處理的話,主要的腳本有:

#啟用轉發

echo 1 > /proc/sys/net/ipv4/ip_forward

#路由位址轉換

$IPTABLES -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE

#端口轉發,比如ssh登入

$IPTABLES -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 5022 -j DNAT --to-destination 192.168.122.5:22

預設的路由表要檢查一下:

[root@aslibra ~]# route

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

.... 省略 ... eth0

192.168.1.0     *               255.255.255.0   U     0      0        0 eth1

192.168.122.0   *               255.255.255.0   U     0      0        0 virbr0

.... 省略 ...

default         .... 省略 ...  eth0

檢查虛拟機是否設定的ip為virbr0網卡的網段。

1.5 xen 虛拟機管理

1.5.1 增加記憶體

隻要修改虛拟機的配置檔案就可以了

[root@vmxen vm]# cat /etc/xen/vm4

name = "vm4"

uuid = "705ae6ad-3ab2-5447-8e00-eeee939e4a2c"

maxmem = 256

memory = 256

vcpus = 1

bootloader = "/usr/bin/pygrub"

on_poweroff = "destroy"

on_reboot = "restart"

on_crash = "restart"

disk = [ "tap:aio:/vm/vm4.img,xvda,w","tap:aio:/vm/vm4hd2.img,xvdb,w" ]

vif = [ "mac=00:16:36:48:25:65,bridge=xenbr0,script=vif-bridge" ]

注意:修改虛拟機記憶體前需要把剩下的所有記憶體回收,配置設定給domain-0 ,否則會出現記憶體與實際記憶體不符的情況。指令: xm list xm mem-set Domain-0 6144(實際剩餘記憶體)

 vi /etc/xen/hostname

 maxmem = 2048

 memory = 2048

1.5.2 調整 Xen 虛拟硬碟大小

關閉虛拟機

/usr/sbin/xm shutdown vm01

給虛拟機鏡像檔案(.img)追加 4GB 空間:

dd if=/dev/zero bs=1024k count=4096 >> /vm/vm01.img

掃描檢查鏡像檔案:

/sbin/e2fsck -f /vm/vm01.img

這個時候隻是增加了鏡像檔案(硬碟)的大小,這個鏡像檔案不是普通的檔案,裡面包含可 mount/umount 的 loop 檔案系統,是以需要調整檔案系統大小,不然的話進入虛拟機後 df 會發現硬碟大小沒變:

/sbin/resize2fs /vm/vm01.img

重新啟動 Xen 虛拟機:

/usr/sbin/xm create vm01

進入虛拟機後檢視硬碟大小:

/usr/sbin/xm console vm01

df -h

這裡提到了 mount/umount,說一點題外話,從技術角度來說現在的 VPS 其實都不安全,因為 VPS 服務商随時可以 mount/umount 你的虛拟機檔案、分區來讀取、甚至寫入内容,如果你的虛拟機所在的那台伺服器的 root 密碼被壞人拿到,那就毫無安全可言了,壞人可以随意在你虛拟機上做手腳。是以說安全性是雲計算的一個大問題,尤其是那些搭建在虛拟技術上的雲計算,這也可能是企業遲遲不願意使用公有雲的原因吧,一些 Startup 也隻是把不重要的資料放在類似 Amazon S3 之類的雲存儲上,對于機密資料還是自己儲存比較好。是以 VPSee 認為私有雲會有更大的發展空間。

1.5.3 增加硬碟

首先增加一個img檔案作為虛拟機的新硬碟, dd if=/dev/zero of=/vm/vm4hd2.img bs=1M count=2048

然後修改虛拟機配置檔案 ,增加xvdb的新磁盤。

這樣,重新開機vm後輸入fdisk -lh就可以看到第二塊硬碟了。

注意:比較好的方法是建虛拟機時就建兩塊硬碟,xvda用來裝系統,xvdb用來存放資料,這樣在硬碟空間不足時可以再增加一塊硬碟或者擴充xvdb的容量,對系統的影響比較小。

比如:xm1 的xvda為8G裝系統,xvdb 32G存放資料。

1.5.4 建立虛拟機

隻要拷貝xen vm的img鏡像檔案和配置檔案,并修改配置檔案中的鏡像路徑和虛拟機名稱就可以了。

注意要修改虛拟機的mac位址,要不然會出現沖突。

1.5.5 讓虛拟機随主控端一起啟動

隻要在/etc/xen/auto建立一個xen vm配置檔案的連結就可以了。

比如: ln -s /etc/xen/vm1 /etc/xen/auto/vm1.

1.6 效率問題?

我記得還是半虛拟化效率高。是這樣的,虛拟化,我覺得樓主分的有問題,不考慮模拟器的話,虛拟化分為有硬體支援(主要是CPU)和沒有硬體支援的虛拟化,最初标準的x86架構是不支援虛拟化的,VMWare等虛拟機的做法是在虛拟機執行的時候,預先取将要執行的指令,然後把其中的一些特權指令進行替換,是以效率底。而Xen等采用的半虛拟化則是在核心中進行修改,不去直接調用特權指令,是以效率高,我記得有90%的效率?

後來Intel和AMD在X86架構的CPU中各自加入了對虛拟化的支援,分别是VT和SVM。在CPU支援下,CPU就會有兩種模式,Root和Non-root。Hypervisor運作在Root而虛拟機運作在Non-Root模式。在這種情況下,虛拟機可以調用特權指令,但是會轉為Root模式處理,比以前來說不用軟體去替換那麼多的指令,是以效率就高一些。現在Xen、VMWare等都支援這種情況。

但是我們還是的注意,這裡隻是CPU支援了虛拟化,很多其他硬體裝置還是不支援硬體虛拟化,是以還是有一部分的硬體需要通過軟體進行模拟。是以效率還是不如半虛拟化高。

2 性能優化

在Xen環境下,硬體的管理并不是僅僅告訴它可以使用哪些PCI裝置就可以完事。在準虛拟環境下,記憶體與CPU配置設定是可以動态改變的。通過動态更改記憶體與CPU配置設定,可以達到優化虛拟機性能的目的。在本文中,TechTarget中國的特約虛拟化專家Sander van Vugt将描述這方面的所有資訊。

2.1 記憶體管理

啟動實體伺服器時,所有的記憶體資源都會預設被配置設定給Domain0。然後,其它虛拟機啟動時,會從Domain0擷取記憶體資源。如果虛拟機是在完全虛拟化模式下運作,hypervisor将無法與虛拟核心對話,目前的記憶體配置設定也将無法改變。不過,如果是在準虛拟化模式(paravirtualization)下,Xen的hypervisor就可以動态更變記憶體配置設定。采用準虛拟化模式時,一定要確定Domain0至少可以分得一定的記憶體資源,以免它記憶體不足。對于Domain0的記憶體配置設定最小值,我建議設定為512MB。

要為Domain0預留記憶體,可以為核心添加一個啟動項:dom0mem= 。例如,dom0mem=512M。打開Grub配置檔案進行此設定。在Grub配置檔案中,你會看到啟動Xen核心的啟動項。它大體如下

title XEN

root (hd0,0)

kernel /xen.gz

module /vmlinuz-2.6.16 .46-0.14-xen root=/dev/system/root vga=0x314

resume=/dev/system/swap splash=silent showopts

module /initrd-2.6.16 .46-0.14.xen

在此配置檔案中的第一個“module”行後面添加dom0_mem啟動項。添加之後應該是這樣

resume=/dev/system/swap splash=silent showopts   dom0_mem=512M

設定好Domain0的記憶體配置設定後,就可以管理你的虛拟機記憶體配置設定了。啟動一個虛拟機時,通常它會從Domain0擷取記憶體資源。記憶體一旦配置設定給虛拟機,Domain0将無法再收回,即使所有虛拟機都被停止也不能收回。正是因為這個原因,是以為Domain0設定記憶體最小值非常重要。

要想更改虛拟機的記憶體配置設定,可以利用兩個xm指令:

xm mem-set:此指令可以更改一台虛拟機的目前記憶體配置設定;

xm mem-max:此指令可以限定一台虛拟機的記憶體使用最大值。不過,更改最大值之後需要重新開機才能生效。

更改記憶體配置設定之後,一定要使用xm list指令檢查設定是否生效和正确:

xmlist

2.2 CPU管理

與記憶體一樣,你也可以管理虛拟機的CPU配置設定。如果虛拟機使用的是準虛拟化,CPU的配置設定也可以動态更改。為虛拟機配置設定CPU時,不一定要根據伺服器中的實體CPU數目來分。如果你願意,是可以這麼做。不過,這樣做是絕對優化不了性能的。如果将虛拟機與指定的實體CPU綁定,會幫助你大大地提高虛拟機性能。除此之外,還可以調整CPU的運作隊列(run queue),使某台虛拟機在CPU中具有更高的優先級。

所有可運作的虛拟CPU(VCPU)都是由實體CPU中的本地運作隊列管理的。這個隊列是按優先級進行排序的,隊列中的每個VCPU平分CPU資源。VCPU的優先級狀态有兩種值:over和under。Over表示它占用的CPU資源超過了資源平分值,under表示低于這個平分值。如果VCPU的目前狀态為under,排程程式下次則會優先服務該VCPU。如果排程程式發現在其CPU上沒有虛拟機為under狀态,則會看其它CPU中是否有VCPU狀态為under,如果發現,則立即服務該VCPU。通過這種方式,所有CPU都會平均配置設定CPU資源。

通過設定weight和cap參數值,管理者可以管理CPU的優先級。Weight參數用于配置設定CPU cycle,是一個相對值。一個weight為128的VCPU比一個weight為64的VCPU獲得的CPU cycle多一倍。是以,利用這個參數可以決定哪個VCPU獲得更多,哪個獲得更少。第二個設定CPU的參數是cap,它設定的是domain獲得的CPU cycle百分數,是一個絕對值。如果設定為100,就表示那個VCPU會100%地占用實體CPU的可用cycle。如果cap為50,則表示該VCPU占用的CPU cycle絕不會超過總量的一半。

在如下指令示例中, id為3的虛拟機weight為128,允許使用兩個實體CPU的所有CPU cycle:

xm sched-credit -d 3 -w 128 -c 200

對于虛拟CPU,還要做的一個重要工作就是CPU配置設定。預設情況下,虛拟CPU與實體CPU是沒有固定聯系的。要提高性能,就需要為它們建立一個這樣的聯系,這個工作很簡單易行。為虛拟CPU和實體CPU建立“聯系”的主要好處是可以防止虛拟CPU到處遊蕩。如果沒有“聯系”,排程程式會為虛拟CPU選擇一個實體CPU。當某個實體CPU處于繁忙狀态時,虛拟CPU就會被轉移,由另一個實體CPU服務。這個工作對性能的影響是很大的。是以,将虛拟CPU與實體CPU綁定是個不錯的辦法。

綁定虛拟CPU時,首先利用xm list指令檢視目前配置。然後,在你要檢視CPU詳細資訊的domain中使用xm vcpu-list指令,指令輸出結果如下:

xm vcpu-list 2

vcpu-list

這個指令顯示,ID 2 domain目前使用了一個CPU(ID 0),該CPU目前在實體CPU 0。為了确認它的狀态,可以使用如下指令:

xm vcpu-pin 2 0 1

如果你再使用xm vcpu-list指令,你會看見CPU Affinity由原來的“any cpu”變為了CPU 1。

注意,這個設定是無法被寫入的。意思是,每次重新開機虛拟機之後,你都必須再重新設定。

最後,你還可以更改虛拟機配置設定的CPU數量。要更改此設定,既可以利用虛拟機管理器(Virtual Machine Manager)進行,也可以使用xm vcpu-set指令。例如,将domain 1配置設定的VCPU數改為4個,則:

xm vcpu-set 1 4

使用該指令時,你會發現它有時不起作用。這是因為,虛拟機的作業系統還必須支援動态更改CPU數量,不然就不能這樣更改了。是以,在虛拟機的配置檔案中更改其VCPU數更有效,而且不會因為重新開機虛拟機而失效。

2.3 配置檔案

name = "ssd.web00101"

uuid = "8724aa2b-5cbf-706f-b7c4-20ae8292328c"

maxmem = 8192

memory = 8192

cpus = "0,1,2,3"

vcpus = 4

builder = "hvm"

kernel = "/usr/lib/xen/boot/hvmloader"

boot = "c"

pae = 1

acpi = 1

apic = 1

localtime = 0

on_reboot = "destroy"

on_crash = "destroy"

device_model = "/usr/lib64/xen/bin/qemu-dm"

sdl = 0

vnc = 1

vncunused = 1

keymap = "en-us"

disk = [ "phy:/dev/sda3,hda,w", "phy:/dev/cdrom,hdc:cdrom,r" ]

vif = [ "mac=00:16:36:50:fa:e3,bridge=virbr0,script=vif-bridge,vifname=vif3.0" ]

parallel = "none"

serial = "pty"

2.4 綜述

對于虛拟機的性能優化,記憶體與CPU設定很重要,本文已闡述了其原因。此外,你還了解了如何調整虛拟機在實體CPU中的優先級。

2.5 一些指令

xm list 列出目前虛拟機  

xm shutdown ssd.webxxx 關閉ssd.webxxx名稱的虛拟機  

xm shutdown -a 關閉所有虛拟機  

xm create -c centos5 開啟centos5配置檔案裡的虛拟機,并且接上目前界面  

xm vcpu-list ssd.webxxx 檢視ssd.webxxx名稱的虛拟機的cpu資訊  

virt-clone -o ssd.web00102 -n ssd.web00104 -f /dev/sda7 克隆虛拟機

繼續閱讀