Department of Electrical Engineering National Cheng Kung University 基於KVM的 物理資源動態分配與管理技術 徐 子 傑 Hsu,Zi Jei Department of Electrical Engineering National Cheng Kung University Tainan, Taiwan, R.O.C
引言(1/1) Intel和AMD先後推出的一系列支持虛擬化技術的CPU,在很大程度上提高了虛擬機器環境下CPU和記憶體的性能。然而在週邊設備虛擬化方面,I/O設備的性能卻損失很大。I/O設備的利用率瓶頸成為了提高虛擬機器使用性能的瓶頸。因此,提高在虛擬機器下的I/0設備性能成為一個至關重要的問題。 近年來VMWare等公司又相繼提出Passthrough I/O模型。 Passthrough I/O模型將設備獨佔式地分配給指定的客戶域,使該域具有最高的I/O訪問性能,這樣做的優點是: 由於不需要模擬設備進行請求轉換,所以存取速度高; GOS能根據最新硬體,載入對應驅動,可充分發揮新硬體的功能。 Passthrough I/0在最大程度上提高了I/0性能,但這卻是以犧牲設備共用能力為代價的。 本文以虛擬化技術為基礎,結合Linux設備熱插拔技術及Intel VT-d技術,提出並實現了一種基於KVM的物理資源動態分配與管理技術,在不降低Passthrough I/O設備訪問性能的前提下,仍然能夠滿足設備的共用能力。
Linux作業系統的熱插拔處理(1/3) 由Intel、Microsoft及Toshiba共同開發而成的高級配置與電源管理介面ACPI(Advance Configuration and Power Interface Specification)能使作業系統依照一定的方式管理用電情況,處理系統硬體產生的熱插拔事件,讓作業系統從使用者的角度上直接支配隨插即用設備,不同於以往的基於BIOS的管理方式。 ACPI對系統平臺、外插板卡硬體都有特定的要求: 系統集成熱插拔控制積體電路和PCI插槽的逆電流控制器,這樣在系統啟動過程中可以自動檢測PCI插槽上是否有設備,當探測到PCI插槽上無設備時,能夠自動將該插槽斷電。 目前南橋晶片中都集成了ACPI協議。
Linux作業系統的熱插拔處理(2/3) 使用者將一塊PCI熱插拔設備插入到主機板的插槽後,從南橋晶片中的熱插拔控制器感應到有設備插入,到插入的設備可以正常使用作業系統所經歷的一系列過程如下: (1)設備插入後,南橋熱插拔控制器生成GPE事件(通用事件)通知ACPI驅動層。 (2)ACPI核心控制晶片組根據GPE事件產生一個系統控制中斷,通知作業系統處理相應的ACPI事件。 (3)硬體會清除這個GPE事件的回應位,並且運行對應GPE位在ACPl名字空間中的控制方法。 (4)控制方法將根據熱插拔控制器的相應控制位來決定當前事件是否為一個設備插入事件,以及哪個插槽有設備插入。
Linux作業系統的熱插拔處理(3/3) (5)控制方法將向ACPI驅動層發出通知,表示當前PCI匯流排上的某一個插槽有設備插入。 (8)PCI層讀入相關設備(PCI功能模組)的配置資訊: 對該PCI卡上所有設備根據設備製造廠商獲得相關的驅動程式; 使能PCI卡上所有的功能模組; ACPI驅動層根據PCI設備的電源管理規範,使能PCI設備上的電源管理狀態寄存器,使PCI設備上電,啟動設備。 (9)系統正常運行/訪問設備。
KVM的設備熱插拔(1/3) 設備熱插拔初始化,KVM經由改寫的Qemu程式來模擬部分硬體資源和I/O設備的。 GOS啟動同時,創建其相應的Qemu進程,初始化Qemu管理器。 Qemu管理器是使用者態的Qemu進程的一個子執行緒,用於在GOS啟動後動態地對GOS系統硬體進行管理。 PCI設備熱插拔的初始化是在Qemu管理器中進行的。 KVM的PCI設備熱插拔初始化過程如下: (1)查找設備所要掛接的匯流排。 (2)將PCI設備的設備資訊添加到所要掛接匯流排上的模擬設備佇列中。 (3)使用Qemu標準匯流排掛接方法掛接設備, 包括為真實設備分配在虛擬機器中將要使用的功能號; 分配將要在虛擬機器中使用的中斷索引號及中斷號等。
KVM的設備熱插拔(2/3) (4)通過HOS的sysfs獲得設備的真實配置資訊,保存在GOS對應的設備配置空間中。 (5)向Qemu註冊GOS所關心的I/O記憶體及I/O埠,設置中斷路徑。 (6)設置由KVM來進行設備的IOMMU及擷取裝置產生的中斷。 (7)啟動設備,相當於給設備所插入的“插槽”上電。 (8)KVM向GOS對應的虛擬中斷控制器中寫入一個“產生一個設備插入事件”的中斷。 (9)轉入到章節2中的作業系統對熱插拔的處理過程中。 將設備從GOS中刪除,首先將設備從所掛接的匯流排上刪除,其次將設備所插入的“插槽”斷電,最後KVM向GOS中寫入一個“產生一個設備拔出事件”的中斷。
KVM的設備熱插拔(3/3) Qemu模擬的PCI匯流排不具備PCI熱插拔控制器,所以在添加(或刪除)一個設備成功後,KVM需要向GOS的虛擬中斷控制器中寫入一個中斷,通知ACPI核心晶片組插入(或拔出)了一個設備及設備插入了哪個PCI插槽(設備從哪個插槽中拔出),以代替熱插拔控制器對PCI插槽的掃描。 最近,英特爾提出了新的匯流排及介面標準一PCI-Express。 PCI-Express具有很多PCI匯流排所不具備的功能,如它定義了標準的熱插拔控制器和熱插拔規範等。 隨著虛擬化技術的進步,未來可能出現模擬的PCI-Express匯流排。使用這種匯流排,在設備熱插拔過程中GOS可以自我感知設備的插入與拔出,而不再需要KVM向GOS注入中斷。
物理資源動態分配與管理框架的設計(1/5) 框架主要應用了物理資源動態分配與管理技術,基於共用記憶體及信號機制實現物理資源管理模組與虛擬機器管理進程Qema之間的通信, 利用hypercall機制實現GOS與HOS之間的通信,實現設備在多個GOS之間的分時共用,在不降低Passthrough I/O設備訪問性能的前提下,仍然能夠滿足設備的共用能力。 物理資源動態分配與管理技術的設計思想是允許每個GOS向管理器申請所需要的設備,在管理器的協調下,每個GOS可以分時獨立的使用物理PCI設備,來進行高效的I/O訪問。
物理資源動態分配與管理框架的設計(2/5) 圖1 物理資源動態與管理框架
物理資源動態分配與管理框架的設計(3/5) 物理設備管理模組(本框架下主要指PCI設備)的作用是收集每個GOS對設備的請求資訊,然後根據這些資訊,設備管理員在多個GOS之間進行有限設備的分配。 資源請求模組是運行在GOS中的PCI設備請求程式,使用者通過資源請求模組向管理器申請所需要的設備。每個GOS都有一個使用者態的Qemu進程與其相對應。 使用者在GOS中運行資源請求模組選擇所要申請的設備類型,根據預先設計好的hypercall機制,將這一請求資訊傳送到內核模組KVM中,KVM對請求資訊做簡單的封裝處理後將其傳遞到物理設備管理模組中保存並顯示出來; 設備管理員分析多個GOS的請求資訊,然後使用物理設備管理模組選擇將設備分配給合適的GOS。 在管理員進行設備分配時,可能設備正在被某個GOS所使用,那麼物理設備管理模組需要先將這個設備從相應的GOS中刪除,然後再添加到另一個GOS中。
物理資源動態分配與管理框架的設計(4/5) 某一時刻管理模組要將GOS1所擁有的設備分配給GOS2,管理模組所要做的操作如下: 根據GOSl的進程號向GOSl對應的Qemu進程發送信號,通知Qemu進程將設備刪除 Qemu進程根據從共用記憶體中取出的資料進行相應的操作刪除設備 設備成功刪除後,Qemu進程將刪除的設備資訊通知KVM,KVM向GOSl對應的虛擬中斷控制器中寫入一個“產生設備拔出事件”的中斷,進而GOSl處理這個熱插拔事件; 上述操作完成後,Qemu進程發送信號通知物理設備管理模組設備成功釋放,物理設備管理模組修改自己保存的對應設備資訊。
物理資源動態分配與管理框架的設計(5/5) 物理設備管理模組通知GOS2添加設備物理設備管理模組將設備的匯流排號、設備號等資訊寫入到共用記憶體並向GOS2對應的Qemu進程發送信號,通知Qemu進程添加設備; Qemu進程根據從共用記憶體中取出的資料進行相應的操作添加設備(見章節3); 設備成功添加後,KVM向GOS2對應的虛擬中斷控制器寫入一個“產生設備插入事件”的中斷,通知GOS2進行相應處理; 上述操作完成後,Qemu進程將設備所插入的槽號及所掛接的設備匯流排等資訊寫入共用記憶體; 物理設備管理模組根據從共用記憶體中取出的資訊更新自己保存的設備資訊。
實現與測試(1/6) 在管理器中,實現設備請求結構體, 在管理器中,實現設備分配結構體, 保存GOS對設備的請求資訊,如發起請求的GOS進程號、請求發生時的系統時間及申請設備的類型等。 GOS的進程號從GOS對應的進程式控制制塊中獲得; 系統時間通過系統函數do_gettimeofday()來獲得。 在管理器中,實現設備分配結構體, 保存PCI設備的資訊,如設備的配置空間資訊、設備所屬的GOS、設備插入GOS的哪個插槽等。 設備的配置空間資訊包括設備匯流排號、設備號及功能號等; 設備所屬的GOS的進程號在設備分配成功時從GOS的進程式控制制塊中獲得; 設備所在的插槽在設備分配成功後從共用記憶體中獲得。
實現與測試(2/6) 圖2 設備請求過程
實現與測試(3/6) 設備請求過程: 使用者向管理器申請設備,GOS調用hypercall函數將申請設備的類型資訊傳遞給KVM; KVM調用標準的vmcall接收函數處理這個hypercall後,調用預先定義好的函數將申請設備的類型資訊及申請設備的GOS的進程號傳遞給管理器。 管理器將接收到的資料保存在設備請求結構體中,並記錄當前系統時間。 最後,管理器將GOS對設備的請求資訊通知設備管理員。
實現與測試(4/6) 圖3 設備添加過程
實現與測試(5/6) 在將設備分配給目標GOS時,管理器首先要判斷設備是否已經分配給其他的GOS。 如果其值為0,說明設備沒有進行分配,可以直接分配; 如果其值為正值,則說明設備已經分配給其他的GOS,需要先將設備從所屬GOS中刪除,然後再添加到目標GOS中。 以設備的添加過程為例來說明設備的分配過程: 管理器將設備的資訊寫入到共用記憶體中,然後調用kill函數發送信號SIGRTMAX通知目標GOS對應的Qemu進程。 Qemu進程調用對應的信號處理函數將共用記憶體中的設備資訊取出並寫入到緩衝區中,然後調用Qemu標準的命令處理函數進行設備添加操作。 Qemu進程將系統分配給設備的插槽號和匯流排號寫入共用記憶體,發信號通知管理器根據這些值更新設備分配結構體。 管理器判斷GOS分配給設備的插槽號,如果是非正值,說明設備的分配失敗;如果是正值,那麼管理器更新設備分配結構體。
實現與測試(6/6) 測試結果: 本文在下面這樣一個場景中對物理資源動態分配與管理框架進行測試: GOSl對外提供HTTP服務,將網卡分配給它以實現高速的網路訪問。在一段時間內,GOSl所在的主機負載過高,需要將GOSl遷移到局域網中的其他主機上運行以平衡負載。 此時在GOS2上啟動相應的HTTP服務,將網卡從GOSl中刪除,然後分配給GOS2,由GOS2繼續對外提供服務。在進行設備熱插撥過程中,GOS是無法對外提供服務的,這裡使用ping命令測量在熱插拔過程中的ICMP報文的丟失率。 本文設定ping命令每10毫秒發送一個ICMP報文,10秒鐘後停止發送,在這10秒內將網卡從GOSl分配到GOS2中。 經過二十次的反復測試計算平均值,ICMP報文的丟失率為39%,也就是說物理資源配置過程耗時大約為4秒,這段時間包括網卡熱插拔分配的時間及GOS對網卡進行配置的時間。 相較於長時間及高性能的網路服務要求,應用物理資源動態分配與管理框架所造成的性能損失還是很低的。
結論 本文首先介紹Linux的熱插拔處理過程,然後分析KVM的熱插拔實現,最後基於Passthrough I/O模型設計了物理資源動態分配管理框架並在支援VT-d的機器上將其實現出來。 物理資源動態分配管理框架支援多個虛擬機器動態分時的使用PCI設備,測試表明它提高了Passthrough I/O模型的共用能力。但是本框架也存在一定的不足: 設備從GOS中刪除時,沒有保存當前GOS對設備的使用狀態,當設備再一次分配給該GOS時,是一個全新的狀態,這對使用者的使用來說是非常不便的,這點不足也是我們以後改進的方向。