本测试试图找出以下问题的答案:
1. 虚拟机相对于物理机性能损失有多严重(CPU/MEM/NET/DISK)
2. 对于多个虚拟机,KVM 对资源的分配是否公正
3. 找出性能最好的物理机磁盘类型和虚拟机磁盘类型及参数
A) 物理机使用 ext4 的最优化设置
? 使用 raw 磁盘的最优性能设置
? cache类型
? none
? writeback
? writethrough
? 驱动类型
? ide
? virtio
? 使用 qcow2 磁盘的最优性能设置
? cache类型
? none
? writeback
? writethrough
? 驱动类型
? ide
? virtio
? 是否preallocation
? 比较得出使用 ext4 的虚拟机磁盘类型最优化设置
B) 物理机使用xfs磁盘的最优化设置
? 使用 raw 磁盘的最优性能设置
? cache类型
1. none
2. writeback
3. writethrough
? 驱动类型
1. ide
2. virtio
? 使用 qcow2 磁盘的最优性能设置
? cache类型
1. none
2. writeback
3. writethrough
? 驱动类型
1. ide
2. virtio
? 是否preallocation
? 比较得出使用 ext4 的虚拟机磁盘类型最优化设置
C) 比较得出ext4和xfs那个更优秀
物理机配置
虚拟机配置
CPU 的测试
虚拟机配置
用一个寻找质数的 C 程序,分别测试找出一百万,一千万,1 亿以内的质数所用的时间
从上面的图可以看到,KVM 虚拟机相对于物理机的 CPU 性能损失非常小(不到 1%)
由于物理机是 8 核的 CPU,我们猜想是不是他们运行在各自的 CPU,所以我们分别测试了同时在 2 个,4 个,6 个,8 个和 10 个虚拟机中运行测试程序所使用的时间,得到的结果是他们使用的时间相差不大,这里是同时在 10 个虚拟机中运行测试程序找出 1 亿中的质数所使用的时间对比图,我们在最后加上了在物理机中的运行时间
我们猜想当同时运行的程序数(10)多于 CPU 数(8)时会有资源争抢或资源分配不均的情况出现,从上图可以看 到 KVM 于这些处理的很好,资源利用率很高,物理机和最慢的相差不到 20 秒(6%),资源分配也比较公正
内存
对于内存的测试多们使用了一个程序 memtester(注意不是 memtest),它能取给定大小的内存进行读写等一系 列的测试操作
从这个图可以看出,相对于物理机,虚拟机的性能损失非常小
上图是两个虚拟机同时运行测试所用的时间和物理机之间的对比,可以看出 KVM 对内存资源的分配很公平
网络
我们在连接在相同交换机的另一台服务器上搭建 Web 服务器,让测试机和虚拟机同时下载 5G 的文件
从这个图可以看到,公认的性能比较好的 virtio 驱动将虚拟机的网络性能发挥到极致,和物理机不相上下
这个图再一次反映了 KVM 对资源分配的公平性
我们还测试了同一台物理机上的虚拟机之间的传输速度可以稳定在 122MB/s
硬盘
磁盘的测试花了一些时间,因为有很多因素会影响磁盘性能,这个测试也没有覆盖所有可能的因素 先上数据
对表的说明:
? 这个表记录了不同的参数对安装一个 CentOS 到虚拟机中所用的时间的影响
? 安装使用相同的 kickstart
? 使用 time 命令记录安装过程所使用的时间
? 最后一列是将前一列的时间转化为秒数
? 第一列的 xfs 和 ext4 指宿主机的存放虚拟磁盘镜像文件的分区类型,挂载参数都使用 default
? Raw 和 Qcow2 指虚拟机的磁盘类型
? ide 和 virtio 指虚拟机磁盘的驱动类型
? pre 和 nopre 只是针对 qcow2 磁盘类型,创建磁盘文件时加上参数 preallocation=metadata 既为 pre
? none,wt,wb,分别指缓存类型为 none, writethrough, writeback
? 虚拟机都使用 1vcpu,2G 内存,40G 磁盘
下面从总体上看下他们的性能如何
从这个图不太容易看出哪个配置使用的时间最短,但非常容易看出最耗时的一个:
宿主机使用 xfs,虚拟机使用 qcow2 磁盘,ide 驱动和 writethrough 缓存类型
下面我们以由小到大的顺序,找出每个区域的最高性能,然后他们之间做对比
首先看一下不同的缓存类型对性能的影响
从两幅图可以得到的结论是:使用 writethrough 性能最差,none 和 writeback 相差不大
这里插点缓存的知识
在这种情况下,缓存是隐藏一些磁盘数据在内存中.当我们只在内存中存储上次读的数据,我们称之为读缓存,或 者 write-through 缓存.当我们还存储一些要写到硬盘的数据在内存中,在以后的某个时间再写到磁盘,我们称 之为读写缓存,或者 write-back 缓存,write-back 缓存通过将写磁盘请求缓存到高速内存中,有更高的性能,然 而它也比 write-through 更有可能丢失数据,因为后者只缓存写请求,写请求立即写到磁盘里
因为磁盘 I/O 是非常重要的因素,Linux 和 Windows 系统通常使用 write-back 策略周期性的写到磁盘里,然 而,当然后虚拟化管理程序虚拟一个机器时,你可以有效的缓存一些数据两次(一次在宿主机的内在中,一次在虚 拟机的内存中),所以你可以取消宿主机对磁盘文件的缓存,让虚拟机自己管理它的缓存.些外,宿主机端的 write- back 策略很大程序上增加了数据丢失的可能性,然而,你很快会发现,新特性”barrier passing”的加入,你不用 再担心这个
我们可以用一个图来更好的理解
假设传统的(没有 barrier-passing)程序:当虚拟机里的程序要写一些数据,通常数据保存到虚拟机的页缓存中. 页缓存会周期性的冲数据到虚拟磁盘设备也就是宿主机上的磁盘文件,另一方面,如果应用程序有一些非常重 要的数据要写,它可以绕过页缓存并且使用同步写方式,只有当写操作成功才返回,确保了所有的数据写到了虚 拟机的永久存储系统
然而,在这一点上(写到虚拟机磁盘上)有三种可能:
? 如果缓存策略是'writeback',数据会缓存到宿主机的页缓存中(红箭头)
? 如果缓存策略是'none',数据立即写到物理磁盘(灰箭头)
? 如果缓存策略是'writethrough',数据将立即写到物理磁盘(蓝箭头)
更多详情
下面我们看看 qcow2 磁盘使用和不使用 preallocation 的性能差异有多大
从上图可以看出,不管宿主机使用 ext4 还是 xfs,虚拟机使用 ide 还是 virtio 驱动,使用 preallocation 都有性能 的提升,
这里有一个不问题:如果宿主机使用 xfs,创建 qcow2 磁盘镜像使用 preallocation 会很慢(40G 需要 8 分钟)
下面我们来看看 ide 和 virtio 他们的性能对比
很明显使用 virtio 是更明智的选择
下面我们再看看 raw 和 qcow2 之间的对比
这里插一点 Raw 和 qcow2 的知识: 原文在这里: style="box-sizing:border-box;" />
从图表中可以看出,如果 qcow2 使用 preallocation, raw 的性能优势已经不是很明显
下面看看 ext4 和 xfs 之间 的对比
可以看到 ext4 性能要比 xfs 高,这可能是默认的挂载参数不能充分发挥 xfs 的性能
最后,我们把时间最短的放到一起看到底那个最快
总结