进程|10 行代码玩转弹性调度的小把戏
_本文原题:10 行代码玩转弹性调度的小把戏
本文插图
作者 | dog250
责编 | 唐小引
头 图 | CSDN 下载自东方 IC
出品 | CSDN
Linux 的进程调度器是通用的调度器 , 无论是 O(n)O(n) , O(1)O(1) , 还是 CFS , 均是基于统一的指标来对待所有进程的 。 也就是说 , 进程甚至无法自主退让 。
只要确定了一个进程的优先级 , 无论是是什么调度算法 , 该进程的地位总是不会变化 , 如果能做到下面的策略就好了:
- 系统中进程多了 , 就加速退让 。
- 系统中进程少了 , 就加速抢占 。
- 工人来了 , 就退让 。
- 经理来了 , 就抢占 。
- … …
能不能保证两个进程 A 仍然分别使用 40%的 CPU , 然后其它进程分摊剩余 20%的 CPU 呢?很难!
你可能说可以配 group 啊 , 但是这必须有一个静态的配置过程 , 很难动态自适应 。
换句话说 , Linux 的调度器是 非弹性的!
下面的代码展示了一个简单的弹性调度:
#!/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)
}
}
意思是指定进程根据系统中负载的数量来退让:
- 系统负载越高 , 指定进程占有 CPU 时间比例越低 。
- 系统负载越低 , 指定进程占有 CPU 时间比例越高 。
本文插图
可以看到:
- 当只有一个 loop 的时候 , 它占用 100%的 CPU 。
- 当再生一个 loop 的时候 , 它几乎和第一个 loop 平分 CPU 。
- 当越来越多的 loop 运行的时候 , 第一个 loop 的 CPU 份额逐渐降低 。
- 本是同根生 , 只有第一个 loop 被弹性了 。
$se->vruntime = t + 200*(_nr - 1)*_nr*_nr
// or
// $se->vruntime = t + 20000*(_nr - 1)*_nr
200 何来?调一手好参数是必要的 。
此外 , 我这里弹性策略过于单一 , 其实是可以设计的足够复杂的 , 比如针对特定进程的特定策略 , 即便是简单的双斜率直线段 , 也比我这个 OK , 是吧 , 不多说 。
【进程|10 行代码玩转弹性调度的小把戏】有人问 , 如何找到要修改的代码在哪里 , 只要对 Linux 内核的执行原理足够熟悉 , 这并不难 , 对于手艺人而言 , 阿基米德 , 鲁班 , 庖丁 , 黄道婆这些人的地位是堪比欧几里得 , 笛卡尔的 。
- 丫七大小姐|大一码的毛衣,慵懒又显气质
- 玩转广州|买一送一!999元抢天露山度假区无忧谷酒店,禅悟泡池房+双人无限次温泉+双早+景区大门票+游戏金赠券+餐饮代金券+篝火晚会~
- 玩转广州|588抢悦天下温泉度假酒店~别墅房+双早+无限次泳道游乐+网红玻璃船+灯光电音趴音乐节+参观300亩湿地公园+儿童乐园
- 华硕之声|摄影技巧:玩转秋天创意照!Get这些技巧
- 秋季|秋日简约通勤穿搭示范,25+上班这样穿,轻松玩转职场
- 爱卡汽车|路特斯发布LEVA架构 电动化进程再提速
- 玩转广州|299元抢亚婆田·白水寨~汤泉泡池房+2大1小早餐+亚婆田·白水寨门票
- 玩转广州|¥599入住一叶桃园度假酒店豪华大床房!双人特色早餐+土鸡火锅+多功能温矿泉泡池!南粤天然氧吧,回归大自然的理想胜地!
- 玩转广州|¥238元抢住清远金龟泉度假酒店,享双人自助早餐+溯溪登山+泡野溪温泉+游水疗泳池!
- 玩转广州|买1送1 !¥1988享增城·森林海2间湖山温泉房~房间私享泡池+送4张温泉票+双早~畅游威尼斯泳道~毗邻白水寨