Citrix PVS架构和工作原理

Citrix PVS产品一直在Citrix的产品体系中存在着重要的位置,在中大型的VDI环境中,绝大部分都是基于PVS架构部署的,足以证明PVS架构的稳定、高效和便捷。

本文从底层架构和原理的角度分析了Citrix PVS组件,使得我们能够得窥PVS架构稳定、高效和便捷的背后,支撑的机制到底是什么?

 

一、Citrix PVS简介



Citrix Provisioning Services组件简称Citrix PVS,是通过创建一个标准的虚拟机镜像,该镜像就如同一个虚拟磁盘一样,里面包含了虚拟机的配置信息以及操作系统,并将其存储在PVS服务器或网络中的存储空间中。同时PVS对该虚拟磁盘进行管理,将其分发给用户的目标设备所使用。用户在使用的时候,此标准镜像通过流传输到服务器或桌面目标设备中。PVS流技术推送技术将单个共享磁盘镜像实时地置备或重新置备计算机。这样将使管理员完全不需要管理和修补各个系统。所有镜像管理均在主映像上完成。每个系统的本地硬盘可以用来实现运行时数据缓存,在某些情况下,还可以完全从系统中移除,从而降低电力消耗、系统故障率和安全风险。

Citrix PVS技术起源于无盘技术,而无盘技术最早是Novell Netware3.11NovellNetware 3.12作服务器的操作平台,工作站以IPX方式登录。当时我们称它为IPX无盘网络,主要是用于教学网络,应用程序主要以DOS为主。从1996年至1999年,以RPL方式登录的无盘网络占绝大多数,服务器端可以选择Novell Netware 4.1Windows NT 4.0 Server,在此期间,由于微软的大力支持,在它的Windows 95产品系列中,推出了网络版的Windows 95即所谓的完全版,它包含了网络安装命令Netsetup,之后的几年RPL几乎成为了无盘网络的代名词。之后,Intel推出PXE技术,叫做PXE远程无盘引导技术,配合Qualystem公司的LiteNet,最初选用台湾DTK公司的E-Terminal,成功地实现了Windows98的远程启动和运行,并使可靠性和稳定性都大大提高。Windows 98的各种应用软件只需通过简单的几个步骤即可加到无盘工作站上,并可随时升级和扩充,其简便的安装方式和构架,很快得到了业内人士的认可,并广泛流行起来。

PXERPL的升级品,RPLPreboot Execution Environment的缩写,意思为预置启动环境。它们的不同之处在于RPL是静态路由,而PXE是动态路由。其通信协议采用TCP/IP,与Internet连接高效而可靠。类似RPLPXE以及BOOTP等都是远程启动协议,现在的Windows已经不再支持RPL这类比较老的协议了,目前在Citrix PVS架构下用到的协议就是PXEBOOTP这两个协议。至于这两个协议有什么区别?工作原理是什么?本文暂且不表,待后续有时间再单独说明或者读者自己去网上查找相关资料了解。

 

二、Citrix PVS架构



说道Citrix PVS的架构,其本质上就是存储的架构,里面还包含了Windows的缓存机制、硬盘控制器的机制和远程启动协议等内容集成组合而成的一个构思巧妙的产品。在这里,我想必须从计算机的基本原理开始说起。我们得理解在传统的笔记本或者台式机上,我们计算机的基本工作流程,然后展开PVS架构之后,我们才能更清晰的明白PVS的架构和工作原理。


2.1、传统计算机基本读写架构



如下图所示,在一台计算机内部,我们的操作系统首先是需要安装在计算机上的硬盘上,然后,硬盘由计算机主板上位于南桥(IO桥)上的硬盘控制器管理。处理器不会直接跟硬盘进行通讯,而是通过硬盘控制器来进行。

0?wx_fmt=png

在传统的计算机硬盘架构中,输入(例如键击或鼠标点击)被传递到服务器并存储在计算机的RAM上。然后处理器需要将这些数据按照指令进行处理,完毕之后写回内存。如果指令有将数据存储到硬盘的要求,处理器则根据指令请求硬盘控制器; 硬盘控制器响应处理器的请求,通过DMA的方式将内存地址的这些数据传递到硬盘中。同时,如果用户还需要产生输出的操作,那么硬盘找到所请求的数据,然后将其传递到硬盘控制器,硬盘控制器传递回RAM RAM将数据和指令发送到处理器,在那里将其处理为以屏幕更新的形式发送给用户的输出。

以上就是大体的硬盘输入输出数据的流程。

接下来我们详细解释下上述的流程:首先这个键盘的驱动程序会将输入的数据向操作系统申请RAM空间来进行存储,然后将输入的数据存入到给到的内存地址空间当中;然后我们计算机的外设(键盘或者鼠标)就需要通过一个中断信号给到处理器让其去处理当前这个中断事件。当然外设在发起中断之前,需要有操作系统允许,当满足了中断条件之后,处理器就会响应中断,转入中断程序处理。中断程序里面告诉了处理器需要去内存的那个地址段执行操作。这里中断是指当外设需要与处理器进行信息交换时,由外设向处理器发出请求信号,使处理器暂停正在执行的程序,转去执行数据的输入/输出操作,数据传送结束后,处理器再继续执行被暂停的程序。在计算机基本架构中,传统的外设比如键盘/鼠标输入等外设就需要采用中断方式和处理器进行信息交互。比如电话响了->放下书本->接电话->继续看书这一个过程,就类似于处理器中断的处理过程。

上述我们说,键盘通过中断的方式让处理器去处理输入到内存中的数据。处理器在响应中断之后,处理器所要做的工作就是将当前内存地址中的这段数据读出来,根据操作指令稍加改动或者根本不动,然后又写入到内存的其他地方去。如果操作指令是需要写入到硬盘上,那么操作系统在写入到其他内存空间之后,处理器会像硬盘控制器发起一个存储的请求,告知硬盘控制器在内存的某个地址段的数据需要存储到硬盘上。硬盘控制器在接受到了这个处理器的请求之后,会这个请求翻译转换为SCSI指令下发到硬盘(硬盘只认识SCSI指令),硬盘接受到SCSI指令之后,通过其自带的硬盘故固件代码解析SCSI指令,获取到内存地址段的信息,然后直接通过DMA和内存进行数据读取请求。DMA方式是在存储器和外设之间、存储器和存储器之间直接进行数据传送(如磁盘与内存间交换数据、高速数据采集、内存和内存间的高速数据块传送等),传送过程无需CPU介入。

这个过程就没有CPU的参与,硬盘将数据读取出来存储到本身的存储空间之后,数据输入的过程就完毕了。但是如果用户的键盘输入是给Word应用程序进行输入或者是通过QQ回复消息,那么以上的过程就又有所不同了。

如果是在编辑Word应用程序的时候进行的输入操作,那么CPU在执行完毕之后,是不会直接将其联系硬盘控制器保存到硬盘上的,而是通过WindowsAPI保存到缓存文件夹中。

总之一句话,在传统的计算机硬盘架构中,用户的输入首先传递到计算机的RAM,然后再由处理器处理之后通过处理器联系硬盘控制器,由硬盘控制器传递给硬盘存储。读也是类似的,所有的读请求先通过处理器,有处理器请求硬盘控制器,硬盘控制器去发送读取指令给到硬盘,然后由硬盘和内存之间进行数据交换,将数据置换到内存或者缓存中后,再通过处理器调用相应的函数(投影到用户的显示器上还是输出到网卡)。

 

2.2PVS模式读写架构



PVS体系结构中,输入(例如击键或鼠标点击)会传递到目标设备,并存储在目标设备的RAM中。与传统硬盘架构不同,来自硬盘驱动器的指令请求发送到目标设备上的NIC。然后PVS将请求发送到硬盘控制器,那么很显然的,在PVS这种架构下,硬盘控制器不在是操作系统中的那个硬盘控制器,而是PVS服务器。然后,PVS服务器从存储设备找到该目标设备的相应硬盘(虚拟磁盘),并转发该数据请求。在硬盘上找到正确的数据后,发送回PVS服务器,然后PVS服务器发送回目标设备上的NIC。该数据被发送回目标设备的RAM,然后以屏幕更新的形式被处理成输出。

其流程如下图所示:

0?wx_fmt=png

经过上述的比较,我们大体可以知道,PVS就是放大版的硬盘控制器,而我们的vDisk就是传统计算机的硬盘。CitrixPVS架构就是将传统计算机的硬盘和硬盘控制器独立出来,然后硬盘大家共享,所有的读写操作都由PVS这台硬盘控制器来进行控制。

在目标设备和PVS服务器之间建立通讯链路,通过远程的协议将CPU内存和远端的硬盘以及硬盘控制器连接起来,然后目标设备运行的时候,通过该链路去读取远端的操作系统,PVS会将包含系统内核loader及压缩过的内核传递到目标设备,这个系统内核文件在目标设备内存模拟成磁盘,从这个模拟磁盘启动。当我们由读写IO时,首先读写IO都会存储在目标设备的RAM中,一般地,操作系统都会有缓存机制,将这些IO数据置换出来存放于缓存文件中。那么这就涉及到了Windows系统的缓存机制。

 

三、缓存机制



在这一块,我们要彻底地明白PVS的目标设备数据从RAMPVSvDisk之间以及目标设备本地的缓存磁盘之间是如何进行相互协作的?我们就不得不去了解Windows的内存管理和缓存管理。针对Windows的内存管理和缓存管理,国外的《Windows Internals》是最权威的资料,目前该版本的最新翻译本国内名称为《深入解析Windows操作系统》,不过较为遗憾的是,目前中文版只出版了第6版上册,下册没有出版,该版本翻译太困难了,必须要要具备深厚的操作系统功底,而且英文不错才行。并且是基于Windows 7 WindowsServer 2008 R2系统为蓝本进行解释的。国外最新的版本是基于Windows 8.1 and Windows Server 2012 R2的《Windows Internals 7》,国内尚未见到翻译版本。这是一本经典的书,是通向Windows高手之路的必备宝典之一。

接下来简要介绍一下Windows的缓存机制:

现代操作系统都在各个级别应用了高速缓存的策略,从而可以平滑化物理硬件的访问差异。一般的高速缓存分为两级,处理器和内存之间一般会设置高速缓存,但是这一般是硬件CPU或内存实现的,还有一个高速缓存存在于内存和磁盘之间,这个一般由操作系统实现,当然为了给应用程序提供灵活的策略自定义机制,在某些情况下也可以由应用程序实现高速缓存,比如Oracle,当然,这必须要求操作系统有直接IO的机制。

Windows的缓存机制由Windows中的缓存管理器来实现。其设计理念在于设计一个单独完整的高速缓存,所以它不能和文件系统相关,因为系统层次越往下分支越多,于是乎,Windows的高速缓存只能在文件系统之上实现。缓存管理器是Windows执行体中一个清晰的组件,而且他和系统虚拟内存管理器密切合作。缓存管理器为数据提供一致的全系统范围的数据缓存,这些缓存被适当关联的文件系统驱动管理,并与虚拟内存管理器和I/O管理器协同作业。他为文件数据执行预读。缓存管理器尝试根据每个文件数据的应用程序访问模式来调整它的缓存策略。因为所有到被缓存文件的I/O请求都要经过缓存管理器,所以缓存管理器可以跟踪文件数据的访问模式。因此,如果一个应用程序读一个文件的前10K字节,缓存管理器将把接下来的64K字节文件数据预读进内存。随后,如果应用程序尝试获取这些数据,这些数据可以简单的从系统缓存中拷贝,得以避免应用程序等待直到数据被从存储(比如硬盘)中读出。对于连续读文件操作,缓存管理器的预读功能可以带来明显的性能提升,因为在应用程访问哪些数据之前,数据已经被读入到系统内存里面。

在当一个文件以非缓存的形式打开的时候,对文件的读写都是非缓存的形式进行的,在操作系统中,将这种文件I/O的方式称为NonCachedIO,采用非缓存的形式进行文件的读写是不会涉及到文件缓存问题,处理相对简单,文件I/O的请求会直接通过文件系统驱动下发到相关的设备。当文件以缓存的方式进行文件的I/O操作时,情况就要复杂得多,不仅要考虑到缓存的问题,还要充分考虑到操作系统中内存管理的页错误,为了更好地分析带缓存文件I/O的具体情况,下面将针对读、写文件两种操作进行详细的分析。

当对带缓存的文件进行读操作时,当请求达到文件系统驱动时,如果是首次进行读操作,文件系统驱动将会调用缓存管理器的接口为文件进行缓存环境的创建,如果缓存已经创建完成则向缓存管理器发起读请求,如果文件读写的位置对应的段视图不存在,缓存管理器为创建相关的段视图。当段视图存在后,文件缓存管理器将会从段视图中复制数据到用户缓冲区。这时如果段视图对应的文件内容并未读入,缓存管理器将向内存管理器发起页错误,内存管理器向文件系统驱动发起分页I/O读请求,文件系统驱动在接到分页I/O的请求时,将会直接下发请求给下层驱动设备并等待请求返回,文件系统驱动将分页I/O的结果返回给内存管理器,内存管理器完成页面错误的处理,将文件内容加载到缓存系统中。实际上缓存管理器并不知道数据是否在缓存,而由缺页来协助完成数据引进,所以,每次数据都是从高速缓存被复制进用户空间的(1.本来就在缓存;2.由缺页处理复制进缓存)。缓存管理器从缓存中得到文件内容,复制到用户缓冲区中,将请求结果返回给文件系统驱动,文件系统驱动返回给I/O管理器,I/O管理器将结果返回给应用程序便完成了整个读请求。

0?wx_fmt=png

当进行带缓存的文件写操作时,其它的流程基本相同,只有部分区别。比如在文件写操作时,对段视图的操作与读请求时相反,是将用户缓冲区中的内容复制到段视图中。在处理页面错误时,内存管理器并不发起写请求,而是释放部分的物理页面,为指定的段视图对应的虚拟地址分配物理页面,缓冲管理器完成数据的复制后直接返回。整个写操作中并未直接将数据写到磁盘外存中,而是操作系统闲暇或者需要时,在段视图中的内容写入外设存储中。

0?wx_fmt=png

除此之外还有许多关系Windows缓存管理器的东西,比如:缓存里面包含了 Page CacheBuffer Cache,每一个 Page Cache 包含若干 Buffer Cache。内存管理系统和文件系统驱动只与Page Cache 交互,内存管理系统负责维护每项 Page Cache 的分配和回收,同时在使用内存映射方式访问时负责建立映射,而且映射也有很多讲究,这里不在做介绍。重点在强调一点的是,在Windows下,Page 的大小是一般都是4K。好了,关于Windows的缓存机制就介绍到这里,大家感兴趣其实可以去翻看我上述提到的书籍,我也是从该书里面拾取出来。

因此,Citrix利用Windows缓存管理器所提供的接口,通过在文件系统驱动之上开发Citrix相应的驱动,然后将原本发送到Windows环境下可能是本地硬盘的数据根据策略或者规则发往Citrix PVS、目标设备的RAM以及目标设挂载的本地硬盘中。同时调用缓存管理的机制实现PVS的目标设备RAMPVSvDisk之间以及与目标设备本地的缓存磁盘之间通过IO重定向、缓存重定向等等实现相互间的交互和协作。

实际上从这个角度来说,我认为Citrix PVS其实就是一个缓存,PVS是一个超级便宜的缓存,位于昂贵的存储系统和目标设备之间,目标设备想从存储系统读取数据就必须经过这个中间缓存的设备。从这个角度来看,PVS并不像我们所期望的那么神奇!Citrix PVS就是利用了Windows的缓存机制。