10 行代碼玩轉(zhuǎn)彈性調(diào)度的小把戲(彈性調(diào)班什么意思)
作者 | dog250
責編 | 唐小引
頭圖 | CSDN 下載自東方 IC
出品 | CSDN
Linux 的進程調(diào)度器是通用的調(diào)度器,無論是 O(n)O(n),O(1)O(1),還是 CFS,均是基于統(tǒng)一的指標來對待所有進程的。也就是說,進程甚至無法自主退讓。
只要確定了一個進程的優(yōu)先級,無論是是什么調(diào)度算法,該進程的地位總是不會變化,如果能做到下面的策略就好了:
-
系統(tǒng)中進程多了,就加速退讓。
系統(tǒng)中進程少了,就加速搶占。
工人來了,就退讓。
經(jīng)理來了,就搶占。
……
考慮一個進程 A 在一個特定的系統(tǒng)中運行,它最多只能用 40%的 CPU,此時,如果有另外的待運行進程,那么這些進程自然分攤另外 60%的 CPU,如果再來一個進程 A 呢?顯然,兩個進程 A 的 CPU 時間均會減少。
能不能保證兩個進程 A 仍然分別使用 40%的 CPU,然后其它進程分攤剩余 20%的 CPU 呢?很難!
你可能說可以配 group 啊,但是這必須有一個靜態(tài)的配置過程,很難動態(tài)自適應(yīng)。
換句話說,Linux 的調(diào)度器是非彈性的!
下面的代碼展示了一個簡單的彈性調(diào)度:
#!/usr/local/bin/stap -g
probe kernel.function("__enqueue_entity")
{
task = _task_of($se)
pid = @cast(task, "struct task_struct")->pid
if ($1 == pid) {
_nr = $cfs_rq->nr_running
t = $se->vruntime;
$se->vruntime = t 3000000*(_nr - 1)
}
}
意思是指定進程根據(jù)系統(tǒng)中負載的數(shù)量來退讓:
-
系統(tǒng)負載越高,指定進程占有 CPU 時間比例越低。
系統(tǒng)負載越低,指定進程占有 CPU 時間比例越高。
來來來,看效果:
可以看到:
-
當只有一個 loop 的時候,它占用 100%的 CPU。
當再生一個 loop 的時候,它幾乎和第一個 loop 平分 CPU。
當越來越多的 loop 運行的時候,第一個 loop 的 CPU 份額逐漸降低。
本是同根生,只有第一個 loop 被彈性了。
嗯,效果還行,但不夠平滑。試試二次曲線, or 三次曲線?
$se->vruntime = t 200*(_nr - 1)*_nr*_nr
// or
// $se->vruntime = t 20000*(_nr - 1)*_nr
200 何來?調(diào)一手好參數(shù)是必要的。
此外,我這里彈性策略過于單一,其實是可以設(shè)計的足夠復雜的,比如針對特定進程的特定策略,即便是簡單的雙斜率直線段,也比我這個 OK,是吧,不多說。
有人問,如何找到要修改的代碼在哪里,只要對 Linux 內(nèi)核的執(zhí)行原理足夠熟悉,這并不難,對于手藝人而言,阿基米德,魯班,庖丁,黃道婆這些人的地位是堪比歐幾里得,笛卡爾的。
原文鏈接:https://blog.csdn.net/dog250/article/details/108281228
點分享