今天我们的主题就叫做“如何让一块硬盘产生20万的IOPS”,是因为我们今天的工作环境,特别是我们的虚拟桌面就构建在一块普通的硬盘之上,整体的环境说明如下:
一:环境配置
1. 两台物理服务器(其实和PVS没太大关系,不过为了介绍完整,还是说明一下)
l 一台是1路4核服务器,32G内存,CPU是至强 E3-1230V2,3.3GHz(PVS发布出来的虚拟机就运行在这台物理服务器上)
l 另外一台是1路6核处理器,64G内存,CPU是至强E5-2620 V2,2.10GHz(PVS服务器运行在这台物理服务器上)
2. 底层Hypervisor环境:VMwarevSphere 。
下面是第一台物理服务器的vSphere Client截图。
下面是第二台物理服务器的vSphere Client截图。
3. Citrix软件版本信息配置
XD版本:7.6.0.5026,VDA7.6.0.5026
PVS版本:7.6.1
4. 测试虚拟机配置信息
Windows 7虚拟机运行在第一台1路4核的物理服务器上,虚拟配置是3个vCPU,3GB内存,分配了两个硬盘,第一个硬盘5G,用于写缓存(Write Cache),第二块硬盘40GB,用于Personal vDisk的读写。两块硬盘均放置在一个运行FreeNAS的共享存储上,底层的服务器是 HP MicroServer Gen8,磁盘是两块7200转的SATA接口3TB容量的磁盘做RAID1,通过千兆连接到两台物理服务器。所以理论上这个Windows 7的虚拟机后面的承载基础也就是一块普通机械硬盘,正常情况下IOPS最多不超过100个。
看一下虚拟机的具体配置,下面是Windows7虚拟机的配置信息及第一块硬盘信息:
下面是Windows7虚拟机的配置信息及第二块硬盘信息:
Windows 7的已安装软件配置:
二:测试结果:启动阶段
1. Windows7启动阶段测试结果
首先看看重启虚拟机的时候,PVS服务器的压力。
下面的图就是我们用远程桌面的方式登陆了PVS01服务器后打开的Windows界面。左边是PVS01服务器的任务管理器的“联网”实时数据窗口,右边是PVS创建的004号虚拟机的启动窗口。
我们可以观察到虚拟机在启动过程中,PVS网卡速率是10Gbps,那么0.5%的速率就是5MB/s的速度持续了一段时间,这段时间就是把vDisk的数据通过网络传输到Target Device设备上去。
注意:会不会如果多个虚拟机同时启动那么网络流量就翻倍呢?答案是不会的,永远都是传输这么多数据量。具体原因看接下去的测试结果。
接下来虚拟机启动完毕,我们可以看到网路峰值在2.5%左右,也就是瞬时到了25MB/S的速度,整体流化到目标设备的网络流量平均速度在10MB/S。
2. Windows虚拟机启动所需传输的数据量
那总计有多少流量的数据从PVS服务器传输到了Windows 7虚拟机呢?很简单,打开Windows的任务管理器,看看消耗了多少内存就知道了。因为PVS发布的虚拟机本身是没有C盘这个说法的,用户看到的虚拟机的C盘实际上是vDisk这个母盘+写缓存的叠加,实际数据均在内存和写缓存中。下图以一个随机的Windows 7操作系统启动后的性能监视图为例说明,该虚拟机启动后内存消耗是684MB,减去缓存的290MB,实际传输数据量是684-290=394MB数据量。
按照10MB/S的速度,最多需要394/10 = 39秒的时间启动完毕,而我们实测的Windows 7启动时间也是刚刚好花费了39秒的时间,整体情况是符合我们测试结果的。
3. PVS服务器上监控数据
如果有394M的数据从PVS服务器传输到了Target Device,即Windows 7虚拟机,那么这些数据从哪里来呢?我们打开一下PVS服务器的监控画面。
从图中可以看到E盘大量的磁盘读取活动,这个活动规律和网络活动是一致的,可以看出来网络中传输的数据正是从E盘读取出去的。
PVS服务器之所以读取E盘的数据传输给Windows7虚拟机是因为我们把操作系统主镜像文件vDisk放在E盘上。如下图所示,vDisk以及后续的增量更新包正是放在E盘上。
接下去我们再看看如果有第二台虚拟机启动、第三台虚拟机启动,又或者是第一台虚拟机重启时的服务器压力情况。
由于无论是多少个虚拟机启动,其原理均是从PVS服务器上所保存的vDisk磁盘文件中去读取数据,然后传到网络上,所以第二台虚拟机启动、第三台虚拟机启动,又或者是第一台虚拟机重启,PVS服务器表现均一致,我们就以第一台服务器重启为例。
下面的图就是刚才这台虚拟机重启时PVS服务器监控数据。
我们可以看到PVS服务器的网络压力是依旧差不多的,都是保持峰值在2.5%,平均流量在10MB/S左右。但是和第一次启动最大的不同在于vDisk基本上没有读取量。如下图所示E盘的磁盘访问情况:
从上图可以看出vDisk操作系统镜像文件在后续的Windows 7虚拟机启动时不再被读取,但是Windows 7虚拟机启动确实需要启动文件,这些数据不可能凭空变出来,唯一的解释就是这些数据由PVS服务器缓存到了它自己的内存中,提供更高速的读取机制。
4. 技术分析
由于我们是把vDisk放置在PVS服务器的E盘,所以第一次虚拟机启动的时候E盘的磁盘读取量比较大,而在后续的读取中,由于PVS服务器已经把磁盘镜像读入其自身的操作系统内存中,所以对磁盘完全不构成压力,即使是把虚拟机镜像文件放在存储上,原理也是如此,即第一次读取后后续即不再读取磁盘数据,而是从内存中直接提供访问需求。这就是为什么PVS服务器在虚拟机启动阶段为什么不需要存储的原因,同时也能保证快速的启动虚拟机而没有启动风暴。我们这次重启总共也就只花费了30秒钟的时间。
三:测试结果:启动阶段
1. Iometer测试软件简介
接下来我们看看使用IOMeter这个测试工具对PVS发布的Windows 7虚拟机做的IO方面的测试结果。
Iometer 既是工作负载生成器(也就是说,它可以进行输入输出操作,以便增加系统的负荷),它还是一个测量工具(也就是说,它检查并且记录I/O 操作的性能和对系统的影响)。它可以被配置为模拟任何程序或者基准测试程序的磁盘和网络I/O的负载,或者用来产生整个综合的I/O负载。它也可以用来产生并测量单系统或者多系统(网络)的负载。所以我们可以用这个工具来测试虚拟机的磁盘性能。
Iometer 包含了两个程序,Iometer 和 Dynamo。Iometer 是控制程序,我们在上面配置测试参数,察看测试结果。Dynamo 是负载生成器,它执行相应的I/O 操作并且记录性能信息,然后将数据返回给Iometer。Dynamo 是多线程的,它的每一个运行的线程称为工作者。
我们先科普一下Iometer界面的读取方法,如下图所示:
1)Transfer RequestSize (测试请求的文件大小)
你要测试的文件块大小,比如测4KB随机的就填写4KB,测128KB持续的就填128KB。
2)Percent ofAccess Specification (当前规则占此测试中的比例)
如果你测试中需要添加多条规则的话,这个就可以设置比例了,比如50%做4KB随机测试,同时另外50%做128KB持续测试。
3)PercentRead/Write Distribution (测试请求的读/写的比率)
当前测试规则的读取/写入比率,比如66%读取的同时34%为写入,打个比方,我们的操作系统运行时在读取的时候,后台也在写入。
4)PercentRandom/Sequential Distribution (测试请求的随机/持续比例)
随机和持续占的百分比,比如测4KB随机80%的同时测4KB持续20%。
5)Align I/O on (对齐I/O到指定大小)
硬盘要分区对齐。
6)设置规则的全局显示
全部设置完了,起个名字,然后最后再看下没问题即可点下面的OK确认。
下面是测试结果的读取示例方法:
1)Update Frequency(Seconds) (成绩更新频率/秒)
成绩更新的频率,你可以设置每秒更新或者60秒一更新等等。
Results Since (结果从哪个时间段开始)
Start of Test - 由于在进行测试时,每一秒的成绩都不同,如果选择这个选项,那么Iometer显示的就是从测试一开始到现在为止的平均值。
Last of Update - 如果选择的是这个,那么Iometer就会显示最后次更新到现在的平均值。(如果你更新频率为30秒,那么成绩就是这个30秒内的平均值)
2)测试结果显示区域(图里的为默认,可以自己选择需要的结果)
Total I/Os Per Second 当前规则下,每秒处理的IOPS数。
Total MBs per Second 当前规则下,每秒的传输率。
Average I/O ResponseTime (ms) 当前规则下,平均一次IOPS处理时间。
Maximum I/O ResponseTime (ms) 当前规则下,最大一次IOPS处理时间。
%CPU Utilization(total) 当前规则下,CPU占用率
Total Error Count 当前测试中,测试出错计数。
2. Iometer测试Windows7虚拟机性能
我们做了多次测试,分别加载了4个工作者(以下简称worker)、10个worker,以及41个worker。
第一次我们采用Iometer的默认设置:4k:100% read; 0% random 访问方式。我们都知道这种4K大小的小文件读写简直是普通机械硬盘的死穴。Windows系统文件夹里的文件很多都是可压缩的小个子文件,读写这些数据时很多又是随机读写的,所以随机4K读写的速度决定了windows系统的启动和响应速度。
下图就是我们第一次4个worker的软件配置界面
由于worker较少,测试结果没有分析意义,仅验证测试过程是否正确,接下去我们正式增加压力。
接着切换成10个worker,同时修改了参数,测试了 4K 100% read, 100% random 的情况,配置界面如下图所示:
下面是测试结果,结果非常漂亮,达到了8288个IOPS,已经是准SSD固态硬盘的数值,要知道,虚拟机的底层就只有2块7200转的SATA硬盘作为支撑。
最后一次开启了41个Worker,此时这个Windows 7虚拟机的3个 vCPU已经达到 84%,跑的非常高了,我们来看看结果哦:
最后一次测试虚拟机的4K读写已经达到了恐怖的20.1658万IOPS,每秒的数据传出率达到了787MB/S,这是一个采用任何单块硬盘技术都无法启达的恐怖成绩,但是PVS做到了,仅需要一块普通机械硬盘作为后台承载基础却提供了高达20万的IOPS输出。
我们回过头来看看PVS服务器上是否有读写情况,如下图所示:
可以看到PVS服务器基本上没有读写活动,虚拟机所做的活动完全和PVS服务器没有联系,这些20万个IOPS的读写均是由Windows 7虚拟机及底层承载的机械硬盘所提供。
3. 技术原理分析
PVS的伟大之处不仅仅在于我们在上面看到的启动过程从内存中不断生成大量的克隆虚拟机,更重要的是在Windows虚拟机在用户使用过程中也可以工作在内存中。只不过区别在于前者是使用的PVS服务器的内存处理能力,而后者,即Windows 虚拟机日常工作中借助的却是虚拟机自身的内存提供的高速运算能力。
如上图所示,Windows 7虚拟机在运行过程中用户所有的操作,例如打开、编辑以及关闭Office文档,网页浏览,视频播放等任何活动本应该对磁盘的读写,全部转移至对内存的读写操作(这是和其他友商的纯内存虚拟机的最大区别),所以本来应该是大量4K文件大小的操作请求,对机械硬盘来说是致命伤的磁盘读写操作现在全部放在高速的内存区域中运行简直是瞬间被处理完毕,速度大大加快。本文的答案揭晓:为什么在我们的Iometer测试中一个靠普通机械硬盘作为存储支撑的Windows虚拟机可以产生高达20万IOPS请求的原因,实际上这个IOPS的提供者正是内存。
同时如果数据读写请求太多导致内存区域已经占满时,PVS会把内存空间中idle的数据块以2MB为一个数据块单位写入PVS在虚拟机侧建立的写缓存数据存储中,也就是在本例中的那个SASA接口的7200转3T硬盘。由于写入大小是2MB,写入方式是顺序读写,也大大减小了对硬盘读写操作的要求。下图就是一个顺序读写和随机读写的原理比较,如果是一个大的视频文件读写,由于视频文件都是连续存放在传统硬盘的磁片、扇区和磁道上,速度体验也并不差,但是如果是大量小文件读写,机械硬盘的磁头就要不断的在不同的磁片、扇区和磁道中到处寻址,大量的时间耗费在了机械运动上,导致性能急剧下降。。
正是由于PVS只在写缓存的存储介质上处理不常用的读写请求,在实测数据中,每虚拟机在写缓存上只产生了不到1个IOPS的需求。如果这台物理服务器承载了70个桌面,那么只需要提供最多70个IOPS即可满足上面承载的所有虚拟机使用,此时采用任意一块SATA硬盘即可。
在实际虚拟化项目中,因为PVS把虚拟机的读写操作全放在内存中进行的特点,Citrix几乎可以完全不配置任何存储即可满足项目要求,大大节省了用户的投入成本,而且运行速度还远快于传统的基于共享存储的虚拟机发布技术。