為了服務品質,最近把遊戲服務托管換到世紀互聯了,雖然貴,但是網絡穩定性能保證。
機房的記價都是按照機位來的,每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 克隆虛拟機