虚拟化性能分析(XEN/KVM/LXC)

1 测试环境

PowerEdge C6220 II服务器的一个刀片,64G内存,32颗CPU。

千兆网卡
百兆交换机
Dom0 8G 32vcpu
Dom1 8G 8vcpu

2 虚拟化的类型

XEN和KVM实现了真正的虚拟化方案;LXC确切来说应该是资源隔离(namespace),并不能提供完整的物理隔离功能。

XEN虚拟化是相对于KVM来说更加成熟的虚拟化方案,像AWS、Azure等公有云都是使用的XEN作为虚拟化方案;而随着最近几年KVM的发展以及KVM较好的性能,国内的部分虚拟化厂商开始选择KVM作为新的虚拟化方案,像百度、Intel中国、阿里云等开始逐步向KVM迁移。

LXC通过资源隔离和命名空间实现了伪虚拟化功能,由于LXC较高的性能和不彻底的隔离,越来越多的应用到私有云上。

3 磁盘IO性能

3.1 XEN磁盘性能

我们知道XEN 虚机中磁盘操作会经过Dom0来中转,那么中转带来的效率损坏有多少呢?这里测试raw和LVM两种情况。

3.1.1 Dom0

3.1.1.1 随机读
1
fio -filename=/dev/vg0/root-disk -direct=1 -iodepth 1 -thread -rw=randread -ioengine=sync -bs=2M -size=50G -numjobs=1 -runtime=60 -group_reporting -name=mytest

3.1.1.2 随机写
1
fio -filename=/dev/vg0/root-disk -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=sync -bs=2M -size=50G -numjobs=1 -runtime=60 -group_reporting -name=mytest

3.1.2 DomU使用LVM

3.1.2.1 随机读
1
fio -filename=/dev/xvda1 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=sync -bs=2M -size=50G -numjobs=1 -runtime=60 -group_reporting -name=mytest

3.1.2.2 随机写
1
fio -filename=/dev/xvda1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=sync -bs=2M -size=50G -numjobs=1 -runtime=60 -group_reporting -name=mytest

3.1.3 DomU使用RAW

3.1.3.1 随机读
1
fio -filename=/dev/xvda1 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=sync -bs=2M -size=50G -numjobs=1 -runtime=60 -group_reporting -name=mytest

3.1.3.2 随机写
1
fio -filename=/dev/xvda1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=sync -bs=2M -size=50G -numjobs=1 -runtime=60 -group_reporting -name=mytest

3.1.4 总结

从测试数据可以看出,LVM DomU相较于Dom0,随机读取的吞吐量、IOPS下降10%,时延增加12%;随机写的的吞吐量、IOPS下降22%,时延增加33%。

与之相比RAW的性能下降更加明显。XEN虚拟化环境中采用LVM作为存储方案。

3.2 KVM磁盘性能

KVM的磁盘性能由于受到virtio的影响,每次测试结果偏差较大,不在此罗列。

3.3 LXC磁盘性能

根据LXC实现原理,其磁盘操作性能与物理机一致。

4 网卡性能

根据前段时间现场出现的问题和提供解决方案后的效果,以及理论数据来看,网卡需要采用pci-passthrough或者SR-IOV的模式。

5 OS性能

5.1 benchmark测试

采用lmbench对操作系统进行整体性能测试,包括非虚拟化场景、虚拟化Dom0且不绑定CPU场景、虚拟化Dom0绑定CPU场景、虚拟化DomU不绑定CPU场景、虚拟化DomU绑定CPU场景、KVM场景、LXC场景。分别对应physical-host、dom0-nopin—、dom0-pin8core、domU-nopin–8、domU-pin8core、kvm-8core—-、lxc-32core—。

具体测试数据参见附件benchmark-real.result。

5.1.1 虚机的系统调用性能下降明显

由于虚机中的系统调用路径边长,XEN系统调用的性能下降明显,KVM由于是内核嵌入式虚拟化,性能明显高于XEN。

而LXC由于与physical-host一样,使用同一个内核,所以LXC的性能与物理机基本相同。

5.1.2 CPU计算能力无差别

5.1.3 绑定CPU后的内存读写效率较高

绑定CPU后,由于cache命中增多,I/O相关的操作效率明显提升。

5.2 总结

要想获得较好的CPU计算性能,对于关键业务的虚机,需要给虚机绑定CPU,一方面可以防止VCPU漂移导致的缓存失效问题,另一方面可以防止由于VCPU调度不均衡导致的部分物理CPU过载的情况。

5.2.1 Dom0绑定cpu

Dom0负责处理DomU与外设的交互,Dom0的性能直接影响DomU的性能,推荐Dom0的vcpu不少于4个。

启动参数中添加“dom0_max_vcpus=4 dom0_vcpus_pin”

5.2.2 DomU绑定cpu

DomU中绑定CPU时要尽量将一个虚机的物理CPU放到同一个socket上,提高最后一级cache的命中率,同时也可以降低numa访问不同距离内存带来的负面影响。

对于开启超线程的CPU,一定要将两个逻辑CPU分配给同一个DomU,否则可能会因为CPU内硬件争用导致不同DomU之间互相影响。

查看CPU逻辑拓扑的方法可以通过xm info -n或者在Dom0中取消cpu绑定的情况下,通过hitvsupport中的likwid-topology命令。

DomU中指定CPU的方法如下:

1
2
vcpus=8
cpus = ["16","17","18","19","20","21","22","23"]

6. 虚拟化安装

6.1 XEN

SLES安装XEN PV内核

6.1.1 安装xen和dom0

1
yast2->virtualization->install hypervisor and tools

自动安装xen和dom0,重启并选择XEN启动项。

安装虚拟机

1
yast2->virtualization->create virtual machines

根据步骤创建虚拟机,这里创建出来的虚拟机就是domU

6.1.2 常用操作

查看主机上的虚拟机

1
#xm list

停止虚拟机

1
#xm destroy virtualname

虚拟机的配置存储在Xend store中,磁盘镜像文件默认存储在/var/lib/xen/images目录下。
导出虚拟机配置

1
#xm list -l virtualname > virtualname.cfg

删除一个虚拟机

1
#xm delete virtualname

根据配置文件添加一个虚拟机

1
#xm new -F virtualname.cfg

虚拟机clone

1
#virt-clone -o originalvirutal -n newvirtual -f /var/lib/xen/images/newvirtual.disk

进入虚拟机操作

1
2
#xm console virtualname
#退出时用ctrl+]

保存(暂停)虚拟机

1
#virsh save virutalname /var/virtualname.img

恢复虚拟机

1
#virsh restore /var/virtualname.img

6.2 KVM

在SUSE下KVM的安装于XEN类似,可以通过yast2图形化界面安装。

6.3 LXC

6.3.1 LXC环境安装

lxc不支持图形化操作,只能通过命令行进行。

安装lxc相关工具包

1
#zypper install lxc

lxc依赖内核cgroup,需要设置默认启动

1
#insserv boot.cgroup

手动启动cgroup

1
#/etc/init.d/boot.cgroup start
6.3.2 LXC虚机安装

这里以创建一个sles虚机为例讲解虚机的安装过程。

(1)编写lxc配置文件,配置文件一般存放在/etc/lxc目录下

1
#cat /etc/lxc/c2.conf

(2)以该配置文件创建一个sles虚机

1
#lxc-create -t sles -f c2.conf -n c2

本质上进行的操作就是copy一个rootfs到目录/var/lib/lxc目录下

(3)启动虚机c2

1
#lxc-start -n c2

(4)进入虚机

1
#lxc-console -n c2

(5)查看虚机状态

1
#lxc-info -n c2

(6)设置虚机可使用的内存

设置C1可以使用的内存为2G

1
#lxc-cgroup -n c1 memory.limit_in_bytes 2G

设置C1超过使用内存后诱发oom

1
#lxc-cgropu -n c1 memory.oom_control 0

如果有swap空间,当C1的内存使用2G后会使用swap,直到swap用光才会被kill。

如果关闭swap后,当C1的内存使用达到2G,再次申请空间就会被kill。

说明:由于memsw control的稳定性问题,sles11sp2默认关闭了对虚机使用memory和swap总和的限制。

7. 总结

三种虚拟化性能比较:LXC>>KVM>>XEN;由于LXC使用cgroup机制,其性能损坏基本为0。

三种虚拟化隔离比较:XEN>>KVM>>LXC;LXC只能虚拟化linux。

三种虚拟化内存利用率:LXC>>KVM>>XEN;由于LXC共用内核,内存利用率最高;其他两种方案每个虚机都需要单独的操作系统占用一部分内存空间。