專利名稱:一種對操作系統(tǒng)透明的處理器資源整合利用方法
技術領域:
本發(fā)明主要是涉及硬件虛擬化技術以及多處理器體系結構,將分散的通過 在多個服務器上的處理器資源加以整合利用,尤其是涉及一種對操作系統(tǒng)透明的 處理器資源整合利用方法。屬于計算機技術領域。(二) 背景技術1.服務器的設計與部署當前服務器的設計和部署呈現(xiàn)兩個趨勢縱向擴展(scale-up)和橫向擴展 (scale-out)??v向擴展指的是將多個處理器和存儲器等系統(tǒng)資源緊密耦合在單 個服務器中,對其整體系統(tǒng)能力的擴展是通過在單個服務器中增加處理器和內存 等資源來實現(xiàn)。scale-up系統(tǒng)呈現(xiàn)的是單一系統(tǒng)映像,具有簡單易用的編程模 型,易于管理和維護,但存在成本偏高、可擴展性有限。橫向擴展是指將多臺小 規(guī)模的中低端服務器松散連接成一個服務器系統(tǒng),對其整體系統(tǒng)能力的擴展是通 過在系統(tǒng)中增加相同或類似配置的中低端服務器結點來實現(xiàn)。scale-out系統(tǒng)具 有實現(xiàn)成本低、可擴展性好等優(yōu)勢,但不對上呈現(xiàn)單一系統(tǒng)映像,編程復雜,管 理和維護也較復雜。因此,如何能夠在成本低、可擴展性好的scale-out系統(tǒng)基 礎上實現(xiàn)scale-up系統(tǒng)所呈現(xiàn)的單一系統(tǒng)映像以及可編程性好,易管理的特征 是一個很值得研究的問題。2.硬件虛擬化技術虛擬化技術通過虛擬機監(jiān)控器(Virtual Machine Monitor,簡稱VMM, 也稱作hypervisor,在本文中VMM和hypervisor指的是同一概念)可以將底 層的硬件資源加以抽象來呈現(xiàn)給客戶操作系統(tǒng),從而可以隱藏底層硬件真正的細 節(jié),為客戶操作系統(tǒng)虛擬出一個硬件層。因為軟件虛擬化技術的種種難以克服的 缺點,CPU廠商推出了基于CPU的硬件虛擬化技術。支持虛擬技術的CPU帶有 特別優(yōu)化過的指令集來控制虛擬過程,通過這些指令集,VMM會很容易提高性 能,相比軟件的虛擬實現(xiàn)方式會很大程度上提高性能。硬件虛擬化技術可提供基 于芯片的功能,借助兼容VMM軟件能夠改進純軟件解決方案。由于虛擬化硬件 可提供全新的架構,支持操作系統(tǒng)直接在上面運行,從而無需進行二進制轉換, 減少了相關的性能開銷,極大簡化了VMM設計,進而使VMM能夠按通用標準 進行編寫,性能更加強大。一個使用硬件虛擬化的虛擬機架構負責為多個客戶操作系統(tǒng)系統(tǒng)提供硬件 支持,同時保證各個客戶操作系統(tǒng)的安全性,高效性以及資源的隔離性。硬件虛 擬化架構在虛擬機監(jiān)控器(VMM)和客戶操作系統(tǒng)之間快速切換的機制,有選 擇的截獲客戶操作系統(tǒng)中的指令和行為的能力,DMA對內存存取操作的保護, 對中斷處理以及虛擬中斷的支持,提供標有guest/host標記的TLB以減少虛擬化 的負擔等等。硬件虛擬化架構定義了一個異常行為集合,該集合包括所有可能影響 hypervisOT或客戶操作系統(tǒng)的指令或事件,通過截獲該集合中的異常行為來進行 相應操作。相對于在x86體系結構下的最高特權級是ring0級,硬件虛擬化架構定 義了一些新的指令、寄存器以及控制域來實現(xiàn)一個更高特權級的模式,該特權級 也被稱為"ring-l" (AMD)級或者"非根模式"(Intel)。同時,硬件虛擬化架 構還定義了虛擬機控制結構體,(對于AMD的SVM架構來說是Virtual Machine Control Blocks(VMCB),對于Intel的VT架構來說是Virtual Machine Control Struct(VMCS)),該結構體用于對異常行為的控制,并且不允許在處理器核心之 間共享,它控制著虛擬機監(jiān)控器和客戶操作系統(tǒng)的切換。硬件虛擬化技術引入了一些新的指令。用來運行一個客戶操作系統(tǒng),管理客 戶操作系統(tǒng)的狀態(tài)信息,實現(xiàn)客戶操作系統(tǒng)同hypervisor的交互等等。 hypervisor通過建立正確的虛擬機控制結構體,運行特定指令初始客戶操作系統(tǒng) 的運行??蛻舨僮飨到y(tǒng)初始完畢后,會一直運行到下一次VMEXIT條件發(fā)生,此 時控制權返回到hype「visor。發(fā)生VMEXIT時,客戶操作系統(tǒng)的狀態(tài)信息,包括
發(fā)生VMEXIT的原因,都存放在了虛擬機控制結構體的狀態(tài)域中。Hypervisor從 虛擬機控制結構體中獲取被截獲的指令或行為,通過模擬、忽略或者改變執(zhí)行方 式的方法來進行相應操作,進而更新虛擬機控制結構體的相關狀態(tài)信息。系統(tǒng)開 發(fā)人員可以自行規(guī)定hypervisor對客戶操作系統(tǒng)監(jiān)管的程度,這是通過設置產生 VMEXIT的條件的規(guī)模來決定的。針對每一種VMEXIT條件,hypervisor都必須有 相應的處理程序來實現(xiàn)在客戶操作系統(tǒng)中該條件想要的結果,然后將該結果轉化 為適當?shù)男问綄懭胩摂M機控制結構體,進而在客戶操作系統(tǒng)進入時返回給客戶操 作系統(tǒng)。3.現(xiàn)有的利用多機處理器資源的方法(1) 進程遷移方式以M0S1X為代表的系統(tǒng)通過實現(xiàn)進程遷移來利用多物理服務器的處理器資 源。MOSIX系統(tǒng)采用給Linux內核打補丁的形式,實現(xiàn)了系統(tǒng)級透明的進程遷 移功能。其把一個進程分為用戶級上下文(Remote:遠程)和系統(tǒng)級上下文 (Deputy:代理)這兩部分。Remote是針對進程在用戶態(tài)的封裝,Deputy 則是針對進程在內核態(tài)的封裝l"]。 Deputy包括進程系統(tǒng)上下文具有物理服務器 依賴性的那部分,因此是不能被遷移的。MOSIX是通過擴充Linux內核實現(xiàn)的。 這種進程遷移的方式的一個優(yōu)點是可伸縮性比較強,但這種方式也有很多 缺陷。首先,這種通過進程遷移的方式并不是真正意義上的單一系統(tǒng)映像,上層 用戶以及操作系統(tǒng)看到的硬件資源仍然只是本地資源,并沒有形成全局統(tǒng)一的資 源視圖和調度能力。其次,MOSIX進程遷移機制是需要有存根在源物理服務器 上的,大量的進程遷移會造成系統(tǒng)的不穩(wěn)定。最后,MOSIX需要修改操作系統(tǒng)。(2) 特殊硬件方式以舊M的cc-NUMA為代表的系統(tǒng)通過定做一些特定的硬件并配以相應的 軟件來實現(xiàn)單一系統(tǒng)映像。在硬件方面,每個物理服務器具有一個MCU卡和一 塊Opium卡,用于實現(xiàn)跨物理服務器的內存共享,統(tǒng)計應用相關的內存訪問特 征。在軟件方面, 一是擴展BIOS,增加的部分稱為eBIOS。 eBIOS將四個獨立 物理服務器配置成一個16路的cc-NUMA系統(tǒng)。二是修改windows NT的硬件 抽象層(HAL)以支持遠程處理器間的中斷,以及提供遠程l/0設備和端口的訪 問機制。三是將資源抽象成多個資源集,線程可以和某個資源集相綁定[9。這種方法的優(yōu)點是通過硬件實現(xiàn)以后,系統(tǒng)在資源親和性方面比較好,使得 系統(tǒng)的效率比較高。該方法的不足之處在于,首先,通過專有硬件卡實現(xiàn),通用 性不夠,成本較高。其次,不能進行系統(tǒng)級的資源調整,透明性不好。(3) 基于Host OS的軟件虛擬化方式這種方式以東京大學開發(fā)的Virtual Mutiprocessor系統(tǒng)為代表。在這種系 統(tǒng)中,每個物理服務器都存在Host〇S,在Host OS的支持下實現(xiàn)虛擬機監(jiān)控 器(VMM), VMM運行在用戶態(tài),從而無須修改主機操作系統(tǒng)。對于客戶操作 系統(tǒng)采用半虛擬化技術,需要對客戶操作系統(tǒng)進行修改。VMM將一個或多個虛 處理器映射到一個物理處理器[6)。系統(tǒng)為每一個虛擬處理器配備兩個進程, 一個 用來模擬虛擬處理器,另一個用來監(jiān)控虛擬處理器,當遇到特權指令時,監(jiān)控進 程便要執(zhí)行相應的操作。該方法的優(yōu)點是實現(xiàn)了對客戶操作系統(tǒng)來說實現(xiàn)了單一系統(tǒng)映像,并且可以 形成全局虛擬處理器視圖。但其缺點也是比較明顯的,首先該系統(tǒng)需要修改客戶 操作系統(tǒng)。其次,采用用戶進程來模擬虛擬處理器的方法效率很低。(4) 無Host OS的軟件虛擬化方式基于Intel IA-64架構的vNUMA系統(tǒng)采用了一種由半虛擬化方法的改進的 稱為預虛擬化的方法,在對客戶操作系統(tǒng)進行構建的時候,采用半自動的方法將 敏感指令打包成對VMM的調用,在成功模擬敏感指令的同時避免對操作系統(tǒng)源 代碼的大量修改。對于特權指令,為了保證VMM不可被繞過,客戶操作系統(tǒng)被 轉移到非特權級運行,此時特權指令會被捕獲,VMM從內存中讀取并解碼引起 異常的指令,并在相應的虛擬機上模擬該指令執(zhí)行的效果。對于敏感非特權指令, 采用預虛擬化的技術達到虛擬化的目的。這些敏感非特權指令必須被替換成可以 引發(fā)異常的代碼或代碼段。該系統(tǒng)的優(yōu)點是在硬件之上直接實現(xiàn)VMM,脫離了 Host OS的支持,執(zhí)行效率較高,并且可以實現(xiàn)單一系統(tǒng)映像,客戶操作系統(tǒng)對 全局資源可見。缺點是該系統(tǒng)也需要修改客戶操作系統(tǒng),并且該系統(tǒng)是基于Intel
安騰架構的,而不是通用的x86處理器架構,應用受到一定限制。
發(fā)明內容1目的本發(fā)明提供了一種對操作系統(tǒng)透明的處理器資源整合利用的方法,它實現(xiàn)了 跨物理服務器的處理器虛擬化系統(tǒng)。通過在多個物理服務器之上部署基于這種處 理器資源整合利用方法的虛擬機監(jiān)控器,使得上層客戶操作系統(tǒng)可以在物理服務 器集群上運行,透明地使用分散在多個物理機器中的處理器資源。2技術方案一種對操作系統(tǒng)透明的處理器資源整合利用的方法,其具體步驟如下 步驟l:在各個物理服務器上生成虛擬處理器。在每個結點上,我們采用硬 件虛擬化技術來實現(xiàn)處理器的虛擬化。根據(jù)硬件虛擬化的規(guī)范,通過在虛擬機監(jiān) 控器(VMM)和客戶操作系統(tǒng)之間快速切換的機制,在每個結點上對虛擬處理 器的控制結構進行初始化,同時建立虛擬處理器和物理處理器的初始對應關系。然后,對每個虛擬處理器,設置hypervisor對客戶操作系統(tǒng)監(jiān)管的程度,劃分 敏感指令集。這樣,虛擬處理器初始化完畢后,當客戶操作系統(tǒng)執(zhí)行到這些指令 的時候,就會發(fā)生VM退出,控制權轉移到底層的虛擬機監(jiān)控器。步驟2:對各個結點的虛擬處理器信息進行采集。每個結點上生成的虛擬處 理器都要提供給上層的客戶操作系統(tǒng),因此系統(tǒng)中每一個物理服務器都必須了解 全局的虛擬處理器分布情況。這里通過將各個物理服務器所提供的虛擬處理器數(shù) 量寫成配置文件,在各個結點的hypervisor中讀取該文件,這樣各個結點一開 始就知道整個系統(tǒng)的虛擬處理器的分布情況。同時,有時候可能由于特殊原因, 某個結點實際提供的虛擬處理器數(shù)目可能不同于并沒有按照配置文件記錄的數(shù) 目(這種情況極少發(fā)生),各個物理服務器在創(chuàng)建完虛擬處理器后,必須告訴其 他物理服務器其是否成功創(chuàng)建了指定數(shù)目的vcpu,如果沒有,那么各個物理服 務器需要修正vcpu分布信息。步驟3:對虛擬處理器資源信息進行整合與管理。通過前面對虛擬處理器信
息的采集,hypervisor已經知道了虛擬處理器在各個幾點的分布情況。這樣,每 個結點都保存一份全局的虛擬處理器分布表。接下來需要對全局的虛擬處理器進 行管理,對于跨物理服務器條件下虛擬處理器的組織,采用的原則是對于那些 guest引發(fā)的相關操作進行全局范圍統(tǒng)一管理,對于hypervisor直接掌控的相 關操作則分服務器單獨管理。對于虛擬處理器標識的管理,采用的方法如下虛 擬處理器資源整合系統(tǒng)中基于以下四個比較重要的標識。(1) vcpu—id,用于在 hypervisor中管理虛擬處理器;(2 )vlapic Jd ,用于向guest提供虛擬的apicid; (3) vpu一icLglobal標識,代表當前虛擬處理器在全局環(huán)境下的邏輯id,從 guest的角度看來,vcpu Jd—global就是其所擁有的處理器在全局層面的邏輯 id。 (4) node—id,代表該物理服務器在全局范圍內的邏輯標識。首先要為每個 結點指定一個結點號nodejd,其中結點號為0的結點為主結點。然后為每個 虛擬處理器分配一個邏輯的vcpu—id,從0開始計數(shù),并且服務器內的vcpuid 是連續(xù)分配的。對于虛擬處理器的vpujd—global標識,通過計算該虛擬處理 器在全局的序號來指定。我們將虛擬處理器所在的物理服務器信息反映到 vlapic—id中,以便可以迅速的定位該虛擬處理器。同時,為了使得虛擬處理器 可以在物理處理器上遷移,我們的虛擬處理器不進行多核結構的設置。所以將 8bit的虛擬處理器的vlapicjd域分為兩個部分,低三個bit用來標識該vcpu 在本服務器內的序號,這個序號在數(shù)值上等于其vcpujd。高五個bit用來標識 該虛擬處理器所在的服務器號。步驟4:確定對虛擬處理器信息的獲取方式。根據(jù)vcpu的管理方法,其 nodejd, vcpu—id, vlapic—id是可以通過計算得到的。例如計算vlapic—id 采用如下方法vlapic—id= —!'t/ << 3 + vcpw」c/ ( 1 )對于所在的物理服務器號為t的vcpu來說,其vcpu—id—global的計算方 式如下,其中vcpu—nr (i)是服務器i上的vcpu數(shù)量vcpuid—gl obal = 2 vc/nz —"廠(/) + vcpu_id( 2 ),.=o獲取某個虛擬處理器所在的物理服務器號采用下面的方法node—id= vlapic—id》3 (3)另外,我們還在每個服務器上維護了一個全局的虛擬處理器資源信息表,某 些不能通過計算得到的信息,例如虛擬處理器的dfr信息等,需要通過查表得到。步驟5:將虛擬處理器信息向guest進行呈現(xiàn)。全局的虛擬處理器資源就是 guest能夠使用的處理器資源,我們需要guest能夠正確的識別到這些虛擬處理 器,并能夠正常初始化它們。在這里為guest提供整合后的虛擬處理器資源信 息,主要是根據(jù)虛擬處理器的分布情況,制作基于多處理器規(guī)范的MP表以及基 于ACPI規(guī)范的acpi表,并將其放到guest的內存區(qū)域的適當位置,目的是在 guest啟動的時候通過讀取這些表項感知其所擁有的處理器資源信息。對于MP 表,主要是修改Processor Entries,為每個虛擬處理器生成一個Processor Entry。對于ACPI表,主要是修改Multiple APIC Description Table (MAD丁) 的Processor Local APIC Structure,還要根據(jù)虛擬處理器信息制作 processor_obj'ects表項。將這些表項寫入guest的內存,并索引到MP規(guī)范 和ACPI規(guī)范的頭部區(qū)域后,guest啟動時便可以讀到這些虛擬的處理器信息, 從而對占有的處理器資源有一個概況。至此,hypervisor層對于虛擬處理器資源信息的準備工作已經完畢,接下來就是啟動客戶操作系統(tǒng),并在其執(zhí)行過程中對其行為進行模擬。步驟6:對guest多處理器啟動過程進行模擬。為了讓客戶操作系統(tǒng)能夠真正感知并使用底層分散在各個物理服務器中的虛擬處理器資源,還要對guest的多處理器啟動過程進行跟蹤和模擬。Guest首先讀取MP和ACPI相關表項,確定處理器資源信息,然后通過發(fā)送SIPI中斷來啟動和初始化虛擬處理器。虛擬處理器發(fā)送SIPI中斷的時候是通過向ICR寄存器寫入數(shù)據(jù)實現(xiàn)的,向虛擬ICR寫入地址時會被捕獲到,此時在主物理服務器BSP退出的路徑中,根據(jù)ICR的內容判斷是否是發(fā)送SIPI,然后判斷要啟動的虛擬AP是否在本服務器內部,如果是的話,則直接將虛擬的跳板程序從虛擬ICR中解析出來,然后對目標AP做最后的初始化,主要是設置其虛擬控制結構體中的一些重要寄存器信息,其中重點是將跳板程序的地址寫入,作為虛擬處理器進入時程序的執(zhí)行起點。然后將被啟動的虛擬處理器喚醒,使其為可執(zhí)行狀態(tài)并加入調度器隊列,等到被調度到的
時候進入非根模式,開始執(zhí)行客戶操作系統(tǒng)的代碼。如果目標AP不在主物理服 務器上,則需要將SIPI信息打包成網絡信息包,發(fā)送給目標AP所在的物理服務器。當目標服務器接收到信息包之后,判斷如果是SIPI信息包,那么首先需要將 S1PI的目標AP的vlapicjd解析出來進行判斷,如果該AP確實在本物理服務 器,那么緊接著從該信息包中解析出跳板程序的地址,然后對目標AP進行最后 的初始化,將跳板程序地址寫入虛擬控制結構體中。接下來的過程跟單機內一樣, 調用喚醒模塊將目標虛擬處理器喚醒并加入調度隊列,等下一次被調度的時候調 用虛擬機進入模塊,進入非根模式,執(zhí)行客戶操作系統(tǒng)的代碼。歩驟7:在客戶操作系統(tǒng)執(zhí)行過程中,對其指令集進行必要的模擬。在多服 務器的條件下,需要模擬的指令大致分為三類, 一些指令只需要在物理服務器內 進行模擬,而有一些敏感指令或者行為(例如發(fā)送跨處理器中斷)會引發(fā)跨物理 服務器的處理器操作,這時需要物理服務器之間協(xié)調完成指令的模擬。還有一些 指令會間接引發(fā)跨物理服務器操作,或者受到全局資源整合的影響,這時也需要 在全局資源視圖下,通過跨物理服務器的操作對指令模擬進行輔助,保證指令的 正確模擬。敏感指令的模擬如圖3所示。第一類,與全局vcpu資源整合無關的敏感指令模擬。某些指令只需要在物 理服務器內進行模擬,其模擬過程中也只是涉及本地的一些寄存器操作,而不涉 及跨物理服務器操作。例如對HLT, VMMCALL等指令的模擬。對這些指令的模 擬只需根據(jù)其含義,在單機內進行模擬,并將模擬結果通過其虛擬寄存器等返回 到客戶操作系統(tǒng)。第二類,直接引發(fā)跨物理服務器操作的指令模擬。這些指令的模擬可能直接 引發(fā)跨物理服務器操作。例如1〇操作,無論是以IN/OUT/INS/OUTS指令為主 的直接IO訪問(PIO),還是以MOV/MOVS等內存操作指令為主的內存映射 1〇訪問(MMIO),都有可能因為要訪問的設備在遠端物理服務器而不在本地, 而產生跨物理服務器操作。對于直接1〇訪問操作,hypervisor通過捕獲 IN/OUT/INS/OUTS等指令來截獲guest操作。對于內存映射1〇訪問,hypervisor 通過設備映射內存區(qū)的缺頁異常來捕獲guest操作。1〇操作被捕獲后,hypervisor判斷目標設備是否在本地。如果在本地,則直接進行指令模擬、IO 操作等。如果目標設備不在本地,則需要hyperviso「將1〇操作信息進行分析, 抽取出IO操作類型,目標端口地址、讀寫、數(shù)據(jù)或數(shù)據(jù)所在內存地址等信息, 連同物理服務器id、處理器id等環(huán)境信息一起制作成網絡信息包,發(fā)送給目標 設備所在的物理服務器。在設備對guest可見的情況下,目標服務器解析傳來 的數(shù)據(jù)包,將1〇操作在本地還原,完成1〇操作,然后將操作是否成功的信息 發(fā)回給請求端服務器,同時,如果IO操作時是讀數(shù)據(jù)的操作,并且不是往guest 的內存里讀,則需要將讀出的數(shù)據(jù)一并發(fā)回給請求端服務器。如果設備是由模擬 器虛擬的,則目標服務器收到1〇操作網絡包后,將1〇請求發(fā)給設備模擬器處 理。第三類,間接受到跨物理服務器影響的指令模擬。這些指令的模擬會間接受 到跨物理服務器條件的影響,這些影響主要包括在模擬過程中需要用到跨物理服 務器的資源整合信息,或者會間接弓I發(fā)跨物理服務器操作。對于需要用到跨物理服務器的資源整合信息的指令模擬,例如CPUID指令 獲取apicjd的操作。當指令被捕獲后,需要根據(jù)整合后的全局虛擬處理器資源 信息,來模擬指令想要的結果,并將結果返回給客戶操作系統(tǒng)。會間接引發(fā)跨物理服務器操作的指令,其典型代表是如mov—to—cr、 movs 等指令。在對這些指令的1t擬過程中,指令操作數(shù)可能在guest內存中。當涉 及到客戶操作系統(tǒng)內存訪問操作的時候,需要注意缺頁問題,也就是所需頁面不 在本地的情況,此時需要調用DSM算法請求遠程頁面的拷貝。對于非敏感指令 和行為中操作數(shù)造成的缺頁,只需由hypervisor將頁面拷貝過來,然后即可返 回客戶操作系統(tǒng)繼續(xù)執(zhí)行。對于需要訪問客戶操作系統(tǒng)頁面,要由hypervisor 主動的調用DSM模塊。通過DSM算法將有效頁面遷移過來,并進一歩得到操 作數(shù)本身。進而完成對指令的模擬。 3優(yōu)點及效果當前由于硬件的限制,單臺服務器的性能越來越難以提升,目前獲得高性能 服務器的方法很多是基于將多臺小規(guī)模的中低端服務器松散連接成一個服務器
系統(tǒng)來實現(xiàn)的,但這種系統(tǒng)不對上呈現(xiàn)單一系統(tǒng)映像,編程復雜,管理和維護也 較復雜。本發(fā)明提出了基于硬件虛擬化技術的處理器資源整合方法,對上層操作 系統(tǒng)透明,并且具有良好的通用性以及較高的效率,因此,本發(fā)明可以使將多臺 分散的、造價較低的物理服務器虛擬成一臺具有大量處理器資源的高性能服務 器,從而可以在不需要對上層軟件系統(tǒng)作出任何修改,具有簡單易用的編程模型 的前提下,在多臺造價低廉的中低端服務器上實現(xiàn)加速比,獲得高性能。因此, 本發(fā)明具有良好的應用前景。(四)
圖1 系統(tǒng)總體框架示意2 物理處理器和虛擬處理器的對應示意3 敏感指令的模擬過程示意圖具體實施方式
見圖l、圖2、圖3所示,具體實施步驟如下步驟1:在各個物理服務器上生成虛擬處理器。在每個結點上,我們采用硬 件虛擬化技術來實現(xiàn)處理器的虛擬化。根據(jù)硬件虛擬化的規(guī)范,通過在虛擬機監(jiān)控器(VMM)和客戶操作系統(tǒng)之間快速切換的機制,在每個結點上對虛擬處理器的控制結構進行初始化,同時建立虛擬處理器和物理處理器的初始對應關系。然后,對每個虛擬處理器,設置hypervisor對客戶操作系統(tǒng)監(jiān)管的程度,劃分 敏感指令集。這樣,虛擬處理器初始化完畢后,當客戶操作系統(tǒng)執(zhí)行到這些指令 的時候,就會發(fā)生VM退出,控制權轉移到底層的虛擬機監(jiān)控器。步驟2:對各個結點的虛擬處理器信息進行采集。每個結點上生成的虛擬處 理器都要提供給上層的客戶操作系統(tǒng),因此系統(tǒng)中每一個物理服務器都必須了解 全局的虛擬處理器分布情況。這里通過將各個物理服務器所提供的虛擬處理器數(shù) 量寫成配置文件,在各個結點的hypervisor中讀取該文件,這樣各個結點一開 始就知道整個系統(tǒng)的虛擬處理器的分布情況。同時,有時候可能由于特殊原因,
某個結點實際提供的虛擬處理器數(shù)目可能不同于并沒有按照配置文件記錄的數(shù) 目(這種情況極少發(fā)生),各個物理服務器在創(chuàng)建完虛擬處理器后,必須告訴其 他物理服務器其是否成功創(chuàng)建了指定數(shù)目的vcpu,如果沒有,那么各個物理服 務器需要修正vcpu分布信息。步驟3:對虛擬處理器資源信息進行整合與管理。通過前面對虛擬處理器信息的采集,hypervisor已經知道了虛擬處理器在各個幾點的分布情況。這樣,每 個結點都保存一份全局的虛擬處理器分布表。接下來需要對全局的虛擬處理器進 行管理,對于跨物理服務器條件下虛擬處理器的組織,采用的原則是對于那些 guest引發(fā)的相關操作進行全局范圍統(tǒng)一管理,對于hypervisor直接掌控的相 關操作則分服務器單獨管理。對于虛擬處理器標識的管理,采用的方法如下虛 擬處理器資源整合系統(tǒng)中基于以下四個比較重要的標識。(l)vcpujd,用于在 hypervisor中管理虛擬處理器;(2)vlapic—id,用于向guest提供虛擬的apicid; (3) vpujd—global標識,代表當前虛擬處理器在全局環(huán)境下的邏輯id,從 guest的角度看來,vcpuJcLglobal就是其所擁有的處理器在全局層面的邏輯 id。 (4) nodejd,代表該物理服務器在全局范圍內的邏輯標識。首先要為每個 結點指定一個結點號node一id,其中結點號為0的結點為主結點。然后為每個 虛擬處理器分配一個邏輯的vcpu—id,從0開始計數(shù),并且服務器內的vcpuid 是連續(xù)分配的。對于虛擬處理器的vpujd—global標識,通過計算該虛擬處理 器在全局的序號來指定。我們將虛擬處理器所在的物理服務器信息反映到 vlapic一id中,以便可以迅速的定位該虛擬處理器。同時,為了使得虛擬處理器 可以在物理處理器上遷移,我們的虛擬處理器不進行多核結構的設置。所以將 8bit的虛擬處理器的vlapic—id域分為兩個部分,低三個bit用來標識該vcpu 在本服務器內的序號,這個序號在數(shù)值上等于其vcpujd。高五個bit用來標識 該虛擬處理器所在的服務器號。步驟4:確定對虛擬處理器信息的獲取方式。根據(jù)vcpu的管理方法,其 nodejd, vcpujd, vlapicjd是可以通過計算得到的。例如計算vlapicjd 采用如下方法<formula>formula see original document page 18</formula> (1 )對于所在的物理服務器號為t的vcpu來說,其vcpu—id_glob。l的計算方 式如下,其中vcpu一nr (i)是服務器i上的vcpu數(shù)量vcpuid_gl obal = Z vc/n/ — vcpu—id (2)獲取某個虛擬處理器所在的物理服務器號采用下面的方法 node—id-vlapic—id》3 (3)另外,我們還在每個服務器上維護了一個全局的虛擬處理器資源信息表,某 些不能通過計算得到的信息,例如虛擬處理器的dfr信息等,需要通過查表得到。步驟5:將虛擬處理器信息向guest進行呈現(xiàn)。全局的虛擬處理器資源就是 guest能夠使用的處理器資源,我們需要guest能夠正確的識別到這些虛擬處理 器,并能夠正常初始化它們。在這里為guest提供整合后的虛擬處理器資源信 息,主要是根據(jù)虛擬處理器的分布情況,制作基于多處理器規(guī)范的MP表以及基 于ACPI規(guī)范的acpi表,并將其放到guest的內存區(qū)域的適當位置,目的是在 guest啟動的時候通過讀取這些表項感知其所擁有的處理器資源信息。對于MP 表,主要是修改Processor Entries,為每個虛擬處理器生成一個Processor Entry。對于ACPI表,主要是修改Multiple APIC Description Table (MADT) 的Processor Local APIC Structure,還要根據(jù)虛擬處理器信息制作 processor—objects表項。將這些表項寫入guest的內存,并索引到MP規(guī)范 和ACPI規(guī)范的頭部區(qū)域后,guest啟動時便可以讀到這些虛擬的處理器信息, 從而對占有的處理器資源有一個概況。至此,hypervisor層對于虛擬處理器資源信息的準備工作已經完畢,接下來就是啟動客戶操作系統(tǒng),并在其執(zhí)行過程中對其行為進行模擬。步驟6:對guest多處理器啟動過程進行模擬。為了讓客戶操作系統(tǒng)能夠真正感知并使用底層分散在各個物理服務器中的虛擬處理器資源,還要對guest的多處理器啟動過程進行跟蹤和模擬。Guest首先讀取MP和ACPI相關表項,確定處理器資源信息,然后通過發(fā)送SIPI中斷來啟動和初始化虛擬處理器。虛擬處理器發(fā)送SIPI中斷的時候是通過向ICR寄存器寫入數(shù)據(jù)實現(xiàn)的,向虛擬ICR
寫入地址時會被捕獲到,此時在主物理服務器BSP退出的路徑中,根據(jù)ICR的 內容判斷是否是發(fā)送SIPI,然后判斷要啟動的虛擬AP是否在本服務器內部,如 果是的話,則直接將虛擬的跳板程序從虛擬ICR中解析出來,然后對目標AP做 最后的初始化,主要是設置其虛擬控制結構體中的一些重要寄存器信息,其中重 點是將跳板程序的地址寫入,作為虛擬處理器進入時程序的執(zhí)行起點。然后將被 啟動的虛擬處理器喚醒,使其為可執(zhí)行狀態(tài)并加入調度器隊列,等到被調度到的 時候進入非根模式,開始執(zhí)行客戶操作系統(tǒng)的代碼。如果目標AP不在主物理服 務器上,則需要將SIPI信息打包成網絡信息包,發(fā)送給目標AP所在的物理服務 器。當目標服務器接收到信息包之后,判斷如果是SIPI信息包,那么首先需要將 SIPI的目標AP的vl。pic—id解析出來進行判斷,如果該AP確實在本物理服務 器,那么緊接著從該信息包中解析出跳板程序的地址,然后對目標AP進行最后 的初始化,將跳板程序地址寫入虛擬控制結構體中。接下來的過程跟單機內一樣, 調用喚醒模塊將目標虛擬處理器喚醒并加入調度隊列,等下一次被調度的時候調 用虛擬機進入模塊,進入非根模式,執(zhí)行客戶操作系統(tǒng)的代碼。歩驟7:在客戶操作系統(tǒng)執(zhí)行過程中,對其指令集進行必要的模擬。在多服 務器的條件下,需要模擬的指令大致分為三類, 一些指令只需要在物理服務器內 進行模擬,而有一些敏感指令或者行為(例如發(fā)送跨處理器中斷)會引發(fā)跨物理 服務器的處理器操作,這時需要物理服務器之間協(xié)調完成指令的模擬。還有一些 指令會間接引發(fā)跨物理服務器操作,或者受到全局資源整合的影響,這時也需要 在全局資源視圖下,通過跨物理服務器的操作對指令模擬進行輔助,保證指令的 正確模擬。敏感指令的模擬如圖3所示。第一類,與全局vcpu資源整合無關的敏感指令模擬。某些指令只需要在物 理服務器內進行模擬,其模擬過程中也只是涉及本地的一些寄存器操作,而不涉 及跨物理服務器操作。例如對HLT, VMMCALL等指令的模擬。對這些指令的模 擬只需根據(jù)其含義,在單機內進行模擬,并將模擬結果通過其虛擬寄存器等返回 到客戶操作系統(tǒng)。第二類,直接引發(fā)跨物理服務器操作的指令模擬。這些指令的模擬可能直接 引發(fā)跨物理服務器操作。例如1〇操作,無論是以IN/OUT/INS/OUTS指令為主
的直接IO訪問(PIO),還是以MOV/MOVS等內存操作指令為主的內存映射 1〇訪問(MMIO),都有可能因為要訪問的設備在遠端物理服務器而不在本地, 而產生跨物理服務器操作。對于直接1〇訪問操作,hyperviso「通過捕獲 IN/OUT/INS/OUTS等指令來截獲guest操作。對于內存映射1〇訪問,hypervisor 通過設備映射內存區(qū)的缺頁異常來捕獲guest操作。1〇操作被捕獲后, hypervisor判斷目標設備是否在本地。如果在本地,則直接進行指令模擬、1〇 操作等。如果目標設備不在本地,則需要hype「visor將IO操作信息進行分析, 抽取出IO操作類型,目標端口地址、讀寫、數(shù)據(jù)或數(shù)據(jù)所在內存地址等信息, 連同物理服務器id、處理器id等環(huán)境信息一起制作成網絡信息包,發(fā)送給目標 設備所在的物理服務器。在設備對guest可見的情況下,目標服務器解析傳來 的數(shù)據(jù)包,將IO操作在本地還原,完成1〇操作,然后將操作是否成功的信息 發(fā)回給請求端服務器,同時,如果IO操作時是讀數(shù)據(jù)的操作,并且不是往guest 的內存里讀,則需要將讀出的數(shù)據(jù)一并發(fā)回給請求端服務器。如果設備是由模擬 器虛擬的,則目標服務器收到1〇操作網絡包后,將1〇請求發(fā)給設備模擬器處 理。第三類,間接受到跨物理服務器影響的指令模擬。這些指令的模擬會間接受 到跨物理服務器條件的影響,這些影響主要包括在模擬過程中需要用到跨物理服 務器的資源整合信息,或者會間接引發(fā)跨物理服務器操作。對于需要用到跨物理 服務器的資源整合信息的指令模擬,例如CPUID指令獲取apic—id的操作。當 指令被捕獲后,需要根據(jù)整合后的全局虛擬處理器資源信息,來模擬指令想要的 結果,并將結果返回給客戶操作系統(tǒng)。會間接引發(fā)跨物理服務器操作的指令,其典型代表是如mov一to一cr、 movs 等指令。在對這些指令的模擬過程中,指令操作數(shù)可能在guest內存中。當涉 及到客戶操作系統(tǒng)內存訪問操作的時候,需要注意缺頁問題,也就是所需頁面不 在本地的情況,此時需要調用DSM算法請求遠程頁面的拷貝。對于非敏感指令 和行為中操作數(shù)造成的缺頁,只需由hypervisor將頁面拷貝過來,然后即可返 回客戶操作系統(tǒng)繼續(xù)執(zhí)行。對于需要訪問客戶操作系統(tǒng)頁面,要由hypervisor
主動的調用DSM模塊。通過DSM算法將有效頁面遷移過來,并進一步得到操作數(shù)本身。進而完成對指令的模擬。
權利要求
1. 一種對操作系統(tǒng)透明的處理器資源整合利用的方法,其特征在于該方法步驟如下步驟1在各個物理服務器上生成虛擬處理器;在每個結點上,我們采用硬件虛擬化技術來實現(xiàn)處理器的虛擬化,根據(jù)硬件虛擬化的規(guī)范,通過在虛擬機監(jiān)控器(VMM)和客戶操作系統(tǒng)之間快速切換的機制,在每個結點上對虛擬處理器的控制結構進行初始化,同時建立虛擬處理器和物理處理器的初始對應關系,然后,對每個虛擬處理器,設置hypervisor對客戶操作系統(tǒng)監(jiān)管的程度,劃分敏感指令集,這樣,虛擬處理器初始化完畢后,當客戶操作系統(tǒng)執(zhí)行到這些指令的時候,就會發(fā)生VM退出,控制權轉移到底層的虛擬機監(jiān)控器;步驟2對各個結點的虛擬處理器信息進行采集;每個結點上生成的虛擬處理器都要提供給上層的客戶操作系統(tǒng),因此系統(tǒng)中每一個物理服務器都必須了解全局的虛擬處理器分布情況,這里通過將各個物理服務器所提供的虛擬處理器數(shù)量寫成配置文件,在各個結點的hypervisor中讀取該文件,這樣各個結點一開始就知道整個系統(tǒng)的虛擬處理器的分布情況,同時,有時候可能由于特殊原因,某個結點實際提供的虛擬處理器數(shù)目可能不同于并沒有按照配置文件記錄的數(shù)目(這種情況極少發(fā)生),各個物理服務器在創(chuàng)建完虛擬處理器后,必須告訴其他物理服務器其是否成功創(chuàng)建了指定數(shù)目的vcpu,如果沒有,那么各個物理服務器需要修正vcpu分布信息;步驟3對虛擬處理器資源信息進行整合與管理;通過前面對虛擬處理器信息的采集,hypervisor已經知道了虛擬處理器在各個幾點的分布情況,這樣,每個結點都保存一份全局的虛擬處理器分布表,接下來需要對全局的虛擬處理器進行管理,對于跨物理服務器條件下虛擬處理器的組織,采用的原則是對于那些guest引發(fā)的相關操作進行全局范圍統(tǒng)一管理,對于hypervisor直接掌控的相關操作則分服務器單獨管理,對于虛擬處理器標識的管理,采用的方法如下虛擬處理器資源整合系統(tǒng)中基于以下四個比較重要的標識,(1)vcpu_id,用于在hypervisor中管理虛擬處理器;(2)vlapic_id,用于向guest提供虛擬的apicid;(3)vpu_id_global標識,代表當前虛擬處理器在全局環(huán)境下的邏輯id,從guest的角度看來,vcpu_id_global就是其所擁有的處理器在全局層面的邏輯id;(4)node_id,代表該物理服務器在全局范圍內的邏輯標識;首先要為每個結點指定一個結點號node_id,其中結點號為0的結點為主結點,然后為每個虛擬處理器分配一個邏輯的vcpu_id,從0開始計數(shù),并且服務器內的vcpu id是連續(xù)分配的,對于虛擬處理器的vpu_id_global標識,通過計算該虛擬處理器在全局的序號來指定,我們將虛擬處理器所在的物理服務器信息反映到vlapic_id中,以便可以迅速的定位該虛擬處理器,同時,為了使得虛擬處理器可以在物理處理器上遷移,我們的虛擬處理器不進行多核結構的設置,所以將8bit的虛擬處理器的vlapic_id域分為兩個部分,低三個bit用來標識該vcpu在本服務器內的序號,這個序號在數(shù)值上等于其vcpu_id,高五個bit用來標識該虛擬處理器所在的服務器號;步驟4確定對虛擬處理器信息的獲取方式;根據(jù)vcpu的管理方法,其node_id,vcpu_id,vlapic_id是可以通過計算得到的,例如計算vlapic_id采用如下方法vlapic_id=node_id<<3+vcpu_id (1)對于所在的物理服務器號為t的vcpu來說,其vcpu_id_global的計算方式如下,其中vcpu_nr(i)是服務器i上的vcpu數(shù)量獲取某個虛擬處理器所在的物理服務器號采用下面的方法node_id=vlapic_id>>3(3)另外,我們還在每個服務器上維護了一個全局的虛擬處理器資源信息表,某些不能通過計算得到的信息,例如虛擬處理器的dfr信息等,需要通過查表得到;步驟5將虛擬處理器信息向guest進行呈現(xiàn);全局的虛擬處理器資源就是guest能夠使用的處理器資源,我們需要guest能夠正確的識別到這些虛擬處理器,并能夠正常初始化它們,在這里為guest提供整合后的虛擬處理器資源信息,主要是根據(jù)虛擬處理器的分布情況,制作基于多處理器規(guī)范的MP表以及基于ACPI規(guī)范的acpi表,并將其放到guest的內存區(qū)域的適當位置,目的是在guest啟動的時候通過讀取這些表項感知其所擁有的處理器資源信息,對于MP表,主要是修改Processor Entries,為每個虛擬處理器生成一個ProcessorEntry,對于ACPI表,主要是修改Multiple APIC Description Table(MADT)的Processor Local APIC Structure,還要根據(jù)虛擬處理器信息制作processor_objects表項,將這些表項寫入guest的內存,并索引到MP規(guī)范和ACPI規(guī)范的頭部區(qū)域后,guest啟動時便可以讀到這些虛擬的處理器信息,從而對占有的處理器資源有一個概況;至此,hypervisor層對于虛擬處理器資源信息的準備工作已經完畢,接下來就是啟動客戶操作系統(tǒng),并在其執(zhí)行過程中對其行為進行模擬;步驟6對guest多處理器啟動過程進行模擬;為了讓客戶操作系統(tǒng)能夠真正感知并使用底層分散在各個物理服務器中的虛擬處理器資源,還要對guest的多處理器啟動過程進行跟蹤和模擬,Guest首先讀取MP和ACPI相關表項,確定處理器資源信息,然后通過發(fā)送SIPI中斷來啟動和初始化虛擬處理器,虛擬處理器發(fā)送SIPI中斷的時候是通過向ICR寄存器寫入數(shù)據(jù)實現(xiàn)的,向虛擬ICR寫入地址時會被捕獲到,此時在主物理服務器BSP退出的路徑中,根據(jù)ICR的內容判斷是否是發(fā)送SIPI,然后判斷要啟動的虛擬AP是否在本服務器內部,如果是的話,則直接將虛擬的跳板程序從虛擬ICR中解析出來,然后對目標AP做最后的初始化,主要是設置其虛擬控制結構體中的一些重要寄存器信息,其中重點是將跳板程序的地址寫入,作為虛擬處理器進入時程序的執(zhí)行起點,然后將被啟動的虛擬處理器喚醒,使其為可執(zhí)行狀態(tài)并加入調度器隊列,等到被調度到的時候進入非根模式,開始執(zhí)行客戶操作系統(tǒng)的代碼;如果目標AP不在主物理服務器上,則需要將SIPI信息打包成網絡信息包,發(fā)送給目標AP所在的物理服務器,當目標服務器接收到信息包之后,判斷如果是SIPI信息包,那么首先需要將SIPI的目標AP的vlapic_id解析出來進行判斷,如果該AP確實在本物理服務器,那么緊接著從該信息包中解析出跳板程序的地址,然后對目標AP進行最后的初始化,將跳板程序地址寫入虛擬控制結構體中,接下來的過程跟單機內一樣,調用喚醒模塊將目標虛擬處理器喚醒并加入調度隊列,等下一次被調度的時候調用虛擬機進入模塊,進入非根模式,執(zhí)行客戶操作系統(tǒng)的代碼;步驟7在客戶操作系統(tǒng)執(zhí)行過程中,對其指令集進行必要的模擬;在多服務器的條件下,需要模擬的指令大致分為三類,一些指令只需要在物理服務器內進行模擬,而有一些敏感指令或者行為(例如發(fā)送跨處理器中斷)會引發(fā)跨物理服務器的處理器操作,這時需要物理服務器之間協(xié)調完成指令的模擬,還有一些指令會間接引發(fā)跨物理服務器操作,或者受到全局資源整合的影響,這時也需要在全局資源視圖下,通過跨物理服務器的操作對指令模擬進行輔助,保證指令的正確模擬,敏感指令的模擬如圖3所示;第一類,與全局vcpu資源整合無關的敏感指令模擬;某些指令只需要在物理服務器內進行模擬,其模擬過程中也只是涉及本地的一些寄存器操作,而不涉及跨物理服務器操作,例如對HLT,VMMCALL等指令的模擬,對這些指令的模擬只需根據(jù)其含義,在單機內進行模擬,并將模擬結果通過其虛擬寄存器等返回到客戶操作系統(tǒng);第二類,直接引發(fā)跨物理服務器操作的指令模擬;這些指令的模擬可能直接引發(fā)跨物理服務器操作,例如IO操作,無論是以IN/OUT/INS/OUTS指令為主的直接IO訪問(PIO),還是以MOV/MOVS等內存操作指令為主的內存映射IO訪問(MMIO),都有可能因為要訪問的設備在遠端物理服務器而不在本地,而產生跨物理服務器操作,對于直接IO訪問操作,hypervisor通過捕獲IN/OUT/INS/OUTS等指令來截獲guest操作,對于內存映射IO訪問,hypervisor通過設備映射內存區(qū)的缺頁異常來捕獲guest操作,IO操作被捕獲后,hypervisor判斷目標設備是否在本地,如果在本地,則直接進行指令模擬、IO操作等;如果目標設備不在本地,則需要hypervisor將IO操作信息進行分析,抽取出IO操作類型,目標端口地址、讀寫、數(shù)據(jù)或數(shù)據(jù)所在內存地址等信息,連同物理服務器id、處理器id等環(huán)境信息一起制作成網絡信息包,發(fā)送給目標設備所在的物理服務器,在設備對guest可見的情況下,目標服務器解析傳來的數(shù)據(jù)包,將IO操作在本地還原,完成IO操作,然后將操作是否成功的信息發(fā)回給請求端服務器,同時,如果IO操作時是讀數(shù)據(jù)的操作,并且不是往guest的內存里讀,則需要將讀出的數(shù)據(jù)一并發(fā)回給請求端服務器,如果設備是由模擬器虛擬的,則目標服務器收到IO操作網絡包后,將IO請求發(fā)給設備模擬器處理;第三類,間接受到跨物理服務器影響的指令模擬;這些指令的模擬會間接受到跨物理服務器條件的影響,這些影響主要包括在模擬過程中需要用到跨物理服務器的資源整合信息,或者會間接引發(fā)跨物理服務器操作;對于需要用到跨物理服務器的資源整合信息的指令模擬,例如CPUID指令獲取apic_id的操作,當指令被捕獲后,需要根據(jù)整合后的全局虛擬處理器資源信息,來模擬指令想要的結果,并將結果返回給客戶操作系統(tǒng);會間接引發(fā)跨物理服務器操作的指令,其典型代表是如mov_to_cr、movs等指令,在對這些指令的模擬過程中,指令操作數(shù)可能在guest內存中,當涉及到客戶操作系統(tǒng)內存訪問操作的時候,需要注意缺頁問題,也就是所需頁面不在本地的情況,此時需要調用DSM算法請求遠程頁面的拷貝,對于非敏感指令和行為中操作數(shù)造成的缺頁,只需由hypervisor將頁面拷貝過來,然后即可返回客戶操作系統(tǒng)繼續(xù)執(zhí)行,對于需要訪問客戶操作系統(tǒng)頁面,要由hypervisor主動的調用DSM模塊,通過DSM算法將有效頁面遷移過來,并進一步得到操作數(shù)本身,進而完成對指令的模擬。
全文摘要
本發(fā)明提供了一種對操作系統(tǒng)透明的處理器資源整合利用的方法,它可以將多臺分散的、造價較低的物理服務器虛擬成一臺具有大量處理器資源的高性能服務器,從而可以在不需要對上層軟件系統(tǒng)作出任何修改,具有簡單易用的編程模型的前提下,在多臺造價低廉的中低端服務器上實現(xiàn)加速比,獲得高性能。它實現(xiàn)了跨物理服務器的處理器虛擬化系統(tǒng)。通過在多個物理服務器之上部署基于這種處理器資源整合利用方法的虛擬機監(jiān)控器,使得上層客戶操作系統(tǒng)可以在物理服務器集群上運行,透明地使用分散在多個物理機器中的處理器資源。因此,本發(fā)明具有良好的應用前景。
文檔編號G06F9/50GK101398769SQ200810225090
公開日2009年4月1日 申請日期2008年10月28日 優(yōu)先權日2008年10月28日
發(fā)明者劉忠麟, 蕭 張, 彭近兵, 李響山, 簫 王, 祝明發(fā), 肖利民 申請人:北京航空航天大學