虚拟机(ESXi)下硬盘性能的探索

【本文不讨论的】

想获得最高的虚拟机硬盘效率,是可以 直通sata控制器 的,这样阵列、休眠、smart信息等特性都可以直接使用。其次, 直通硬盘 也不错,单盘的效率基本接近原生。

这两种直通在ESXi、PVE、unRaid下性能都很好,虚拟机做nas强烈推荐这两种方式。但本文不会讨论这块,因为没什么研究空间了。。。

【本文讨论的】

如果你无法使用直通(比如说硬盘数量不够),那就必须创建虚拟磁盘了。如何创建一个适合自己的虚拟磁盘?尤其是虚拟机玩NAS或Windows等系统,占用磁盘空间大且有一定性能需求,该如何权衡?

本文只是想给出一些我尝试过的方法和结论,希望能够提供帮助。

【大致想法】

首先最简单的方法肯定是虚拟机下直接创建虚拟磁盘,那么虚拟磁盘的 硬盘控制器 精简置备 置零 这些选项对磁盘的性能到底有多大影响?精力有限,本文只研究了ESXi,其它虚拟系统情形大体相似。

如果你的虚拟机中有一个NAS(比如说群晖),你可能已经把最大最快的硬盘直通给它了。其它次要的系统可否 从NAS中分一部分硬盘空间使用 ,性能如何?是否实用?

【测试的环境】

主机(ESXi系统):
CPU:E3-1265L v3 主硬盘:WDC WD5000BPVT(读取速度72MB/s)

群晖(虚拟机):
直通了sata控制器,两块4T酷狼组raid0,虚拟万兆网卡

Win10(虚拟机):
除系统盘外,对下面1、2、3、4情况各自建立了2G的虚拟磁盘,虚拟万兆网卡

【待测试的方案】

  1. ESXi下的 SCSI 厚置备、置零硬盘
  2. ESXi下的 SATA 厚置备、置零硬盘
  3. ESXi下的SATA厚置备、 延迟置零 硬盘
  4. ESXi下的SATA 精简置备 硬盘
  5. 群晖提供的 iSCSI 磁盘
  6. 群晖提供的 SMB 共享
  7. 群晖提供的 NFS 共享

接下来,我们按照解决疑问的方式一步步给出测试数据。

【SCSI有必要吗?】(方案1、2对比)

ESXi创建Windows虚拟机,会默认采用SCSI控制器。而我们一般家用主机,基本都是用SATA控制器的,SCSI一般只会在服务器上见到。是不是SCSI比SATA更高级呢?

理论上,SCSI会占用较少的CPU、有更好的扩展性,但硬件要求较高,所以家用很少用到。我们还是看看实测数据:

SATA(厚置备,置零)硬盘读取
SATA(厚置备,置零)硬盘写入
SCSI(厚置备,置零)硬盘读取
SCSI(厚置备,置零)硬盘写入

SATA(厚置备,置零)硬盘:读取58.9MB/s 写入47.8MB/s cpu平均2.8%

SCSI(厚置备,置零,半虚拟)硬盘:读取57.6MB/s 写入44.9MB/s cpu平均2.5%

(主机硬盘直接读取测试72MB/s)

为了方便对比,两块硬盘全都是厚置备、置零的配置。测得的速度相差不大,甚至SCSI还略低一丢丢。CPU占用SCSI略低一丢丢。考虑到测试有误差,可以认为两者的性能数据几乎一样。看来软件模拟出来的 SCSI、SATA性能差别不大 ,跟硬件SCSI、SATA的情况可能不一样。我个人偏向于使用SATA,因为平时主机就是SATA,兼容问题少(半虚拟的SCSI安装Windows需要额外驱动)。

【延迟置零有什么效果?】(方案2、3对比)

顾名思义,延迟置零可以把磁盘的置零操作延后,节省了创建虚拟机的时候卡住的那几秒或几分钟时间。实测在我这个烂硬盘上创建一个2G的置零磁盘差不多要1分多钟。我们来看看设置了延迟置零的硬盘的测试数据:

SATA(厚置备,延迟置零)硬盘第一次读取
SATA(厚置备,延迟置零)硬盘第一次写入
SATA(厚置备,延迟置零)硬盘第二次读取
SATA(厚置备,延迟置零)硬盘第二次写入

SATA(厚置备,延迟置零)硬盘第一次:读取1517.5MB/s 写入11.7MB/s

SATA(厚置备,延迟置零)硬盘第二次:读取58.5MB/s 写入48.8MB/s

SATA(厚置备,置零)硬盘:读取58.9MB/s 写入47.8MB/s (前面有数据截图)

第一次读取速度简直逆天!细想一下,很正常嘛,未置零的部分直接返回0就可以了,根本不需要真正的磁盘IO。再想一下,这个速度快有用吗?正常软件根本就不应该去读取硬盘的未初始化区域,总要先写入数据再读取才对。而第一次的写入速度就会比较悲剧了,因为写入的同时又要处理延迟置零,所以写入速度成倍下降。第二次读取、写入速度才是长期使用后磁盘的速度。

结论: 延迟置零会降低初次写入磁盘的性能 ,长期使用影响不大。从我个人而言,无所谓建立虚拟机的时候等几分钟,所以我还是不会选择延迟置零。

【精简置备划算吗?】(方案2、4对比)

精简置备是一个省硬盘空间的好办法,初期建立的虚拟磁盘文件会很小,随着写入数据而逐渐变大。(这里有人可能会疑惑,为什么精简置备没有区分置零和延迟置零?因为精简备至只能延迟置零了。换个角度:如果做了置零,也就不是精简置备了。)我们看看精简置备的性能数据:

SATA(精简置备)硬盘第一次读取
SATA(精简置备)硬盘第一次写入
SATA(精简置备)硬盘第二次读取
SATA(精简置备)硬盘第二次写入

SATA(精简置备)硬盘第一次:读取1639.6MB/s 写入12.2MB/s

SATA(精简置备)硬盘第二次:读取58.9MB/s 写入47.9MB/s

SATA(厚置备,置零)硬盘:读取58.9MB/s 写入47.8MB/s (前面有数据截图)

同样,第一次读取的速度是逆天的,第一次写入的数据是悲催的,原因跟延迟置零一样。结论似乎也是一样: 是否精简置备对长期使用的性能影响较小 。但是我的实际使用经验是,拿Windows这种操作系统跑精简置备的话, 精简备至后期的实际性能要低于测试值 。猜测原因可能是杂乱的磁盘使用导致虚拟磁盘文件出现大量碎片。

【iSCSI能有多快?】(方案5)

如果你的虚拟系统中包含一个nas虚拟机,比如群晖,那么让nas提供一个iSCSI网络硬盘给目标虚拟机用也是个不错的选择。看看测试数据:

群晖iSCSI(厚置备)读取
群晖iSCSI(厚置备)写入

群晖iSCSI(厚置备)网络硬盘:读取177.0MB/s 写入191.5MB/s

(单个原生盘的读取速度180MB/s,这里是双盘组了软raid 0)

这组数据已经跟之前的方案没有可比性了,因为基于的物理硬盘不一样。不过从这个数据可以看出, iSCSI的读写速度已经比较令人满意了 。实际长期使用较稳定,没有任何问题。有点遗憾的是理论上组了raid 0可以速度达到单盘的2倍,但这个才勉强1倍,不确定是软raid不太行还是什么原因(iperf3测试网络5G多速率)。有知道的老哥还请不惜赐教。

【SMB共享能做磁盘吗?】(方案5、6对比)

iSCSI的方案我用了厚置备以提升性能,但是这会带来很大的磁盘空间浪费。而且iSCSI一般不方便同时共享给多方使用。所以,我试了试把SMB(Samba)共享映射为驱动器。对比方案5测得的性能数据如下:

iSCSI磁盘读写
SMB共享读写

iSCSI磁盘:读取713MB/s 写入267MB/s

SMB共享:读取1143MB/s 写入297MB/s

因为HD Tune无法测试网络共享,所以只能换了CrystalDiskMark来测试,但后者的测试不那么准确,受缓存等影响较大。看起来 SMB的读取速度会高于iSCSI ,有点超出我认知。可能主要还是缓存影响了这部分数据。SMB共享因为是文件级的,可能受到了更多的缓存加速?

不过 SMB在实际使用中并不稳定 ,而且还有两个问题:
一是不能做系统盘。因为SMB共享是在系统启动后加载的,而iSCSI磁盘的加载甚至可以从BIOS引导开始(设置有点麻烦,我没实验了)。
二是碎文件读写非常慢。

【NFS共享更快吗?】(方案6、7对比)

简单测试看不出差异,就不献丑了。直接借用别人的结论:
NFS在碎文件多的时候性能显著高于SMB ,大文件速度跟SMB不相上下。想看详细对比数据直接看老外的研究(也是基于群晖): Network share: Performance differences between NFS & SMB

但这个测试结果不是在Windows上得出的。我在 Windows上的实际使用速度还远不及SMB ,而且有不稳定的状况,经常卡住。

【结论】

需要 稳定高性能 的话,可以采用 虚拟SATA、厚置备、置零硬盘

如果需要 节省空间 ,则考虑 虚拟精简置备硬盘

如果 有NAS ,可以用NAS 做一个iSCSI硬盘 ,稳定度和速度都较好。

爱折腾 的也可以试试 SMB或NFS共享 ,如果能解决Windows下稳定性问题还请指点一下。

编辑于 2021-11-10 21:03

文章被以下专栏收录