1. 程式人生 > >xen credit scheduler and policy

xen credit scheduler and policy

最近在研究xen的vcpu 排程和cpu qos策略,現在預設的scheduler是credit, 對應的程式碼是sched_credit.c

xen支援好幾種控制策略,效果最好的當選pin, 靈活性最好的是weight, 控制和靈活兼備的就是cap,據說人家amazon在06年推ecu的時候就是用了類似的技術。

pin的實現比較好了解,也就是set affinity,個人對cap,weight的實現比較感興趣,這兩者應該是類似,好了,開始聊下程式碼

xen裡面首先有個總的排程函式schedule(),這是SCHEDULE_SOFTIRQ的中斷處理函式,主動觸發排程的方式就是raise_softirq,每個pcpu有個timer,裡面就是定期raise_softirq。

schedule裡面主要的事情就是呼叫具體實現sched_credit裡面的do_schedule來挑選下一個next任務,之後對prev和next的vcpu state進行更新,prev根據當前的狀態,更新成blocked,runnable,offline, next更新成running, 再呼叫context_switch函式來完成真正一些暫存器的儲存和切換

sched_credit的do_schedule是由csched_schedule實現的,這裡面會先去取當前cpu 的runq的下一個任務,取出來之後判斷下當前的pri,如果是over,那表示它的credit已經用完了,不能被run了,需要重新挑一個出來,如果大於over,表示可以run, 就會從runq裡面摘出來。

每個pcpu還有一個timer,csched_tick, 它會計算當前vcpu使用了多少credit之類的accounting, 並把每個runq重新排序

當然還少不了一個主timer csched_acct, 定期去計算當前活動dom的活動vcpu裡面的credit值,根據一定的策略如weight和cap來決定每個vcpu最後分到的credit值,如果當前credit小於0,那麼表示credit不夠了,優先順序要降低,prio設定成over,如果有設定cap,那麼會pause住,等到後面有credit再喚醒。如果credit > 0那麼,優先順序就提高了,prio設定為under, 如果之前因為cap而被pause的,這個時候可以unpause起來,最後通知說,我需要runq重新排序

中間weight和cap對於credit計算的影響如下:

首先有個CSCHED_CREDITS_PER_ACCT表示這次排程裡面每個pcpu能夠分配的credit絕對值

credit_total=n core * CSCHED_CREDITS_PER_ACCT

然後有個當前credit_fair會根據你的weight所佔的比例來決定你的credit

credit_peak表示你的活動cpu數 * CSCHED_CREDITS_PER_ACCT,這就是你的vcpu能夠達到的上限,也就是獨佔物理cpu

credit_cap根據你的cap來決定你擁有多少物理cpu的能力,cap * CSCHED_CREDITS_PER_ACCT

如果有cap, 那麼creadit_cap < credit_peak時,credit_peak=credit_cap,也就是說你的上線由你的credit_cap決定

最後在credit_peak和credit_fair裡面取最小的那個值作為整個domain的credit

再把domain的credit除以當前domain活動的cpu數,就變成domain的vcpu的credit

至此xen credit scheduler的基本原理就差不多說完了,後續一些細節點慢慢再補充