欧美人与禽2O2O性论交,秋霞免费视频,国产美女视频免费观看网址,国产成人亚洲综合网色欲网

10 行代碼玩轉(zhuǎn)彈性調(diào)度的小把戲(彈性調(diào)班什么意思)

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 時間比例越高。

來來來,看效果:

10 行代碼玩轉(zhuǎn)彈性調(diào)度的小把戲(彈性調(diào)班什么意思)

可以看到:

  • 當只有一個 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

10 行代碼玩轉(zhuǎn)彈性調(diào)度的小把戲(彈性調(diào)班什么意思)10 行代碼玩轉(zhuǎn)彈性調(diào)度的小把戲(彈性調(diào)班什么意思)

10 行代碼玩轉(zhuǎn)彈性調(diào)度的小把戲(彈性調(diào)班什么意思)

點分享

10 行代碼玩轉(zhuǎn)彈性調(diào)度的小把戲(彈性調(diào)班什么意思)10 行代碼玩轉(zhuǎn)彈性調(diào)度的小把戲(彈性調(diào)班什么意思)

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號
公眾號
在線咨詢
分享本頁
返回頂部