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 | vcpus=8 |
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 | #xm console virtualname |
保存(暂停)虚拟机
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共用内核,内存利用率最高;其他两种方案每个虚机都需要单独的操作系统占用一部分内存空间。
- Author: 瀚海书香
- 原文链接:虚拟化性能分析(XEN/KVM/LXC)