XenDesktop7.9的新功能:CitrixMCS IO加速浅析
一、概述
Citrix XenDesktop 7.9版本中有一个新功能,针对于MCS置备模式的虚拟机存储IO优化技术。该功能可以理解为类似PVS的“缓存在内存并溢出到磁盘”的IO加速技术。简而言之就是在正常读写磁盘的中间,加一个高速的缓存空间,该空间可以是内存空间也可以是SSD硬盘。一切的优化动作都在缓存空间进行,比如IO卸载、IO重排等。
Citrix XenDesktop 7.9中,有两个对临时数据进行优化和加速的选项:
- 临时RAM缓存。
- 临时磁盘高速缓存。
临时RAM缓存,默认配置内存限制(256MB),也就是说在MCS池模式下,所有的IO都会优先写入到高内存地址段空间中,直到写满256MB为止。
临时磁盘缓存,这个空间用来承载写满RAM之后的缓存数据。这个磁盘是一个单独的磁盘,你们可以和PVS的缓存盘类似理解,这个空间我们可以很实用本地的磁盘也可以使用共享存储的LUN,当然最好是SSD。类似于PVS高速缓存写入磁盘。
以上两个合起来就和PVS的“缓存在内存并溢出到磁盘”的IO加速技术类似,但是MCS模式下的这个技术和PVS的“缓存在内存并溢出到磁盘”的IO加速技术不同,实现的战略一样,但战术不同。
还有需要说明的是,我们的内存空间总是有限的,所以我们需要启用这对IO加速的功能的时候,最好是给每一台VM挂载一块磁盘,不管是本地SSD也好或者共享存储LUN也好。如果启用RAM缓存,但不启用临时磁盘缓存,RAM的空间在被写满的时候,就会造成缓冲区溢出,我们的VM就会蓝屏。
因此,黄金规则是:
缓存RAM:切勿在没有磁盘缓存的情况下运行RAM缓存,除非我们有足够大的RAM缓存空间。
缓存盘:切勿将你的缓存盘空间设置过大,黄金法则是缓存盘的空间不能大于C盘的可用空间。
二、配置
配置很简单,简单描述几句:
使用7.9版本,在创建一个新的目录的时候就可以看见这个功能。不过首先我们需要做的是给缓存盘添加一个本地存储或者共存存储。
增加临时存储:使用本地或共享存储。
添加好缓存盘的存储之后,就可以创建计算机目录了。
创建缓存计算机目录:仅适用于MCS桌面池,不能用于创建Appdisks。
在创建计算机目录的时候需要确保我们的VDA是最新的7.9的版本。低版本的VDA并不支持IO优化技术。
在接下来的页面,我们就可以设置缓存的大小了!
三、实现的原理
大致说下:其实就是对读,进行Cache,即:缓存经常要用到的数据;对写,进行buffer,缓冲一定数据以后,一次性进行写入。
如图:如果我们依据上述配置完成了缓存的计算机目录创建,但我们登录虚拟桌面的时候,就会发现桌面的磁盘管理中会多出一块磁盘,这块多出来的磁盘就是我们的缓存盘,注意,在这里,就是和PVS不一样的地方。
PVS的IO优化是基于Windows的操作系统的读写IO单位来进行优化的,假如现有一个应用程序发起一个IO,其大小为1KB,那么这1KB首先会写入到缓存的内存空间当中,内存的缓存会将这个IO卸载,排入到一个4kb大小的IO Buffer单位中,那么就还剩余3KB的IO单位是空闲的,这个时候缓存的设计欺骗操作系统,告诉这个操作系统的IO协议栈这个IO已经完成,然后IO协议栈就会上上层应用层回复IO完成。应用程序就会发起下一个IO请求。而此时,其实IO是并没有完成。该IO只不过是在内存的缓存空间给卸载了而已。那么在这个内存的缓存空间中,这1kb何时下发到真正的磁盘呢?一般来说,缓存系统会再次等待操作系统下发一个3kb大小的IO或者一个2KB一个1KB大小的IO,总之就是凑齐4KB单位的IO buffer。然后合并为一个单位的4kb Buffer,完成一个基本的IO单位向磁盘下发执行。当然我们这里只是举例说明,实际上的IO buffer大小不一定是4KB,这个看缓存系统是如何设计。
这是优化的一个方面,另外一个方面优化技术是将随机IO进行IO重排,变成顺序IO。顺序 IO 是指同时顺序请求大量数据,比如数据库执行大量的查询、流媒体服务等,顺序 IO 可以同时很快的移动大量数据。随机 IO 是指随机请求数据,其 IO 速度不依赖于数据的大小和排列,依赖于磁盘的每秒能 IO 的次数,比如 Web 服务、Mail 服务等每次请求的数据都很小,随机 IO 每秒同时会有更多的请求数产生,所以磁盘的每秒能 IO 多少次是关键。随机访问的特点是每次IO请求的数据在磁盘上的位置跨度很大(如:分布在不同的扇区),因此N个非常小的IO请求(如:1K),必须以N次IO请求才能获取到相应的数据。顺序访问的特点跟随机访问相反,它请求的数据在磁盘的位置是连续的。当系统发起N个非常小的IO请求(如:1K)时,因为一次IO是有代价的,系统会取完整的一块数据(如4K、8K),所以当第一次IO完成时,后续IO请求的数据可能已经有了。这样可以减少IO请求的次数。这也就是所谓的预取。随机访问和顺序访问同样是有应用决定的。但是我们在添加了缓存层之后,我们在缓存层就可以做一个操作,就是对IO进行重排,减社会及的杂乱无章的随机IO进行排序成一个顺序的IO,然后下发到磁盘之后,磁盘的寻道就是顺序的执行了,而不再是很大跨度的随机寻道执行,这样就大大提高了磁盘的IO执行效率,无形中提高整体系统的IOPS。