一、PVS是存储架构和网络计算架构



我们说Citrix PVS架构本质上是一个存储架构,是因为在Citrix PVS架构下,实现了计算和存储的分离。首先在传统的计算机上,计算资源和存储资源是同处于相同计算机内部的通过高速总线连接起来的组件,而在存储设备上,服务器本地的存储资源不在用于存储数据文件,存储数据文件的存储空间通过网络(TCP/IP or FC)传送到专门的存储控制器,由存储控制器来分配和管理这些元数据和IO,并最终将数据落地到硬盘空间存储起来。所以从原理出发,Citrix PVS就相当于存储设备中是存储控制器,其管理和分配用户计算资源所需的元数据资源,同时管理和下发数据IO到存储的硬盘上。

这种架构我们也可以将其称为网络计算模式或者分布式计算模式。网络计算模式把计算任务分布到各客户主机(PVS简称目标设备),而数据(系统数据和用户数据)集中存储于网络服务器中,实现了存储与计算的分离,部署在服务器中的系统数据将可以供网络中所有主机共享。但每个主机有自身的私有属性数据(如各种硬件的型号和主机SID、网络IP 地址和用户登录参数等),通过共享的系统数据和该主机的私有数据可以组合一个可启动的系统镜像,从而构建其计算环境。

不管是存储架构还是网络计算架构,其基本的一个特征都是将计算资源和存储资源进行有效分离。计算资源与存储资源相分离后,PVS服务器系统将二者之间的物理总线连接转换为网络实时连接,根据不同的应用需求实时地重新构建新的计算环境。PVS服务器弥补了传统分散计算环境的不足,具有资源动态映射、系统易于使用、管理维护简单等特点。同时,数据资源的集中存储使得管理员可以统一配置与管理原本分散的存储资源,同时提供了分散模式下所不具备的安全性。

 

二、Citrix PVSIO通路



基于计算资源和存储资源分离模型,PVS架构必须是:

1、         目标设备:本地没有任何存储资源(也可以有存储资源用于缓存)的计算机或者服务器,拥有计算资源所需的组件:比如CPU、内存和南北桥(IO)等计算资源,同时必须拥有NIC(网卡)设备。

2、         存储服务器:用于存放操作系统以及应用程序的存储空间。

3、         元数据管理服务器:负责管理目标设备和虚拟硬盘之间的映射关系,并管理目标设备、用户以及存储资源。

4、         PVS客户端虚拟硬盘:负责通过网络连接目标设备和网络存储设备中的虚拟硬盘,为每一个目标设备映射虚拟的硬盘空间。

5、         利用以太网网络将上述四个组件连接在一起构成PVS系统。

Citrix PVS架构中,PVS服务器集成了存储服务器和元数据管理服务器。在PVS客户端集成了目标设备和PVS客户端虚拟硬盘。因此在PVS中,其架构应该是前端PVS客户端设备—PVS服务器—VHDX虚拟硬盘。所以按照传统计算机的基本架构,我们可以认为PVS客户端设备包含了计算机的CPURAM资源,PVS服务器就是硬盘控制器合作存储控制器,VHDX虚拟硬盘就是传统存储数据的物理硬盘。只不过传统的IO通路被改变了。那么我们从后端往前端推演,将这条IO路径打通!

PVS架构下,操作系统是存在在一个虚拟硬盘里面的,这个虚拟硬盘利用的是微软的VHDX格式的虚拟硬盘。虚拟硬盘顾名思义它并不是一块真实的物理硬盘,并不需要我们增加额外的成本去购买,它仅仅是从一块物理硬盘分区中虚拟出来的一个硬盘,VHDX不同于传统硬盘的盘片、磁头和磁道,VHDX硬盘的载体是文件系统上的一个VHDX文件。如果大家仔细阅读VHDX文件的技术标准(微软在2005年公开了VHD格式文件的全部细节,可以从微软的TechNet网站下载Virtual Hard Disk Image FormatSpecification),就会发现标准中定义了很多CylinderHeadsSectors等硬盘特有的术语,来模拟针对硬盘的I/O操作。既然VHDX是一块硬盘,那么就可以跟物理硬盘一样,进行分区、格式化、读写等操作。因此,VHDX也是硬盘的一种,就像2.5寸、3.5寸、SCSISATAIDE等不同规格的硬盘一样,VHDX是在一个文件中的硬盘。CitrixPVS首先把操作系统和应用程序存放于VHDX虚拟硬盘中,而不是传统的HDD或者SSD硬盘上。当然最终还是存储在HDDSSD上。而基于VHDX虚拟硬盘的具体的技术实现方式非常复杂。举个例子来说,操作系统有硬盘系统和文件系统两部分,分别处理对硬盘的I/O读写指令(硬盘系统),和管理硬盘之上的分区、数据和文件格式(文件系统)VHDX是存在于文件之上的硬盘,可想而知它的技术实现必须横跨硬盘系统和文件系统这两部分。

和传统硬盘一样,在Citrix PVS上,要把VHD文件当作硬盘一样读写,必须有相应的驱动程序。在Windows开发出来了VHDX虚拟硬盘格式之后就在Windows的系统中内置了VHDX虚拟硬盘的驱动程序,所以基本上现在使用Windwos操作系统都可以无缝的接入VHDX的虚拟硬盘并和普通硬盘一样进行读写操作。因此,在基于Windows平台上安装配置Citrix PVS组件,对于下发SCSI命令到硬盘执行读写操作就可以利用Window自有的特性来进行。就类似于把PVS服务器系统当成了一台存储控制器来使用,并管理VHDX虚拟硬盘。

解决了操作系统在后端存储的空间问题之后,我们就需要了解PVS服务器到VHDX虚拟硬盘之间的IO通路问题。

在日常的PVS部署中,vDisk的存储VHDX虚拟硬盘一般都存储在:

1)块级存储;

2NAS存储(CIFS或在某些情况下NFS);

如果是PVS本地的块级存储,那么PVS服务器到本地硬盘之间的访问就是标准的计算机硬盘访问模式,通过总线和PVS内存进行数据交换。如果是NAS存储(CIFSNFS)的情况下,那么数据就会通过SMB协议进行传输,然后再传送到本地。从PVS服务器发送出去的是SCSI指令,对于SMB/NFS来说,就会通过SMB/NFS协议将SCSI指令打包,填上SMB的标签传输到VHDX虚拟硬盘,然后VHDX虚拟硬盘在接受到SCSI指令之后,解析并执行,并将所需的是数据块读取通过SMBNFS)协议返回给PVS服务器端。

数据块为什么会传递到PVS服务器呢?在Citrix PVS架构下,PVS服务器将存储控制器和元数据管理服务器合二为一,因此数据块应该传递给的是PVS内部的存储控制器模块。和传统的控制器阵列一样,这些数据块都首先传入控制器的缓存中,然后控制器再将调用TCP/IP协议栈将数据打包,分段,贴上IP标签,最后调用PVS服务器的以太网卡驱动程序,最后将数据发送到PVS网卡。PVS网卡会根据以太网的协议进行数据传输。

数据会传输到架构的最后一环:目标设备和PVS客户端虚拟硬盘。在目标设备上,我们说如果没有启动操作系统的时候,目标设备就是一台没有操作系统的计算机或服务器,该计算机或服务器没有本地系统硬盘。而PVS客户端虚拟硬盘呢?PVS客户端虚拟硬盘负责动态连接计算资源和存储资源,它以软件的方式为用户模拟虚拟的SCSI网络硬盘,将系统对网络硬盘访问的请求转化为对网络存储设备访问的网络协议请求包,从而为计算系统提供虚拟的存储空间。PVS客户端虚拟硬盘就是我们在部署了PVS系统之后,启动我们的目标设备,在系统的右下角,我们会看见一个PVS虚拟硬盘,该硬盘就是一台PVS客户端虚拟硬盘。

在拥有PVS客户端虚拟硬盘的目标设备上,首先是以太网卡接受到来自PVS服务器的数据,然后就是TCP/IP协议栈拆包,将数据最终发送到PVS客户端虚拟硬盘上。PVS客户端虚拟硬盘再根据传统计算机硬盘架构的模式,将数据首先通过缓存系统,然后传递回目标设备的RAM RAM将数据和指令发送到处理器,在那里将其处理为以屏幕更新的形式发送给用户的输出。这样用户在其显示器上就最终看见了其请求和内容和信息。

在这里Citrix没有披露一些关于PVS客户端虚拟硬盘的技术细节,因此暂不清楚其架构和实现原理。因此我只能做一些猜测。首先对传统集中式系统中的存储资源与计算资源间的数据通道进行分析。

0?wx_fmt=png

如上图所示,用户数据和存储设备分别处于存储IO通路的两端,而位于两者之间的文件系统、硬盘设备驱动和硬盘控制器层相当于道路里面的的通道。通过对该通道中某一层次的层间接口进行功能模拟,就可以获取对数据的控制权,从而实现数据访问的重定向。

0?wx_fmt=png

不管PVS客户端虚拟硬盘的技术细节是什么,其最终都是采用在靠近用户数据端的硬盘设备驱动级进行软件模拟,在系统内核中虚拟SCSI硬盘,该SCSI硬盘将对虚拟SCSI硬盘的I/O请求转化为网络硬盘请求与存储服务器上的VHDX虚拟硬盘进行数据交互。也就是说,这个SCSI硬盘是模拟来回后端PVSvDisk进行一个映射的虚拟硬盘文件,前端PVS目标设备对存储资源所做的操作,都会经由该软件模拟的SCSI硬盘传递给后端PVS真正的VHDX虚拟硬盘。

因此,Citrix PVS架构下,其前后端的IO路通是:在目标设备上用户通过相应的操作读取或者写入数据时,应用或系统会通过硬盘设备驱动访问虚拟的SCSI硬盘,硬盘驱动收到系统的I/O请求后对SCSI请求作出解析,并将请求通过一定的网络协议转发给后台的PVS服务器,由PVS服务器对该请求作出应答后将结果数据经由网络返回给主目标设备,再由目标设备端的虚拟硬盘驱动将数据以SCSI请求的格式返回给上层系统。


三、Citrix PVS的缓存和IO管理



Citirx PVS将计算资源和存储资源分离之后,让大家共享同一个单一的操作系统镜像文件,那么它是如何去让大家共享这个操作系统文件的?这是关键点一。

同时,由于目标设备没有本地物理硬盘等存储设备,目标设备必须通过网络动态按需从PVS服务器端加载操作系统和应用程序的指令和数据,目标设备在动态加载指令和数据的过程中会产生大量访问虚拟硬盘的I/O请求,这些I/O请求通过什么机制来管理。这是关键点二。

我认为,说明白了理解清楚了这两个关键点,再结合上述IO通路,大家也就明白了PVS的工作机制。因此,我将详细探讨PVS的这两个关键点。

我们说如果将一个操作系统共享给所有的人一起使用,所有的用户就相当于具有管理员权限,因此用户可以对操作系统上的所有文件进行读、写、修改的任何操作,这会造成当某个用户误删或者无意修改了某个系统文件的时候,会导致系统崩溃;在操作系统文件系统中,由于共享文件系统意味着临时文件目录也被共享,PVS目标设备的程序在运行时也会动态创建相应的临时文件,所以当不同PVS目标设备运行同一个程序时就会产生数据不一致性的问题,从而导致程序在运行时会出现问题。为了解决存在的数据不一致性问题,PVS为每个用户提供了一个用户缓存空间,该空间是缓存用户对系统做出的修改以及创建的临时文件的存储空间,并且强制性必须将用户特定的文件移动到该用户的私有存储区。这样就可以使得所有用户共享的操作系统部分处于只读状态,而每个用户针对其所创建的临时文件和修改的操作,都保存到用户的缓存空间中,从而解决因用户修改了系统或运行相同应用所带来的系统崩溃或数据不一致性问题。

这就是PVS利用缓存系统解决大家共享同一个单一的操作系统镜像文件的问题。这个用户缓存空间也就是Citrix PVSWrite Cache盘的由来。但是,Citrix PVSWrite Cache盘并不仅仅是用于缓存用户的临时文件或者对系统的修改,还应该缓存Windows的虚拟内存。

同时,Windows操作系统本身,也会存在一个缓存系统。该缓存系统介于内存和硬盘之间,主要是作为缓冲,屏蔽硬盘和内存之间的读写速度的差异性。

Windows用于文件页面映射和缓存文件的内存区域称为系统缓存。系统缓存通常称为Windows操作系统的文件缓存。如果文件在内存中缓存,那么处理器在加载数据的时候,就直接从RAM调用。 下图说明了当用户第一次从硬盘(如Microsoft Word)启动应用程序时,Windows文件缓存如何工作。

0?wx_fmt=jpeg

如上图所示,首次从硬盘读取文件时,将其复制到系统缓存中。 当文件被加载到用户缓存空间中时,该应用程序的数据就从系统高速缓存空间被调用或映射给RAM。当用户关闭应用程序时,该文件的虚拟块级文件数据仍然存在于系统高速缓存中。只要有足够的空闲物理内存,该文件将保留在内存缓存中一段时间。因此,对于文件的后续启动或读取请求,Windows将直接从内存加载文件,而不是从磁盘读取。类似这种系统级的缓存机制为计算机运行提供了巨大的性能改进。

下图说明了即使在文件已关闭之后,读取文件的后续请求还是从系统缓存提供,而不是从硬盘读取。

0?wx_fmt=jpeg

而我们知道,在制作PVS镜像模板的时候,需要制定系统的虚拟内存空间的地址和路径。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。在一个Windows系统上,其内存架构往往是这样的:

0?wx_fmt=png

硬件保留、正在使用、已修改、备用和可用(自由)几个部分。

在使用中(硬件保留+使用中):这里是内存核心区域,需要小心,这里运行着系统必备的代码。

缓存(修改+备用):这里就是系统的缓存数据,其通过高速缓存文件置换机制来进行这些缓存进行处理。而这些经过置换出来的缓存文件不会立即就丢弃掉,而是将其置换出来放置在系统的虚拟内存当中。

可用或自由使用的:这是没有使用的内存空间。

在上一篇文章的当中,有位朋友问我虚拟内存和PVS的缓存是什么关系?这就是我写这部分Windows缓存所要解释的问题。上述以及解释了Windows缓存和虚拟内存的关系,接下来还需要继续说明一些概念,以帮助大家理解。

首先我们需要讲页面文件。分页是一种内存管理技术,通过它,系统可以从硬盘中检索频繁访问的数据并存储在内存中使用。操作系统是从页面的块中检索来自该硬盘的数据。因此,页面文件本质上是一个“页面”的集合,这些页面存储在硬盘上。虚拟内存的这种扩展很重要,因为它允许操作系统利用硬盘来存储可能不适合内存的数据,从而提高性能并防止应用程序崩溃。页面文件还允许进程的物理地址空间是非连续的(防止诸如碎片和其他问题之类的事情),但这是关于分页和内存分段的,本文中不做讨论。暂且了解了一些页面文件和虚拟内存的概念之后,我想说明的是,在PVS架构下,使用虚拟内存的页面文件技术,就会有利于提高PVS的缓存策略以及缓存的命中率。

PVS本身也通过缓存机制来缓存目标设备和PVS服务器之间的读写差异性。

由于PVS目标设备没有存储资源。操作系统、应用程序和数据都集中存储在服务器上。服务端发送给不同PVS目标设备的I/O数据内容大部分是重复的,并且不同PVS目标设备会对服务端产生大量回写,这些并发I/O操作大大增加了PVS服务器的网络负载,从而延长了PVS目标设备I/O请求的响应时间。因此Citrix针对现有的PVS架构,设计了基于PVS的这个场景下的缓存机制:

1)、基于PVS服务器的Cache

2)、基于PVS目标设备的Cache

服务端Cache位于PVS服务器上,针对CitrixPVS环境中不同PVS目标设备对同一镜像文件的读取内容大部分是重复的这个特点,为服务端上的所有虚拟磁盘镜像文件设置独立Cache,通过改进Cache管理策略提高对共享数据在Cache中的命中率,加快系统对VS目标设备读请求的响应时间。也就是说,PVS一般都会将PVS目标设备在系统启动时所需的启动的几百兆文件数据到拷贝进内存或缓存中,然后加快PVS目标设备在远端请求启动系统的速度。通过这个服务器端的缓存策略,就可以很好的解决PVS目标设备对于PVS服务器大量重复的读IO请求。

PVS目标设备的Cache主要是设置在PVSWrite Cache盘上,其系统在初始化时会请求分配Write Cache盘上一组连续的存储空间。即在每个PVS目标设备的虚拟硬盘驱动层设置一个彼此独立的Cache策略,来减少不同PVS目标设备对服务器端的I/O请求。因为该策略会将经常需要去PVS服务器读取的数据缓存到Write Cache盘上的缓存空间,当用户下次还需要数据时,直接从PVS目标设备的Write Cache盘上的缓存空间拷贝到PVS目标设备的RAM中运行。

Write Cache盘在PVS架构下可以放置在PVS服务器以及PVS目标设备的本地或者内存中。它放置的位置对于PVS本身的缓存机制也有一定的影响。如下图所示:

0?wx_fmt=png

如果利用PVS目标设备的一部分RAM作为PVS的缓存,那么其效果将会是极大的降低存储的IOPS