專利名稱:一種基于內核虛擬機調度策略的實現方法
技術領域:
本發明主要是涉及一種基于內核虛擬機(Kernel-based Virtual Machine,簡稱 KVM)調度策略的實現方法,實現在Linux環境下協調內核虛擬機與系統進程間的資源競爭 問題,使內核虛擬機能夠達到更好的性能;在多虛擬機環境下,使各虛擬機之間能夠更高效 的利用系統資源,各虛擬機達到自適應調整。此外,基于內核虛擬機的調度策略通過減少虛 擬機的切換次數,從而降低內核虛擬機的切換開銷。屬于計算機虛擬機調度器技術領域。
背景技術:
1、虛擬化技術虛擬化技術出現于上世紀六七十年代,主要應用在大型機上,初衷是為了實現更 高的設備利用率,使多個用戶能夠盡可能的利用大型機豐富的系統資源,節省成本。虛擬化 技術通過軟件手段對計算機中的重要的接口進行模擬和抽象,從而實現虛擬化軟件。通常 所說的虛擬化技術是指系統級的虛擬化技術,系統級虛擬化技術中的虛擬化軟件稱為虛擬 機監控器(Virtual Machine Monitor,簡稱VMM),以虛擬指令集系統架構(ISA,Instructl/ On System Architecture)為目標。系統級虛擬化的核心是構建虛擬機監視器,然后在其上 創建虛擬機,將本來直接運行于實際硬件平臺的操作系統放在虛擬機中運行,這樣的操作 系統稱為客戶操作系統(Guest 0S),其中原本可直接運行的某些操作通過虛擬層來運行。 通過虛擬機監控器可以在單個物理服務器上運行多個虛擬機,每個虛擬機封裝一個客戶操 作系統,使得運行在各個客戶操作系統中的程序具有很好的安全隔離性和可擴展性,實現 服務整合,極大的提高了各種資源的利用率。虛擬化技術將服務器邏輯的劃分為一個主機,一個虛擬機監控器和多個虛擬機。 虛擬機監控器負責對多個虛擬機進行資源分配和調度,使每個虛擬機能夠公平的共享主機 資源。2、內核虛擬機及其現有的調度策略內核虛擬機是一種開源的新型虛擬化解決方案,由KVM Driver和稍加修改過的 Qemu兩部分組成。KVM Driver加入到標準的Linux(計算機操作系統)內核中,被組織成標 準的字符設備(/dev/kvm);稍加修改的Qemu通過一系列I/Octl系統調用訪問這個字符設 備從而創建和運行虛擬機。內核虛擬機將Linux進程劃分為三種執行模式內核模式,執行 非I/O客戶代碼,虛擬機運行在這種模式下;內核模式,實現客戶機的切換,處理由于I/O或 特定指令引起的虛擬機退出,KVM Driver工作在此模式下;用戶模式,模擬執行I/O指令, Qemu運行在此模式下。在這種模式下,每個虛擬機都是一個標準的Linux進程,通過Linux 內核進行調度。Linux內核通過進程控制塊taSk_Struct (進程在Linux內核中的表示方法)結 構體中的policy值將進程分為普通進程和實時進程,并分別采用不同的調度策略。內核虛 擬機進程屬于普通進程,采用動態優先級時間片輪轉調度算法虛擬機進程創建時,task_ struct結構體中的counter值被賦予priority的值,即初始計數器值,同時虛擬機進程被
3加入到處理器的可執行進程隊列,等待Linux內核調度程序的調度。在某一時刻,虛擬機進 程被Linux內核進程調度程序選中,獲得處理器資源,虛擬機進程處于運行狀態,其task_ struct結構體中的counter域相應的減少,以給其他進程獲得處理器資源的機會。虛擬機 進程在運行完自身的時間片或因等待某種資源需要退出時,Linux內核調度程序立刻重新 掃描系統中的進程調度隊列,選擇另一個處于可執行隊列的進程獲得處理器資源。虛擬機 進程獲得需要的系統資源后被重新加入到可執行隊列中,等待處理器的下一輪調度。若虛 擬機進程的taSk_Struct結構體中的counter值在某一時刻減為0,且系統中還存在其他普 通進程,則虛擬機進程需要等至所有普通進程的counter值都減為0后,Linux內核進程調 度程序對所有普通進程的counter值進行重新賦值,進行新一輪的調度。3、內核虛擬機現有調度策略的缺陷KVM虛擬機完全利用Linux進程調度程序作為自己的調度器,從Linux內核角度來 看,KVM虛擬機只不過是一個系統的普通進程,使得KVM虛擬機與Linux內核得到了完美的 結合,充分利用了 Linux內核的一切優點,使KVM虛擬機得到了較好的性能。同時,KVM虛擬機所采有的Linux進程調度策略也存在許多局限性。首先,KVM虛 擬機是一個普通的進程并由Linux內核統一調度,由于Linux系統中存在眾多的系統進程, 這些進程勢必會與KVM虛擬機進程競爭系統資源,無論是CPU資源,內存資源,還是I/O設 備資源。同時,Linux內核會保證系統中的各個進程都能得到運行的機會,調度算法會以一 種公平的方式來調度各個進程。除此之外,Linux為了保證實時性,采用了搶占式調度方 式,即在任何一個進程運行期間,一個實時性要求高的進程到來都會導致內核重新進行調 度。在Linux內核看來,這是公平的,合理的,但對于KVM虛擬機來說,這確實不公平的。因 為虛擬機本身就是一個操作系統,試想這樣一種情況KVM進程正在CPU上運行,此時里面 運行了一個優先級較高的應用,某一時刻,Linux系統中到來一個優先級高于KVM虛擬機的 進程,但它的優先級卻低于KVM虛擬機中業務的優先級,此時Linux系統本身并意識不到這 一點,因此Linux內核會剝奪KVM虛擬機的運行權,轉去執行新到來的進程。這種情況下, 不僅KVM虛擬機中的更高優先級的業務無法運行,而且導致了 KVM進程的切換,這次本不應 該的切換也增加了 KVM進程的切換次數,從而增加了虛擬機的切換開銷。
發明內容
1、目的本發明的目的是為了提供一種基于內核虛擬機調度策略的實現方法,它實現了在 內核虛擬機環境下,更好的協調虛擬機進程和Linux系統進程的資源競爭問題,使虛擬機 達到更好的性能;在多虛擬機環境下,各個虛擬機更高效的利用系統資源,并努力達到自適 應調整;同時,基于內核虛擬機的調度策略考慮到了虛擬機進程的特殊性,減少了虛擬機與 主機的切換次數,從而降低了虛擬機的切換開銷。這樣在物理服務器上部署一個或多個虛 擬機,可以使運行在虛擬機內的客戶操作系統更加高效、安全的運行業務程序,實現資源的 整合,提高物理服務器的利用率。2、技術方案本發明一種基于內核虛擬機調度策略的實現方法,該方法具體步驟如下步驟一將Linux進程分為普通進程,虛擬機進程和實時進程,使虛擬機進程的優先級介于普通進程和實時進程之間,并為其提供特殊的調度算法。具體實現步驟如下步驟1 標識內核虛擬機進程。在taSk_Struct結構體中設置特殊標志,將KVM進 程進行標識。為task_strUCt結構增加一個新的屬性is_kvm(標識KVM進程的屬性),并且 它只有兩種狀態0和1,其中1代表該進程是KVM進程,0代表其他進程。該屬性在進程被 創建的時候賦值。在Linux內核執行調度程序時首先檢測taSk_Struct結構體中的is_kvm 的值,如果是KVM進程,則采取特殊的調度策略,從而避免了和普通進程競爭系統資源的問 題。步驟2 設置專門的虛擬機就緒隊列。將Linux進程就緒隊列分為虛擬機進程就緒 隊列和普通進程就緒隊列,分別通過兩個指針進行訪問。Linux內核進行進程調度時都會先 檢索虛擬機就緒隊列,選擇一個就緒的虛擬機進程運行,只有在虛擬機進程就緒隊列為空, 或是每個虛擬機進程的時間片為0時,再去調度普通進程就緒隊列。在所有進程就緒隊列 的所有進程的時間片都為0時,再對所有進程賦以新的時間片,進行新一輪的調度。步驟3 細分虛擬機就緒隊列。將虛擬機就緒隊列再細分為under隊列(時間片 未用完的虛擬機進程)和over隊列(時間片已用完的虛擬機進程)。最開始所有的虛擬機 就緒進程都在under隊列,每個虛擬機具有相同的優先級,以保證每個虛擬機得到公平的 對待。Linux內核每次從under隊列的隊首取一個就緒的虛擬機進程,使之成為下一個被調 度的進程,該虛擬機進程的時間片隨著運行時間而減小,當該虛擬機進程的運行時間達到 且其時間片不為0時,將該虛擬機進程移到under隊列的隊尾,接著選擇under隊列的下一 個隊首進程投入運行。當某一個虛擬機進程的時間片減少為0時,便被放入到over隊列。 當under隊列為空時,互換under隊列和over隊列的指針,并重新賦值所有虛擬機進程的 初始時間片值,繼續參與調度,周而復始。步驟4 設置虛擬機進程為不可搶占進程。如果虛擬機進程在運行期間,由一個 優先級更高的進程到來,此時并不是直接搶占虛擬機進程的運行權,而是將虛擬機進程的 need_Shed(標識進程是否需要執行調度程序的標識位)置位,待此虛擬機進程運行完畢讓 出處理器資源后,立即進行調度,以保證虛擬機進程在運行期間不可搶占。步驟二 根據虛擬機中業務的需求,動態調整各虛擬機的資源,使虛擬機更好的適 應其客戶操作系統中業務的需求。具體實現步驟為步驟1 根據虛擬機中的業務需求,將其分為計算密集型和I/O密集型。task_ struct結構體的sleep_aVg域記錄一個虛擬機進程的休眠時間和執行時間,當一個進程從 休眠狀態恢復到執行狀態,sleep_aVg會隨其休眠時間的長短而增長,直到一個預定的閾值 為止。相反,虛擬機進程每運行一個時鐘節拍,sleep_avg就相應的減少,直到0為止。步驟2 在進行重新計算優先級和時間片時,根據sleep_aVg值對兩種不同的虛擬 機進行不同的獎懲。每一個虛擬機進程都有一個相同的初始優先級,當所有虛擬機進程的 時間片用完時,需要重新計算優先級和時間片,此時根據sleep_aVg的值分別對每一個虛 擬機進程的優先級進行調整,以便使各個虛擬機進程在新一輪調度中能夠更好的滿足業務 的需求,達到自適應調整的能力。3優點及效果本發明一種基于內核虛擬機調度策略的實現方法,其優點及效果是首先,該方法從進程級別將內核虛擬機進程和Linux進程區分開,并賦予其較普
5通進程更高的優先級,從而使虛擬機進程在與系統普通進程進行資源競爭時優先調度虛擬 機進程。其次,在多虛擬機環境下,為每個虛擬機進程設置相同的初始優先級,保證每個虛 擬機進程能夠得到公平的對待,同時設置虛擬機進程為不可搶占式進程,保證虛擬機中業 務的正常運行;為虛擬機進程設置專門的虛擬機調度隊列,并將虛擬機就緒進程隊列細分 為under隊列和over隊列,縮短了調度程序調度虛擬機進程的時間,提高了多個虛擬機進 程情況下的調度效率。最后,通過根據虛擬機中業務的實時需求來動態調整虛擬機資源,使 虛擬機進程更好的滿足其業務的需求。在內核虛擬機環境下,本發明提出了適合內核虛擬 機自身特點的調度策略,因此具有很好的使用價值和應用前景。
圖1系統總體調度框架2系統總體調度流程示意3內核虛擬機調度隊列示意圖
具體實施例方式本發明按照圖1所示的部署方式,在單個物理主機上同時運行一個或者多個內核 虛擬機,然后由本發明的改進后Linux調度程序對所有內核虛擬機和普通Linux進程進行 統一調度,并針對內核虛擬機進程采用特殊的調度隊列和調度策略,實現各個內核虛擬機 更高效地利用系統資源,減少了虛擬機的切換次數,降低了虛擬機的切換開銷,從而提高了 內核虛擬機的整體性能。圖2所示,為系統的總體調度流程圖。當內核虛擬機作為一個Linux進程被創建 后,將其標識為虛擬機進程,并加入到虛擬機就緒隊列的under隊列,由于設置虛擬機就緒 隊列的優先級比普通進程優先級高,若此時沒有其他的虛擬機進程在運行,則立即剝奪正 在運行的普通進程的運行權,獲得處理器資源開始運行;在運行一段時間后,將此虛擬機進 程移到虛擬機就緒隊列隊尾,調度其他的虛擬機進程運行;若某一時刻,虛擬機進程的時間 片用完則加入到虛擬機就緒隊列的over隊列,繼續調度其他虛擬機進程運行;若所有虛 擬機進程的時間片用完,則根據上一時段內各虛擬機的運行情況對各虛擬機重新計算時間 片,并再次加入到under隊列,進行下一輪的調度。圖3所示,為內核虛擬機的調度隊列示意圖。本發明所實現的一種基于內核虛擬 機的調度策略為虛擬機設置了專門的就緒隊列,從而將內核虛擬機進程和系統的普通進程 區分開來,為虛擬機提供了較普通進程更高的優先級,保證虛擬機在與普通進程進行資源 競爭的時候能夠優先獲得資源,同時虛擬機就緒隊列的進程采用公平的時間片輪轉調度策 略,保證了各虛擬機得到公平的處理;進一步將虛擬機就緒隊列細分為under隊列和over 隊列,就緒的虛擬機進程放到under隊列,時間片用完的進程被移到over隊列,只在under 隊列為空時,簡單的將under隊列和over隊列調換,即可重新進行下一輪的調度,提高了虛 擬機調度的效率;同時,在進行新一輪調度的同時,根據前一段時間內各虛擬機的運行情況 對各個虛擬機的優先級和時間片進行重新調整,保證虛擬機更好的滿足客戶虛擬機對資源 的要求。本發明一種基于內核虛擬機調度策略的實現方法,該方法具體步驟如下
6
步驟一將Linux進程分為普通進程,虛擬機進程和實時進程,使虛擬機進程的優 先級介于普通進程和實時進程之間,并為其提供特殊的調度算法。具體實現步驟如下步驟1 標識內核虛擬機進程。在taSk_Struct結構體中設置特殊標志,將KVM進 程進行標識。為taSk_Struct結構增加一個新的屬性is_kvm,并且它只有兩種狀態0和1, 其中1代表該進程是KVM進程,0代表其他進程。該屬性在進程被創建的時候賦值。在Linux 內核執行調度程序時首先檢測taSk_Struct結構體中的is_kvm的值,如果是KVM進程,則 采取特殊的調度策略,從而避免了和普通進程競爭系統資源的問題。步驟2 設置專門的虛擬機就緒隊列。將Linux進程就緒隊列分為虛擬機進程就緒 隊列和普通進程就緒隊列,分別通過兩個指針進行訪問。Linux內核進行進程調度時都會先 檢索虛擬機就緒隊列,選擇一個就緒的虛擬機進程運行,只有在虛擬機進程就緒隊列為空, 或是每個虛擬機進程的時間片為0時,再去調度普通進程就緒隊列。在所有進程就緒隊列 的所有進程的時間片都為0時,再對所有進程賦以新的時間片,進行新一輪的調度。步驟3 細分虛擬機就緒隊列。將虛擬機就緒隊列再細分為under隊列和over隊 列,under隊列中是時間片不為0的虛擬機進程,over隊列中是時間片為0的虛擬機進程。 最開始所有的虛擬機就緒進程都在under隊列,每個虛擬機具有相同的優先級,以保證每 個虛擬機得到公平的對待。Linux內核每次從under隊列的隊首取一個就緒的虛擬機進程, 使之成為下一個被調度的進程,該虛擬機進程的時間片隨著運行時間而減小,當該虛擬機 進程的運行時間達到且其時間片不為0時,將該虛擬機進程移到under隊列的隊尾,接著選 擇under隊列的下一個隊首進程投入運行。當某一個虛擬機進程的時間片減少為0時,便 被放入到over隊列。當under隊列為空時,互換under隊列和over隊列的指針,并重新賦 值所有虛擬機進程的初始時間片值,繼續參與調度,周而復始。步驟4 設置虛擬機進程為不可搶占進程。如果虛擬機進程在運行期間,由一個 優先級更高的進程到來,此時并不是直接搶占虛擬機進程的運行權,而是將虛擬機進程的 need_shed置位,待此虛擬機進程運行完畢讓出處理器資源后,立即進行調度,以保證虛擬 機進程在運行期間不可搶占。步驟二 根據虛擬機中業務的需求,動態調整各虛擬機的資源,使虛擬機更好的適 應其客戶操作系統中業務的需求。具體實現步驟為步驟1 根據虛擬機中的業務需求,將其分為計算密集型和I/O密集型。task_ struct結構體的sleep_aVg域記錄一個虛擬機進程的休眠時間和執行時間,當一個進程從 休眠狀態恢復到執行狀態,sleep_aVg會隨其休眠時間的長短而增長,直到一個預定的閾值 為止。相反,虛擬機進程每運行一個時鐘節拍,sleep_avg就相應的減少,直到0為止。步驟2 在進行重新計算優先級和時間片時,根據sl^p_aVg值對兩種不同的虛擬 機進行不同的獎懲。每一個虛擬機進程都有一個相同的初始優先級,當所有虛擬機進程的 時間片用完時,需要重新計算優先級和時間片,此時根據sleep_aVg的值分別對每一個虛 擬機進程的優先級進行調整,以便使各個虛擬機進程在新一輪調度中能夠更好的滿足業務 的需求,達到自適應調整的能力。
權利要求
一種基于內核虛擬機調度策略的實現方法,其特征在于該方法具體步驟如下步驟一將計算機操作系統即Linux的進程分為普通進程,虛擬機進程和實時進程,使虛擬機進程的優先級介于普通進程和實時進程之間,并為其提供特殊的調度算法;具體實現步驟如下步驟1標識內核虛擬機進程;在task_struct結構體中設置特殊標志,將KVM進程進行標識;為task_struct結構增加一個新的屬性is_kvm,并且它只有兩種狀態0和1,其中1代表該進程是KVM進程,0代表其他進程;該屬性在進程被創建的時候賦值;在Linux內核執行調度程序時首先檢測task_struct結構體中的is_kvm的值,如果是KVM進程,則采取特殊的調度策略,從而避免了和普通進程競爭系統資源的問題;步驟2設置專門的虛擬機就緒隊列;將Linux進程就緒隊列分為虛擬機進程就緒隊列和普通進程就緒隊列,分別通過兩個指針進行訪問;Linux內核進行進程調度時都會先檢索虛擬機就緒隊列,選擇一個就緒的虛擬機進程運行,只有在虛擬機進程就緒隊列為空,或是每個虛擬機進程的時間片為0時,再去調度普通進程就緒隊列;在所有進程就緒隊列的所有進程的時間片都為0時,再對所有進程賦以新的時間片,進行新一輪的調度;步驟3細分虛擬機就緒隊列;將虛擬機就緒隊列再細分為under隊列和over隊列,under隊列中是時間片不為0的虛擬機進程,over隊列中是時間片為0的虛擬機進程;最開始所有的虛擬機就緒進程都在under隊列,每個虛擬機具有相同的優先級,以保證每個虛擬機得到公平的對待;Linux內核每次從under隊列的隊首取一個就緒的虛擬機進程,使之成為下一個被調度的進程,該虛擬機進程的時間片隨著運行時間而減小,當該虛擬機進程的運行時間達到且其時間片不為0時,將該虛擬機進程移到under隊列的隊尾,接著選擇under隊列的下一個隊首進程投入運行;當某一個虛擬機進程的時間片減少為0時,便被放入到over隊列;當under隊列為空時,互換under隊列和over隊列的指針,并重新賦值所有虛擬機進程的初始時間片值,繼續參與調度,周而復始;步驟4設置虛擬機進程為不可搶占進程;如果虛擬機進程在運行期間,由一個優先級更高的進程到來,此時并不是直接搶占虛擬機進程的運行權,而是將虛擬機進程的need_shed置位,待此虛擬機進程運行完畢讓出處理器資源后,立即進行調度,以保證虛擬機進程在運行期間不可搶占;步驟二根據虛擬機中業務的需求,動態調整各虛擬機的資源,使虛擬機更好的適應其客戶操作系統中業務的需求;具體實現步驟為步驟1根據虛擬機中的業務需求,將其分為計算密集型和I/O密集型;tasK_struct結構體的sleep_avg域記錄一個虛擬機進程的休眠時間和執行時間,當一個進程從休眠狀態恢復到執行狀態,sleep_avg會隨其休眠時間的長短而增長,直到一個預定的閾值為止;相反,虛擬機進程每運行一個時鐘節拍,sleep_avg就相應的減少,直到0為止;步驟2在進行重新計算優先級和時間片時,根據sleep_avg值對兩種不同的虛擬機進行不同的獎懲;每一個虛擬機進程都有一個相同的初始優先級,當所有虛擬機進程的時間片用完時,需要重新計算優先級和時間片,此時根據sleep_avg的值分別對每一個虛擬機進程的優先級進行調整,以便使各個虛擬機進程在新一輪調度中能夠更好的滿足業務的需求,達到自適應調整的能力。
全文摘要
一種基于內核虛擬機調度策略的實現方法,該方法有兩大步驟步驟一將Linux進程分為普通進程,虛擬機進程和實時進程,使虛擬機進程的優先級介于普通進程和實時進程之間,并為其提供特殊的調度算法;步驟二根據虛擬機中業務的需求,將其分為計算密集型和I/O密集型;動態調整各虛擬機的資源,使虛擬機更好的適應其客戶操作系統中業務的需求;該方法使內核虛擬機在調度過程中得到了優先調度,多虛擬機時能夠公平對待各個虛擬機,并能夠根據虛擬機中的業務需求動態調整虛擬機資源,很好的滿足了內核虛擬機的調度需求。它在計算機虛擬機調度器技術領域里具有實用價值和廣闊地應用前景。
文檔編號G06F9/455GK101894047SQ20101020849
公開日2010年11月24日 申請日期2010年6月24日 優先權日2010年6月24日
發明者丁濤, 張冰, 董翰飛, 郝沁汾 申請人:北京航空航天大學