利用 sched_ext 作為框架撰寫一個將所有任務全部塞給指定 CPU core 執行的排程器!參考 scx_central
與 scx_simple
。
在初始化函式 randmigrate_init
當中只需要做兩件事,讓該排程器排程所有任務以及建立一個 FALLBACK_DSQ 。
挑選 CPU 處則是任意挑選即可,此處不是最後真正任務被分配到的 CPU 。
select_cpu 當中沒有利用到 scx_bpf_dispatch()
也就意味著 ops.enqueue()
一定會被呼叫,我們實作自己的 enqueue()
,概念和 select_cpu()
類似,若任務是 kthread 的任務則分配到 SCX_LOCAL
當中,若不是則放到 FALLBACK_DSQ_ID
當中並喚醒挑選到的 CPU 。
dispatch()
則是在 CPU 發現自己的 local dsq 當中沒有任務可執行時會呼叫的函式,我們實作的原理也很簡單,若非我們指定要轟炸的 CPU ,則不做任何事讓它回到 idle state 。若是的話則從 FALLBACK_DSQ_ID
當中拿任務出來。
到此處為止就大功告成了!
編譯後將排程器掛載至我們的系統當中,此時應該可以發現你的電腦反應變得很慢,因為只有一顆 CPU 在做事。利用 htop
命令可以觀察到類似以下結果
只有一顆 CPU core 也就是 5 在工作而已,若是此時還利用 stress-ng
等工具產生大量 workload ,可以看到以下有趣的結果
整台電腦或者 server 會陷入嚴重卡頓的狀況,若使用 ssh 連線也會中斷,想停下 stress-ng
命令也需要等待很長的時間,非常有趣的過程!
原始程式碼在我的 github repo 的 scx_randmigrate 分支底下,按照原本 scx
的安裝方式即可在 build/scheds/c/scx_randmigrate
處使用此排程器!