ContextShift:€8 64MB Xen VPS

contextshift

ContextShift 是荷兰阿姆斯特丹的一家 VPS provider,他家的 VPS 较贵 64MB 就要5欧,前几天的 WeServIT:128MB Xen VPS 只要5欧,更夸张的是 ContextShift 的 VPS 还要9欧的 setup fee(连续订购3个月的话可以免掉 setup fee),setup fee 只在 dedicated server 里面听说过,在 VPS 里面不多见。不过这个东西也说不好,说不定人家 “贵” 的有理由呢。他家 VPS 没有提供 SWAP,不过可以自己在系统里添加 swap 文件的方式添加 SWAP. VPS 配置如下:

服务器在荷兰或英国
5GB 硬盘
64MB RAM
25GB 带宽
8欧元

服务器和网络信息:

AMD Opteron CPUs, ECC error correcting memory, RAID1 (mirrored) storage and dual gigabit network connections.

给 Xen 虚拟机添加一个网络接口

我们在工作中用到了大量的虚拟机,至少一半的物理服务器都被虚拟化了。VPSee 正在考虑用一个虚拟机来替代一台物理机器来监测网络上的主机情况。前不久我们小组拉了一根自己的 ADSL,建了一个自己的网,这样加上工作网络就有2个不同的网,我们希望能在一个虚拟机上用 Cacti 等工具同时监测2个网络上的多台关键服务器、路由器和交换机的实时情况。这就需要在我们的虚拟机上连接到另一个网络,Xen 默认安装后在 dom0 和 domU 上只有一个虚拟网络接口,现在我们需要在 Xen 虚拟机(domU)上添加另一个虚拟网络接口,并和物理服务器上新添加的网卡和网络配置对应起来。

配置

打开 Xen 的配置文件,注释掉 (network-script network-bridge) 一行,然后加上下面一行:

# vi /etc/xen/xend-config.sxp

#(network-script network-bridge)
(network-script network-multi-bridge)

然后创建一个 network-multi-bridge 脚本,用来2次执行 network-bridge 脚本:

# vi /etc/xen/scripts/network-multi-bridge

#!/bin/sh
dir=$(dirname "$0")
"$dir/network-bridge" "$@" vifnum=0 bridge=xenbr0 netdev=eth0  
"$dir/network-bridge" "$@" vifnum=1 bridge=xenbr1 netdev=eth1

重启 Xen 服务使配置生效:

# /etc/init.d/xend restart

打开 Xen 虚拟机的配置文件,加入一个虚拟网卡:

# vi /etc/xen/vpsee

vif = [ "mac=00:16:3E:58:FF:AB,bridge=xenbr0",
        "mac=00:16:3E:58:FF:AD,bridge=xenbr1" ]

重启虚拟机后,查看网络适配器的配置就会发现多了一个 eth1:

# /sbin/ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:16:3E:58:FF:AB  
          inet addr:172.16.38.200  Bcast:172.16.39.255  Mask:255.255.254.0
          inet6 addr: fe80::216:3eff:fe58:ffab/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:801 errors:0 dropped:0 overruns:0 frame:0
          TX packets:209 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:93950 (91.7 KiB)  TX bytes:42427 (41.4 KiB)

eth1      Link encap:Ethernet  HWaddr 00:16:3E:58:FF:AD  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

给 eth1 配置 IP 地址、掩码、网关等:

# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.10.200
GATEWAY=
NETMASK=255.255.255.0

配置好虚拟机的网卡后启动网卡:

# /etc/sysconfig/network-scripts/ifup eth1

这样就给运行在一台物理机器上的 Xen 虚拟机增加了一个新网卡,并连接到了物理服务器所在的新网络,虚拟机上的2个网卡和物理服务器上的2个网卡一一对应。

配置路由表

如果想在服务器上同时访问2个网络和其子网络的话,需要修改默认网关和配置路由表:

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=172.16.39.200
GATEWAY=172.16.38.1
NETMASK=255.255.254.0

# vi /etc/sysconfig/network-scripts/ifcfg-eth2
IPADDR=192.168.10.200
GATEWAY=
NETMASK=255.255.255.0

# vi /etc/sysconfig/network-scripts/route-eth0
192.102.5.0/24 via 172.16.38.1 dev eth0

# vi /etc/sysconfig/network-scripts/route_eth1
192.168.0.0/23 via 192.168.10.2 dev eth1

监测 Xen 服务器的几个常用命令

安装完 Xen 服务器后,随着 Xen 虚拟机用户的增加,有必要经常查看一下 Xen 服务器(host)的状态,以及各个虚拟机(guest)的运行情况、占用的系统资源等。现在已经有很多针对 Xen 的监测工具可以使用,不过 VPSee 不主张滥用第三方工具,会增加 dom0 的负担以及带来安全隐患,保持简单(KISS),尽量用简单的工具做事情(不明白为什么有人写个便条还要用 Word,Notepad 就可以轻松搞定啊,这又让我想到了 Vi vs IDE~~)。VPSee 的几台 Xen 服务器只用来提供虚拟单一服务,dom0 只是为了提供硬件抽象、一个 hypervisor 层给 domU,所以应该尽量保持 dom0 的精简,同时也为了安全,不提倡在 dom0 上安装和运行任何不必要的软件。要监测 Xen 服务器的话最好就是用好一些 Xen 自带的命令行工具。

Top 是 Unix/Linux 中监测性能的重要工具,Xen 中也有 top,用来监测 host 和各 domains 的实时状态:

# xm top
xentop - 20:48:24   Xen 3.1.2-164.11.1.el5
10 domains: 2 running, 8 blocked, 0 paused, 0 crashed, 0 dying, 0 shutdown
Mem: 8388156k total, 7617344k used, 770812k free    CPUs: 2 @ 2814MHz
      NAME  STATE   CPU(sec) CPU(%)     MEM(k) MEM(%)  MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS   VBD_OO   VBD_RD   VBD_WR S
SID
  Domain-0 -----r	1478    2.6     524412    6.3   no limit       n/a     2    6   648948    66380    0        0        0        0
  0
vm01 --b---        194    0.2     532352    6.3     540672	   6.4     1    1        0        0    1        0	 0
 0    0
vm02 --b---        211    0.2     532352    6.3     540672	6.4     1    1        0        0    1        0        0        0
   0
vm03 -----r	1685  106.4    1048440   12.5    1048576      12.5     2    1    26384    26900    2        0     6751    21520
  0
vm04 --b---	5255   20.6    2105216   25.1    2113536      25.2     1    1        0        0    1        0        0        0
  0
...

显示所有 domains 的运行状态信息:

# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0      512     2 r-----   1457.3
vm01                                       1      519     1 -b----    191.9
vm02                                       2      519     1 -b----    208.9
vm03                                       8     1023     2 -b----   1666.1
vm04                                       9     2055     1 -b----   5100.9
...

显示所有 domains 的上线时间:

# xm uptime
Name                              ID Uptime
Domain-0                           0 20:30:40
vm01                               1 20:28:54
vm02                               2 20:28:48
vm03                               8  7:44:07
vm04                               9 20:28:34
...

显示 host 的信息:

# xm info

显示所有 domains 使用虚拟处理器的情况:

# xm vcpu-list
Name                              ID VCPUs   CPU State   Time(s) CPU Affinity
Domain-0                           0     0     0   r--    1392.3 0
Domain-0                           0     1     1   -b-      80.5 1
vm01                               1     0     1   -b-     194.1 any cpu
vm02                               2     0     1   -b-     210.6 any cpu
vm03                               8     0     1   -b-     901.8 any cpu
vm03                               8     1     1   -b-     770.8 any cpu
vm04                               9     0     0   -b-    5211.0 any cpu

显示某个 domain 使用的虚拟网卡信息:

# xm network-list vm01
Idx BE     MAC Addr.     handle state evt-ch tx-/rx-ring-ref BE-path
0   0  00:16:3e:24:c4:0b    0     4      12    768  /769     /local/domain/0/backend/vif/10/0

显示 xend 的日志:

# xm log

显示 xend 的 demsg 信息:

# xm dmesg

显示 host(node)的信息,和 xm info 类似:

# virsh nodeinfo
CPU model:           x86_64
CPU(s):              2
CPU frequency:       2814 MHz
CPU socket(s):       1
Core(s) per socket:  2
Thread(s) per core:  1
NUMA cell(s):        1
Memory size:         8387584 kB

显示某个 domain 的相关信息:

# virsh dominfo vm01
Id:             1
Name:           vm01
UUID:           8636724a-0369-4d18-ab92-969ad3a21bf6
OS Type:        hvm
State:          idle
CPU(s):         1
CPU time:       2992.5s
Max memory:     540672 kB
Used memory:    532352 kB
Autostart:      enable

显示某个 domain 使用的虚拟处理器信息:

# virsh vcpuinfo vm01
VCPU:           0
CPU:            1
State:          idle
CPU time:       2989.9s
CPU Affinity:   yy

限制 Xen Dom0 的内存

今年来的新人比较多,每个人都需要至少两个 Xen 虚拟机做项目,一个 Linux 一个 Windows,去年升级到 16GB 内存的服务器都显得资源很紧张,今天 VPSee 给新来的人分配虚拟机的时候居然发现内存不够用。Xen 运行一段时间后,dom0 就会吃掉几乎所有可用内存(这是 Linux 的特点,把多余的内存用来做缓存),这时候如果要新建一个 Xen 虚拟机的话就造成内存分配不足的错误:

# xm create vm01
Using config file "./vm01".
Error: (12, 'Cannot allocate memory')

解决的办法很容易,就是在 Xen 内核启动的时候加上 dom0_mem=512M 参数限制,这样 dom0 最多只能使用 512MB 的内存。当然可以根据自己情况来决定给 dom0 分配多少内存,如果不确定的话,这篇 “应该给 Xen Dom0 和 DomU 配置多大内存?” 可能会有帮助。

# vi /etc/grub.conf
default=0
timeout=2
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.11.1.el5xen)
        root (hd0,0)
        kernel /xen.gz-2.6.18-164.11.1.el5 dom0_mem=512M
        module /vmlinuz-2.6.18-164.11.1.el5xen ro root=LABEL=/
        module /initrd-2.6.18-164.11.1.el5xen.img

在 OpenSolaris 上安装和配置 Xen

OpenSolaris 的一个杀手级应用就是 ZFS,很多人也是为了 ZFS 而 ”不得不“ 用 OpenSolaris/Solaris,虽然现在 FreeBSD 上也有 ZFS 的移植,但不是很稳定。ZFS 把存储管理(volume management)和文件系统(file system)两个功能结合在一起,提供了一种全新的存储管理方式,磁盘管理简单,想增加磁盘加到 pool 里就可以了;基于事务,保证数据完整、一致;自动修复,没有 fsck 的痛苦;自由伸缩,自由增减磁盘;快照,轻松而快速地创建快照;海量存储,几乎无限的存储容量等这些优点使得 ZFS 很适合做存储、文件服务器。这也是 VPSee 想用 OpenSolaris 做 dom0 的一个主要原因,ZFS 将会给 domUs 的备份、扩展带来极大方便,现在正在测试,将来会用 ZFS 来存储 10GB×2×400=8TB 的虚拟机镜像(400个人,每个人2种桌面系统 ubuntu 和 windows,每种系统占用 10GB)。下面的安装步骤和配置过程基于 OpenSolaris 2009.06 版本,Ubuntu,Debian 和 CentOS 版本可以分别看这里:在 Ubuntu 上安装和配置 Xen在 Debian 上安装和配置 Xen在 CentOS 上安装和配置 Xen,NetBSD 版本参看:在 NetBSD 上安装和配置 Xen.

安装 xVM

Sun 把 Xen 移植到 OpenSolaris 后改叫 xVM. 首先创建一个单独的启动环境,这一步不是必须的:

# beadm create -a -d xvm xvm

安装必要的软件包:

# beadm mount xvm /tmp/xvm-be 
# pkg -R /tmp/xvm-be install SUNWvirt-manager SUNWxvm SUNWvdisk SUNWvncviewer 
# beadm umount xvm

安装成功后,检查 Xen 内核是否已经加到 grub 启动文件里:

# vi /rpool/boot/grub/menu.lst

title xvm
findroot (pool_rpool,0,a)
bootfs rpool/ROOT/xvm
kernel$ /boot/$ISADIR/xen.gz
module$ /platform/i86xpv/kernel/$ISADIR/unix /platform/i86xpv/kernel/$ISADIR/unix -B $ZFS-BOOTFS,console=text
module$ /platform/i86pc/$ISADIR/boot_archive

# bootadm list-menu
the location for the active GRUB menu is: /rpool/boot/grub/menu.lst
default 1
timeout 2
0 OpenSolaris 2009.06
1 xvm

打开 xVM 服务:

# svcadm enable -r xvm/virtd ; svcadm enable -r xvm/domains

重启系统后看一下 Xen 的内核(i86xpv)以及 xend 是否启动:

# uname -a
SunOS vpsee 5.11 snv_111b i86pc i386 i86xpv

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1879     2     r-----     24.0

创建和安装 guest

用 zfs 工具创建一个 volume 保存 guest 操作系统的 image:

# zfs create -o compression=on -V 5G rpool/vm

# zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
...
rpool/vm               5G   222G    16K  -
...

# ls -l /dev/zvol/dsk/rpool/
total 3
...
lrwxrwxrwx 1 root root 35 Oct 28 09:56 vm->../../../../devices/pseudo/zfs@0:3c
...

从 ISO 文件(osol-0906-x86.iso)安装 OpenSoaris Guest 操作系统,注意这里 -p 选项是 paravirtualized 安装,paravirtualized 不能安装 windows:

# virt-install --nographics -p -r 1024 -n vm01 -f /dev/zvol/dsk/rpool/vm \
-l /export/home/vpsee/osol-0906-x86.iso

要安装 windows 需要使用 fully virtualized 选项并且要有 CPU 的支持(Intel VT or AMD V)。服务器上面通常没有图形界面,所以图形化安装 windows 需要打开 vnc 服务,并给 vnc 设置一个密码,然后从 vnc client 登录后就可以看到 windows 的安装界面了:

# svccfg -s xvm/xend setprop config/vnc-listen = astring: \"0.0.0.0\"
# svccfg -s xvm/xend setprop config/vncpasswd = astring: \"password\"

# virt-install -v --vnc -n vm02 -r 512 -f /dev/zvol/dsk/rpool/vm \
-c /export/home/vpsee/windowsxp.iso --os-type=windows

进入 guest

Guest 安装成功后就可以登进去了:

# xm console vm01

如果要退出 guest 的话,用 Ctrl + ] 就会回到 host。

Troubleshooting

ZFS 很容易就耗光 dom0 的可用内存,所以要对 ZFS ARC 的内存使用做限制,如下设定最大可用内存为 256MB:

# vi /etc/system
...
set zfs:zfs_arc_max = 0x10000000

限制 dom0 内存也对系统的安全有所帮助,在 gurb/menu.lst 加一行可以设定 Xen dom0 的最大可用内存为 1GB:

# vi /rpool/boot/grub/menu.lst
...
kernel$ /boot/$ISADIR/xen.gz dom0_mem=1024M
...

Xen 调整 NTFS 虚拟硬盘大小

前几天 VPSee 升级了服务器的硬盘,现在有了更多的空间可以分给虚拟机用户,就算给每个人分 100GB 都不是问题,问题是每个人 100GB 会给服务器备份工作带来很大压力,所以决定在原来每个人 20GB Windows 虚拟机的基础上扩展到 40GB. 以前介绍了如何调整 Xen 虚拟硬盘大小,不过只针对 guest 操作系统是 Linux、文件系统使用 ext2/ext3 的情况,如果 guest 操作系统运行的是 Windows、文件系统是 NTFS 该怎么办呢?

关闭 Windows 虚拟机:

#/usr/sbin/xm shutdown vm01

给虚拟机镜像文件(.img)追加 20GB 空间:

# dd if=/dev/zero bs=1G count=20 >> /vm/vm01.img

现在新的虚拟机 image 多了 20GB 额外空间,不过分区表没有变,所以这个时候需要一个分区软件修改分区表,把新增加的空间加到分区表。不过在使用分区工具前需要把 image 挂到一个 loop 设备上:

# /sbin/losetup -f
/dev/loop2
# /sbin/losetup /dev/loop2 /vm/vm01.img

安装 gparted 分区软件,然后修改分区表:

# yum install gparted
# gparted /dev/loop2

这个时候会看到如下图所示的分区结构,注意这个时候直接修改 /dev/loop2p1 分区大小会报错,所以这个时候可以直接在 unallocated 上面新建一个 unformatted 分区。

gparted

分区完后卸载 loop 设备:

# losetup -d /dev/loop2

启动 Windows 虚拟机:

# /usr/sbin/xm create vm01

进入 Windows 后在磁盘管理里面可以看到未格式化的分区,接下来就可以格式化并使用这个分区了,也可以使用其他的分区工具把新建的分区和老分区合成一个区或者分成多个区。

在 Ubuntu 上安装和配置 Xen

服务器硬盘已经升级了,还在等内存,内存是和硬盘一起订的货不知道怎么还没到,终于发现前天 RAID 0 的测试结果为什么不正常,因为有个硬盘有问题,昏~新买的刚拆包装的硬盘居然就有问题。现在大多数 SUN 服务器上只有 2GB-8GB 的内存,升级后应该达到 8GB-32GB,这样就可以给每个 Xen 虚拟机更多的内存了。我们有一些操作系统还是32位的,现在也必须升级到64位以应付大内存的到来。今天在一台 Sun Fire X2200 M2 上最小化安装64位的 Ubuntu,升级更新后开始安装和配置 Xen. 下面的安装步骤和配置过程基于 Ubuntu 9.04 Server 版本,CentOS 版本可以参看:在 CentOS 上安装和配置 Xen,Debian 版本可以参看:在 Debian 上安装和配置 Xen,OpenSolaris 版本参看:在 OpenSolaris 上安装和配置 Xen,NetBSD 版本参看:在 NetBSD 上安装和配置 Xen.

安装 Xen

安装支持 Xen 的相关工具:

$ sudo apt-get install ubuntu-xen-server

下载和安装支持 Xen 的 Linux 内核:

http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-modules-2.6.26-2-xen-amd64_2.6.26-17lenny2_amd64.deb
http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-image-2.6.26-2-xen-amd64_2.6.26-17lenny2_amd64.deb

$ sudo dpkg -i linux-modules-2.6.26-2-xen-amd64_2.6.26-17lenny2_amd64.deb 
$ sudo dpkg -i linux-image-2.6.26-2-xen-amd64_2.6.26-17lenny2_amd64.deb

安装成功后,检查 Xen 内核是否已经装好:

$ sudo vi /boot/grub/menu.lst

...
title       Xen 3.3 / Ubuntu 9.04, kernel 2.6.26-2-xen-amd64
root        (hd0,0)
kernel      /xen-3.3.gz
module      /vmlinuz-2.6.26-2-xen-amd64 root=/dev/mapper/nvidia_igcjceec3 ro console=tty0
module      /initrd.img-2.6.26-2-xen-amd64
...

重启系统后检查一下是否是 Xen 的内核以及 Xen 是否启动:

$ uname -r
2.6.26-2-xen-amd64

$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1879     2     r-----      6.6

创建和安装 guest

如果把正在运行的 Xen 内核的操作系统看成 host 的话,那么运行在 host 上面的操作系统就可以看成 guest。先建一个目录用来存放所有的 guest 操作系统的 image,vm01.img,vm02.img,等等,1个 guest 对应1个 image. 使用 xen-create-image 后会在 /vm 下生成以 hostname 命名的目录,这个目录下会有 vm01.vpsee.com/disk.img,vm01.vpsee.com/swap.img 两个镜像文件。

$ sudo mkdir /vm

$ sudo xen-create-image --hostname=vm01.vpsee.com \
--ip=172.16.39.101 --gateway=172.16.38.1 --netmask=255.255.254.0  \
--dist=feisty --mirror=http://archive.ubuntu.com/ubuntu --size=10gb \
--memory=512mb --swap=512mb --arch=amd64 --dir=/vm \
--boot --passwd --role udev --dir=/etc/xen --force

可以根据需要调整 /etc/xen-tools/xen-tools.conf

进入 guest

安装成功后就可以登录 guest 了,

$ sudo xm console vm01

如果要退出 guest 的话,用 Ctrl + ],就会回到 host。

如果想每次启动 host 时自动启动 guest 的话:

$ sudo ln -s /etc/xen/vm01 /etc/xen/auto

更懒的办法

如果觉得安装 guest 操作系统太麻烦,可以到 http://stacklet.com/ 下载一个已经装好的镜像文件,调整 Xen guest 的配置文件,然后在 host 下启动 guest 镜像就可以了。

$ wget http://stacklet.com/sites/default/files/ubuntu/
ubuntu.9-04.x86-64.20090514.img.tar.bz2

$ tar jxvf ubuntu.9-04.x86-64.20090514.img.tar.bz2
$ sudo mv ubuntu.9-04.x86-64.xen3.pygrub.cfg /etc/xen/ubuntu.9-04.cfg
$ sudo vi /etc/xen/ubuntu.9-04.cfg
$ sudo mv ubuntu.9-04.x86-64.img /vm/ubuntu.9-04.img

$ sudo xm create -f ubuntu.9-04.cfg
Using config file "/etc/xen/ubuntu.9-04.cfg".
Error: Device 2049 (vbd) could not be connected. Failed to find an unused loop device

$ sudo vi /etc/modules
loop max_loop=64

$ sudo xm list
$ sudo xm console ubuntu.9-04

从 http://stacklet.com/ 下载的镜像文件的初始用户名和密码为:root/password

增加 swap

如何给 guest 系统(domU)增加 swap,这里有介绍。

几种开源虚拟产品的性能比较

周末看了一篇 Virtualization of Linux servers,这篇论文测试了当前几个主要开源虚拟产品的性能,刚好配合前段时间看的几种不同虚拟技术的隔离性能。虚拟机的性能和隔离性都是虚拟技术非常重要的性能指标,大面积测试和比较不同的产品需要消耗大量的时间和精力,这篇文章在前人的基础上较全面测试了 Linux 下不同虚拟产品的性能,涉及到的有 KQEMU、KVM、Linux-VServer、OpenVZ、VirtualBox、Xen.

测试方法

整个测试在一台 IBM/Lenovo Desktop PC 上进行,这台 PC 配有 Intel Core 2 Duo 6300 处理器,4GB 内存和 80GB SATA 硬盘。服务器(host)操作系统是 Ubuntu 7.10,内核是 2.6.22-14,虚拟机(guest)操作系统是 Ubuntu 6.10. 网络部分的测试则通过另外一台 PC 来进行。使用的测试软件和参数如下:

Kernel Build
$ make defconfig
$ date +%s.%N && make && date +%s.%N
$ make clean

Dbench
$ /usr/local/bin/dbench -t 300 -D /var/tmp 100

Netperf
$ netserver # server side
$ netperf -H # client side

Rsync
Experiment 1:
$ date +%s.%N && rsync -av ::kernel /var/tmp && date +%s.%N # client side
# where ’kernel’ is the linux-2.6.22.14 file tree (294M)
$ rm -fr /var/tmp/*
Experiment 2:
$ date +%s.%N && rsync -av ::iso /var/tmp && date +%s.%N # client side
# where ’iso’ is ubuntu-6.06.1-server-i386.iso (433M)
$ rm -fr /var/tmp/*

Dd
Experiment 1:
$ dd if=/opt/iso/ubuntu-6.06.1-server-i386.iso of=/var/tmp/out.iso
$ rm -fr /var/tmp/*
Experiment 2:
$ dd if=/dev/zero of=/dev/null count=117187560 # 117187560 = 60G

Bzip2
$ cp /opt/ubuntu-6.06.1-server-i386.iso .
$ date +%s.%N && bzip2 -9 ubuntu-6.06.1-server-i386.iso && date +%s.%N
$ rm ubuntu-6.06.1-server-i386.iso.bz2

SysBench
$ mysql> create database sbtest;
$ sysbench –test=oltp –mysql-user=root –mysql-host=localhost –debug=off prepare
$ sysbench –test=oltp –mysql-user=root –mysql-host=localhost –debug=off run

测试结果

  • kernel build:内核编译是个长时间重负荷的 CPU 处理过程,期间还会涉及到多线程处理和小文件的读写操作。使用 OS-level 和 para-virtualization 技术的虚拟产品性能较好,接近 Linux.
  • dbench:是个文件系统测试工具,用来测试文件服务器的负载,Linux-VServer 在这项测试中大比分胜出,VirtualBox 则在这项测试中不明原因的 crash,其余产品的测试结果均比 Linux 低约30%.
  • netperf:是用来测试网络性能的工具,使用 TCP 包流来测试网络数据交换的性能。这项测试中基于 QEMU 的虚拟产品性能较差,VirtualBox 在这项测试中表现较好,可能和 VirtualBox 使用一个特别的网络驱动有关。
  • rsync:也是用来测试网络。OpenVZ 最好,KVM 最差,其余几个差不多。
  • dd:用来测试磁盘 I/O 的性能,不用涉及太多的 CPU. Xen 和 KVM 性能较好,OpenVZ 明显很慢。
  • bzip2:压缩也是个重负荷 CPU 的工作,但是不用磁盘频繁 IO 操作。除了 KQEMU 和 OpenVZ 外,其余几个虚拟机性能接近 Linux.
  • sysbench:数据库服务器测试。在这个测试中,Linux-VServer 和 Xen 性能接近 Linux,而 KVM 和 OpenVZ 性能只有他们的一半。
  • scale:在最后一项也是最考验虚拟技术的 scale 测试中(sysbench at scale),Xen 表现优异,其他几个虚拟产品在虚拟机数目达到32个的时候,性能大大降低,只有 Xen 能在扩大虚拟机数目的同时保持较好的性能损失。KVM 在8个虚拟机的时候表现最好,VirtualBox 在16个的时候表现最好,其余产品在虚拟机数目达到4个的时候表现最好。

sysbench-at-scale

总的来说,Xen 除了在 dbench 文件系统测试中有点落后外,在其余所有的测试中都表现不俗,尤其是在最后的 scale 测试中表现惊艳。

几种不同虚拟技术的隔离性能

周末看了一篇 paper:Quantifying the Performance Isolation Properties of Virtualization Systems,这篇论文测试了几种不同虚拟技术的隔离性能,隔离性是虚拟机性能的重要指标,尤其是对商业 hosting,如 VPS、VDS 等来说,虚拟机能否把各个 VPS 合理的隔开并让物理机器上的每个 VPS 能按照事先约好的定义(如 CPU/RAM/DISK 等)公平而且充分的利用物理服务器资源很重要。这篇论文测试了目前市场上使用最普遍的几种虚拟技术以及相关代表产品,有代表 full virtualization 技术的 VMWare Workstation,代表 para virtualization 技术的 Xen,代表 operating system level virtualization 技术的 OpenVZ 和 Solaris Containers,提出的问题就是看看这些不同的虚拟技术和产品能不能、以及能在多大程度上隔离和保护每个物理机器上的虚拟机,比如能否保护好每个 VPS,能有效为不同 VPS 用户分割资源,不让 “不良” 用户超过计算额度、过分抢占其他用户的资源。

测试方法

这篇论文描述的实验方法是,首先确定一些 baseline 数据,然后做 stress 测试。

  1. 把1台物理机器分成4个虚拟机,每个虚拟机上运行1个 apache web server + SPECweb 2005 组合来得到 baseline 数据。
  2. 然后做 stress 测试,同样是上面的1台物理机器和4个虚拟机,也同样在运行1个 apache web server + SPECweb 2005 组合,只不过这个时候在其中1台虚拟机上增加了 stress test,来测试这个 stress 加上去以后是否对原有的虚拟机有影响、有多大影响。这样测试结果就可以和前面4台虚拟机没有 stress 测试的数据做比较。

主要测试了以下一些性能参数,以及测试每种参数用到的方法:

  • CPU Intensive:让虚拟机不停的做整数计算操作;
  • Fork Bomb:不停的 fork 进程;
  • Memory Intensive:不停的分配、使用内存,而不 free 掉内存空间;
  • Disk Intensive:用 IOzone 工具,开10个线程,每个线程不停的进行交替读写操作(iozone -i0 -i1 -r 4 -s 100M -t 10 -Rb);
  • Network Intensive (Transmit):开4个线程,每个线程不停的发送 60K 大小的 UDP 包;
  • Network Intensive (Receive):开4个线程,每个线程不停的接受 60K 大小的 UDP 包。

测试结果

测试结果如下图所示,0代表结果最好,DNR(Do Not Response) 代表最差。测试结果和理论上预料的一致,Full virtualization 技术能完全模拟一台计算机,不需要修改 guest 操作系统就可以直接在其上运行,由于其技术的优越性隔离性能最好;para virtualization 需要修改 guest 才能运行,隔离效果其次;最后是 operating system level virtualization,在操作系统层面虚拟,不能运行不同的操作系统,隔离不彻底,其隔离性能也最差。同一虚拟技术的不同产品,如 OpenVZ 和 Solaris Containers 也表现出了差异。

the performance isolation of virtualization systems

VPSee 只对 Xen 和 OpenVZ 有兴趣,这里省略了 Solaris Containers 的测试数据和图片,大家如有兴趣可参考原文。

Xen 和 KVM 的性能对比

最近出现提供 KVM/Qemu VPS 的服务商让 VPSee 有点惊讶,印象当中 KVM 还是一个很新的项目,还远没有达到成熟应用的工业标准,现在已经看到有人/公司开始提供基于 KVM 的 VPS 了,KVM 在众多重量级厂商的强力推动下果然发展很快。2008年9月 RedHat 宣布收购 KVM 老家 Qumranet,并在今年9月份刚刚过去的 Red Hat Summit 2009 上宣布 KVM 将是 RHEL 5.4 的下一代虚拟技术,RHEL 5.4 同时也会支持 Xen,对 Xen 的支持会持续到 RHEL 5 产品线的结束,Novell 已经在 SUSE Linux Enterprise Desktop 产品线上使用 KVM,Ubuntu 已经指定 KVM 为其默认虚拟技术了,KVM 在短时间内就已经赢得了三大 Linux 厂商的支持,想让人忽略都很难。

前天看了一篇关于 Xen 和 KVM 性能对比的 paper,Quantitative Comparison of Xen and KVM(图片来源),较详细的比较了 Xen 和 KVM 的性能和扩展性,不过这篇 paper 的发表时间是2008年6月,有点老了,现在 KVM 的性能和成熟度肯定有了很大的提高。这篇 paper 从三个角度来比较了 Xen 和 KVM 的性能:

总体性能

分别测试 CPU 速度,内核编译速度和 IO 的读写速度,结果如图,Xen 的 CPU 测试结果非常接近 Linux,性能非常好;KVM 在 CPU 测试中表现也不错,比 Xen 差一点,但是在 IO 测试中要比 Xen 好一些。

craigslist internals overview

隔离性能

隔离性能主要用来测试 Xen 和 KVM 能否有效隔离 guest,以便每个 guest 都能公平的得到计算资源,不会被某个“坏” guest 占用资源。在隔离方面 KVM 比 Xen 做得要好一些,Xen 在网络方面几乎没有隔离,虽然隔离性能不好,反而提高了服务器整体的网络利用率,按需分配肯定比平均分配效率高。图中 DNR 的意思是 “did not return”,是最坏的一种情况。

craigslist internals overview

扩展性能

扩展性能测试的是随着 guest 的增多,有没有、有多少额外的性能损失,因为 guest 之间的切换会造成性能损失。测试结果显示 Xen 有很棒的扩展性能,几乎是随着 guest 的个数线性增加的;而 KVM 扩展性能就很差,扩展到4个 guest 就崩溃了1个 guest,扩展到8个崩了4个,扩到16个崩了7个,扩到30个整个系统都崩溃了。

craigslist internals overview