学海无涯 个人blog lnmps.com 新站
分类: 虚拟化
2014-11-07 17:58:32
原文地址:虚拟化性能分析(XEN/KVM/LXC) 作者:瀚海书香
PowerEdge C6220 II服务器的一个刀片,64G内存,32颗CPU。
千兆网卡
百兆交换机
Dom0 8G 32vcpu
Dom1 8G 8vcpu
XEN和KVM实现了真正的虚拟化方案;LXC确切来说应该是资源隔离(namespace),并不能提供完整的物理隔离功能。
XEN虚拟化是相对于KVM来说更加成熟的虚拟化方案,像AWS、Azure等公有云都是使用的XEN作为虚拟化方案;而随着最近几年KVM的发展以及KVM较好的性能,国内的部分虚拟化厂商开始选择KVM作为新的虚拟化方案,像百度、Intel中国、阿里云等开始逐步向KVM迁移。
LXC通过资源隔离和命名空间实现了伪虚拟化功能,由于LXC较高的性能和不彻底的隔离,越来越多的应用到私有云上。
我们知道XEN 虚机中磁盘操作会经过Dom0来中转,那么中转带来的效率损坏有多少呢?这里测试raw和LVM两种情况。
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
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
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
Dom0中随机写性能:
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
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
从测试数据可以看出,LVM DomU相较于Dom0,随机读取的吞吐量、IOPS下降10%,时延增加12%;随机写的的吞吐量、IOPS下降22%,时延增加33%。
与之相比RAW的性能下降更加明显。XEN虚拟化环境中采用LVM作为存储方案。
KVM的磁盘性能由于受到virtio的影响,每次测试结果偏差较大,不在此罗列。
根据LXC实现原理,其磁盘操作性能与物理机一致。
根据前段时间现场出现的问题和提供解决方案后的效果,以及理论数据来看,网卡需要采用pci-passthrough或者SR-IOV的模式。
采用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。
由于虚机中的系统调用路径边长,XEN系统调用的性能下降明显,KVM由于是内核嵌入式虚拟化,性能明显高于XEN。
而LXC由于与physical-host一样,使用同一个内核,所以LXC的性能与物理机基本相同。
绑定CPU后,由于cache命中增多,I/O相关的操作效率明显提升。
要想获得较好的CPU计算性能,对于关键业务的虚机,需要给虚机绑定CPU,一方面可以防止VCPU漂移导致的缓存失效问题,另一方面可以防止由于VCPU调度不均衡导致的部分物理CPU过载的情况。
Dom0负责处理DomU与外设的交互,Dom0的性能直接影响DomU的性能,推荐Dom0的vcpu不少于4个。
启动参数中添加“dom0_max_vcpus=4 dom0_vcpus_pin”
DomU中绑定CPU时要尽量将一个虚机的物理CPU放到同一个socket上,提高最后一级cache的命中率,同时也可以降低numa访问不同距离内存带来的负面影响。
对于开启超线程的CPU,一定要将两个逻辑CPU分配给同一个DomU,否则可能会因为CPU内硬件争用导致不同DomU之间互相影响。
查看CPU逻辑拓扑的方法可以通过xm info -n或者在Dom0中取消cpu绑定的情况下,通过hitvsupport中的likwid-topology命令。
DomU中指定CPU的方法如下:
vcpus=8
cpus = ["16","17","18","19","20","21","22","23"]
SLES安装XEN PV内核
yast2->virtualization->install hypervisor and tools
自动安装xen和dom0,重启并选择XEN启动项。
安装虚拟机
yast2->virtualization->create virtual machines
根据步骤创建虚拟机,这里创建出来的虚拟机就是domU
查看主机上的虚拟机
#xm list
停止虚拟机
#xm destroy virtualname
虚拟机的配置存储在Xend store中,磁盘镜像文件默认存储在/var/lib/xen/images目录下。
导出虚拟机配置
#xm list -l virtualname > virtualname.cfg
删除一个虚拟机
#xm delete virtualname
根据配置文件添加一个虚拟机
#xm new -F virtualname.cfg
虚拟机clone
#virt-clone -o originalvirutal -n newvirtual -f /var/lib/xen/images/newvirtual.disk
进入虚拟机操作
#xm console virtualname
退出时用ctrl+]
保存(暂停)虚拟机
#virsh save virutalname /var/virtualname.img
恢复虚拟机
#virsh restore /var/virtualname.img
在SUSE下KVM的安装于XEN类似,可以通过yast2图形化界面安装。
lxc不支持图形化操作,只能通过命令行进行。
安装lxc相关工具包
#zypper install lxc
lxc依赖内核cgroup,需要设置默认启动
#insserv boot.cgroup
手动启动cgroup
#/etc/init.d/boot.cgroup start
这里以创建一个sles虚机为例讲解虚机的安装过程。
(1)编写lxc配置文件,配置文件一般存放在/etc/lxc目录下
#cat /etc/lxc/c2.conf
(2)以该配置文件创建一个sles虚机
#lxc-create -t sles -f c2.conf -n c2
本质上进行的操作就是copy一个rootfs到目录/var/lib/lxc目录下
(3)启动虚机c2
#lxc-start -n c2
(4)进入虚机
#lxc-console -n c2
(5)查看虚机状态
#lxc-info -n c2
(6)设置虚机可使用的内存
设置C1可以使用的内存为2G
#lxc-cgroup -n c1 memory.limit_in_bytes 2G
设置C1超过使用内存后诱发oom
#lxc-cgropu -n c1 memory.oom_control 0
如果有swap空间,当C1的内存使用2G后会使用swap,直到swap用光才会被kill。
如果关闭swap后,当C1的内存使用达到2G,再次申请空间就会被kill。
说明:由于memsw control的稳定性问题,sles11sp2默认关闭了对虚机使用memory和swap总和的限制。
三种虚拟化性能比较 LXC>>KVM>>XEN
由于LXC使用cgroup机制,其性能损坏基本为0。
三种虚拟化隔离比较 XEN>>KVM>>LXC
LXC只能虚拟化linux。
三种虚拟化内存利用率 LXC>>KVM>>XEN
由于LXC共用内核,内存利用率最高;其他两种方案每个虚机都需要单独的操作系统占用一部分内存空间。