Xen Credit調度算法詳細說明

Xen虛擬機調度實質上是虛擬CPU的調度。在Xen中,虛擬機通過其擁有的虛擬CPU運行任務,而虛擬CPU需要由Xen調度至物理CPU執行。對應用程序而言CPU調度分成兩個層次:首先VMM的虛擬CPU調度將物理CPU時間分配給各虛擬機的虛擬CPU;然後各虛擬機的進程調度負責將虛擬CPU的時間分給虛擬機內的各應用程序。Xen採用策略和機制分離的思想來簡化Xen的調度框架設計,並允許用戶通過實現調度框架的接口來滿足特定的需求。

Xen虛擬CPU調度將通用機制實現爲調度框架,而具體的調度策略則允許用戶根據需求在調度算法中實現。Xen曾先後採用過Borrowed Virtual Time(BVT)、Simple Earliest Deadline First(SEDF、Credit等調度算法,在較新的Xen版本中也正在不斷優化Credit2調度算法,爲其發展做鋪墊,本文主要還是針對現今默認的Credit調度算法進行介紹。

Credit調度算法按照權重共享CPU時間。Credit調度算法的參數主要包括表示權重的Weight和表示CPU時間上限的CAPWeight是一個相對值,Xen根據每個虛擬機的Weight值計算其應獲得的Credit值。Xen默認所有虛擬機的Weight值爲256,而CAP值初始化爲無上限限制的-1。管理員可以通過特權域0設置每一個虛擬機的這兩個參數。

  Credit1調度器基本框架如下如所示。


爲了便於理解上圖,先介紹幾個基本概念:

  csched_pcpu:物理cpu的調度信息,它主要是就緒的vcpu隊列,ticker計時器,用於每個tick週期計算當前運行的vcpu的credit值。

csched_vcpu:vcpu的調度信息,它位於pcpu的就緒隊列上,也位於活動vcpu列表上,可以得到它所屬的domain的調度信息,可以得到它的credit值與優先級

csched_dom:domain的調度信息,例如活動的vcpu列表,活動domain列表,domain的weight和cap值。

csched_private:credit調度算法的總體信息,例如調度鎖,cpu個數,主ticker計時器,用於每3個tick週期計算一次所有的credit值,當前總的weight值和credit值。

Credit1調度器的基本流程如下:

(1)在啓動xen時會初始化credit調度算法,創建一個idle_domain,它有和物理cpu個數相同的vcpu,每個vcpu位於對應的物理cpu上,用於佔位和空跑,相對於其它domain的vcpu,idle_domain的vcpu優先級是最低的。

(2)在初始化時__start_xen-->init_idle_domain-->scheduler_init中會將軟中斷和schedule()綁定,並設置每個pcpu的用於schedule的s_timer,其處理函數是s_timer_fn,主要是觸發軟中斷SCHEDULE_SOFTIRQ。schedule()會在每3個tick週期(30ms,即一個vcpu得到調度後運行的時間片)執行一次,該過程的結果爲該pcpu找出合適的vcpu和時間片,用於該vcpu在此pcpu上的運行,然後進行上下文切換。這個schedule過程是根據選擇的調度算法來確定的。

(3)在初始化domain時調度模塊會初始化其vcpu的調度信息,vcpu的初始化主要是把vcpu插入到其pcpu的運行就緒隊列runq上和活動vcpu列表中。如果發現其對應的pcpu還沒初始化,則按照下面的方法初始化該pcpu。

 (4)在初始化每個pcpu時會設置它的tick的timer,每個tick週期(10ms)會執行一次csched_tick,來更新該pcpu上運行的當前vcpu的credit值,減去credit_per_tick,該值是100。當活動vcpu列表爲空時說明所有vcpu的credit都爲負,則重新計算credit值。否則通過pick後pcpu是否變化來檢查是否需要進行vcpu的遷移,如果需要則觸發軟中斷,執行schedule算法。

  (5)credit算法在執行schedule時,會首先獲得該pcpu的就緒隊列runq上隊首vcpu,即snext,檢查其credit值有沒有用完,如果沒有用完直接返回。如果用完表明該pcpu的就緒隊列上沒有under或boost狀態的vcpu,則進行負載均衡,查找其它pcpu上優先級較高的vcpu,執行run_steal把它偷過來運行。如果還沒有找到合適的,就返回之前得到的snext

  (6)主ticker的master_timer由csched_priv持有,在csched_start_tickers裏初始化,它每3個tick週期通過csched_acct來計算所有domain的vcpu的credit值,主要是根據當前credit總值,每個domain佔用的權重weight和比例上限cap,計算出每個domain分得的credit值,然後再平均分配到每個vcpu上,vcpu的credit值就等於原有的credit值和新分到的credit之和。根據vcpu最新的credit值來確定vcpu的調度優先級是over還是under,如果是over且cap有設置,則執行sleep,把自己調度出來,等待下次判斷和調度。

Credit算法中,每個物理CPU上的虛擬CPU均保存在運行隊列中,並按照其優先級順序排列。虛擬CPU的狀態共有四種,分別是IDLE、OVER、UNDER以及BOOST,其中IDLE狀態表示該虛擬CPU屬於idle_domain,具有最低的優先級;用完其Credit值的虛擬CPU會進入OVER狀態並且無法被調度;UNDER狀態下的虛擬CPU按照循環輪轉算法週期性的被調度;當虛擬CPU因I/O操作被喚醒後,進入BOOST狀態,BOOST狀態的虛擬CPU具有最高優先級,Xen會優先調度處於BOOST狀態的虛擬CPU。

Xen的Credit以公平共享資源著稱,但是其I/O性能很容易受到計算密集型應用的干擾,尤其是系統中VCPU數目很多,並且運行了計算密集型應用時,延時增長非常迅速,在如今的Credit2調度器設計中,充分的考慮了I/O型負載的特性,優化了時間片,I/O權重,調度隊列等,相比於Credit調度器大大地改善了I/O性能。但是如今Credit2還在進一步改進與測試中,還沒有被設定爲默認的調度器!






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章