Citrix PVS架構和工做原理緩存
Citrix PVS產品一直在Citrix的產品體系中存在着重要的位置,在中大型的VDI環境中,絕大部分都是基於PVS架構部署的,足以證實PVS架構的穩定、高效和便捷。安全
本文從底層架構和原理的角度分析了Citrix PVS組件,使得咱們可以得窺PVS架構穩定、高效和便捷的背後,支撐的機制究竟是什麼?服務器
Citrix Provisioning Services組件簡稱Citrix PVS,是經過建立一個標準的虛擬機鏡像,該鏡像就如同一個虛擬磁盤同樣,裏面包含了虛擬機的配置信息以及操做系統,並將其存儲在PVS服務器或網絡中的存儲空間中。同時PVS對該虛擬磁盤進行管理,將其分發給用戶的目標設備所使用。用戶在使用的時候,此標準鏡像經過流傳輸到服務器或桌面目標設備中。PVS流技術推送技術將單個共享磁盤鏡像實時地置備或從新置備計算機。這樣將使管理員徹底不須要管理和修補各個系統。全部鏡像管理均在主映像上完成。每一個系統的本地硬盤能夠用來實現運行時數據緩存,在某些狀況下,還能夠徹底從系統中移除,從而下降電力消耗、系統故障率和安全風險。網絡
Citrix PVS技術起源於無盤技術,而無盤技術最先是Novell Netware3.11或NovellNetware 3.12做服務器的操做平臺,工做站以IPX方式登陸。當時咱們稱它爲IPX無盤網絡,主要是用於教學網絡,應用程序主要以DOS爲主。從1996年至1999年,以RPL方式登陸的無盤網絡佔絕大多數,服務器端能夠選擇Novell Netware 4.1或Windows NT 4.0 Server,在此期間,因爲微軟的大力支持,在它的Windows 95產品系列中,推出了網絡版的Windows 95即所謂的徹底版,它包含了網絡安裝命令Netsetup,以後的幾年RPL幾乎成爲了無盤網絡的代名詞。以後,Intel推出PXE技術,叫作PXE遠程無盤引導技術,配合Qualystem公司的LiteNet,最初選用臺灣DTK公司的E-Terminal,成功地實現了Windows98的遠程啓動和運行,並使可靠性和穩定性都大大提升。Windows 98的各類應用軟件只需經過簡單的幾個步驟便可加到無盤工做站上,並可隨時升級和擴充,其簡便的安裝方式和構架,很快獲得了業內人士的承認,並普遍流行起來。架構
PXE是RPL的升級品,RPL是Preboot Execution Environment的縮寫,意思爲預置啓動環境。它們的不一樣之處在於RPL是靜態路由,而PXE是動態路由。其通訊協議採用TCP/IP,與Internet鏈接高效而可靠。相似RPL、PXE以及BOOTP等都是遠程啓動協議,如今的Windows已經再也不支持RPL這類比較老的協議了,目前在Citrix PVS架構下用到的協議就是PXE或BOOTP這兩個協議。至於這兩個協議有什麼區別?工做原理是什麼?本文暫且不表,待後續有時間再單獨說明或者讀者本身去網上查找相關資料瞭解。ide
說道Citrix PVS的架構,其本質上就是存儲的架構,裏面還包含了Windows的緩存機制、硬盤控制器的機制和遠程啓動協議等內容集成組合而成的一個構思巧妙的產品。在這裏,我想必須從計算機的基本原理開始提及。咱們得理解在傳統的筆記本或者臺式機上,咱們計算機的基本工做流程,而後展開PVS架構以後,咱們才能更清晰的明白PVS的架構和工做原理。函數
以下圖所示,在一臺計算機內部,咱們的操做系統首先是須要安裝在計算機上的硬盤上,而後,硬盤由計算機主板上位於南橋(IO橋)上的硬盤控制器管理。處理器不會直接跟硬盤進行通信,而是經過硬盤控制器來進行。性能
在傳統的計算機硬盤架構中,輸入(例如鍵擊或鼠標點擊)被傳遞到服務器並存儲在計算機的RAM上。而後處理器須要將這些數據按照指令進行處理,完畢以後寫回內存。若是指令有將數據存儲到硬盤的要求,處理器則根據指令請求硬盤控制器; 硬盤控制器響應處理器的請求,經過DMA的方式將內存地址的這些數據傳遞到硬盤中。同時,若是用戶還須要產生輸出的操做,那麼硬盤找到所請求的數據,而後將其傳遞到硬盤控制器,硬盤控制器傳遞迴RAM。 RAM將數據和指令發送處處理器,在那裏將其處理爲以屏幕更新的形式發送給用戶的輸出。spa
以上就是大致的硬盤輸入輸出數據的流程。操作系統
接下來咱們詳細解釋下上述的流程:首先這個鍵盤的驅動程序會將輸入的數據向操做系統申請RAM空間來進行存儲,而後將輸入的數據存入到給到的內存地址空間當中;而後咱們計算機的外設(鍵盤或者鼠標)就須要經過一箇中斷信號給處處理器讓其去處理當前這個中斷事件。固然外設在發起中斷以前,須要有操做系統容許,當知足了中斷條件以後,處理器就會響應中斷,轉入中斷程序處理。中斷程序裏面告訴了處理器須要去內存的那個地址段執行操做。這裏中斷是指當外設須要與處理器進行信息交換時,由外設向處理器發出請求信號,使處理器暫停正在執行的程序,轉去執行數據的輸入/輸出操做,數據傳送結束後,處理器再繼續執行被暫停的程序。在計算機基本架構中,傳統的外設好比鍵盤/鼠標輸入等外設就須要採用中斷方式和處理器進行信息交互。好比電話響了->放下書本->接電話->繼續看書這一個過程,就相似於處理器中斷的處理過程。
上述咱們說,鍵盤經過中斷的方式讓處理器去處理輸入到內存中的數據。處理器在響應中斷以後,處理器所要作的工做就是將當前內存地址中的這段數據讀出來,根據操做指令稍加改動或者根本不動,而後又寫入到內存的其餘地方去。若是操做指令是須要寫入到硬盤上,那麼操做系統在寫入到其餘內存空間以後,處理器會像硬盤控制器發起一個存儲的請求,告知硬盤控制器在內存的某個地址段的數據須要存儲到硬盤上。硬盤控制器在接受到了這個處理器的請求以後,會這個請求翻譯轉換爲SCSI指令下發到硬盤(硬盤只認識SCSI指令),硬盤接受到SCSI指令以後,經過其自帶的硬盤故固件代碼解析SCSI指令,獲取到內存地址段的信息,而後直接經過DMA和內存進行數據讀取請求。DMA方式是在存儲器和外設之間、存儲器和存儲器之間直接進行數據傳送(如磁盤與內存間交換數據、高速數據採集、內存和內存間的高速數據塊傳送等),傳送過程無需CPU介入。
這個過程就沒有CPU的參與,硬盤將數據讀取出來存儲到自己的存儲空間以後,數據輸入的過程就完畢了。可是若是用戶的鍵盤輸入是給Word應用程序進行輸入或者是經過QQ回覆消息,那麼以上的過程就又有所不一樣了。
若是是在編輯Word應用程序的時候進行的輸入操做,那麼CPU在執行完畢以後,是不會直接將其聯繫硬盤控制器保存到硬盤上的,而是經過Windows的API保存到緩存文件夾中。
總之一句話,在傳統的計算機硬盤架構中,用戶的輸入首先傳遞到計算機的RAM,而後再由處理器處理以後經過處理器聯繫硬盤控制器,由硬盤控制器傳遞給硬盤存儲。讀也是相似的,全部的讀請求先經過處理器,有處理器請求硬盤控制器,硬盤控制器去發送讀取指令給到硬盤,而後由硬盤和內存之間進行數據交換,將數據置換到內存或者緩存中後,再經過處理器調用相應的函數(投影到用戶的顯示器上仍是輸出到網卡)。
在PVS體系結構中,輸入(例如擊鍵或鼠標點擊)會傳遞到目標設備,並存儲在目標設備的RAM中。與傳統硬盤架構不一樣,來自硬盤驅動器的指令請求發送到目標設備上的NIC。而後PVS將請求發送到硬盤控制器,那麼很顯然的,在PVS這種架構下,硬盤控制器不在是操做系統中的那個硬盤控制器,而是PVS服務器。而後,PVS服務器從存儲設備找到該目標設備的相應硬盤(虛擬磁盤),並轉發該數據請求。在硬盤上找到正確的數據後,發送回PVS服務器,而後PVS服務器發送回目標設備上的NIC。該數據被髮送回目標設備的RAM,而後以屏幕更新的形式被處理成輸出。
其流程以下圖所示:
通過上述的比較,咱們大致能夠知道,PVS就是放大版的硬盤控制器,而咱們的vDisk就是傳統計算機的硬盤。CitrixPVS架構就是將傳統計算機的硬盤和硬盤控制器獨立出來,而後硬盤你們共享,全部的讀寫操做都由PVS這臺硬盤控制器來進行控制。
在目標設備和PVS服務器之間創建通信鏈路,經過遠程的協議將CPU內存和遠端的硬盤以及硬盤控制器鏈接起來,而後目標設備運行的時候,經過該鏈路去讀取遠端的操做系統,PVS會將包含系統內核loader及壓縮過的內核傳遞到目標設備,這個系統內核文件在目標設備內存模擬成磁盤,從這個模擬磁盤啓動。當咱們由讀寫IO時,首先讀寫IO都會存儲在目標設備的RAM中,通常地,操做系統都會有緩存機制,將這些IO數據置換出來存放於緩存文件中。那麼這就涉及到了Windows系統的緩存機制。
在這一塊,咱們要完全地明白PVS的目標設備數據從RAM到PVS的vDisk之間以及目標設備本地的緩存磁盤之間是如何進行相互協做的?咱們就不得不去了解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管理器將結果返回給應用程序便完成了整個讀請求。
當進行帶緩存的文件寫操做時,其它的流程基本相同,只有部分區別。好比在文件寫操做時,對段視圖的操做與讀請求時相反,是將用戶緩衝區中的內容複製到段視圖中。在處理頁面錯誤時,內存管理器並不發起寫請求,而是釋放部分的物理頁面,爲指定的段視圖對應的虛擬地址分配物理頁面,緩衝管理器完成數據的複製後直接返回。整個寫操做中並未直接將數據寫到磁盤外存中,而是操做系統閒暇或者須要時,在段視圖中的內容寫入外設存儲中。
除此以外還有許多關係Windows緩存管理器的東西,好比:緩存裏面包含了 Page Cache和Buffer Cache,每個 Page Cache 包含若干 Buffer Cache。內存管理系統和文件系統驅動只與Page Cache 交互,內存管理系統負責維護每項 Page Cache 的分配和回收,同時在使用內存映射方式訪問時負責創建映射,並且映射也有不少講究,這裏不在作介紹。重點在強調一點的是,在Windows下,Page 的大小是通常都是4K。好了,關於Windows的緩存機制就介紹到這裏,你們感興趣其實能夠去翻看我上述提到的書籍,我也是從該書裏面拾取出來。
所以,Citrix利用Windows緩存管理器所提供的接口,經過在文件系統驅動之上開發Citrix相應的驅動,而後將本來發送到Windows環境下多是本地硬盤的數據根據策略或者規則發往Citrix PVS、目標設備的RAM以及目標設掛載的本地硬盤中。同時調用緩存管理的機制實現PVS的目標設備RAM和PVS的vDisk之間以及與目標設備本地的緩存磁盤之間經過IO重定向、緩存重定向等等實現相互間的交互和協做。
實際上從這個角度來講,我認爲Citrix PVS其實就是一個緩存,PVS是一個超級便宜的緩存,位於昂貴的存儲系統和目標設備之間,目標設備想從存儲系統讀取數據就必須通過這個中間緩存的設備。從這個角度來看,PVS並不像咱們所指望的那麼神奇!Citrix PVS就是利用了Windows的緩存機制。