当CPU没有任务的时候该搞点啥

贴出原文地址以防止不遵守共享协议:https://lwn.net

CPU没有任务时,认为内核把什么都不做作为一件简单的任务是合理的,但事实却并非如此。在Kernel Recipes 2018,Rafael Wysocki讨论了当CPU没事儿的时候干啥,内核如何处理,在当前阶段存在的问题,以及他最近重做的内核idle loop对非工作中的系统的省电性的提升。

idle loop(在内核的空闲循环,也是空闲任务,空闲也是任务)是Wysocki维护的一个内核子系统,控制CPU在没有任务的时候做的事。为了方便讨论,Wysocki先提出了定义:对于一个CPU就是一个能够从内存取指令并在其他CPU执行指令的同时执行指令的实体。在一个简单的单核单指令流系统,此核即CPU;如果处理器有多个核,那么每个核都是一个CPU。如果每个核都为同步指令expose多个接口,也就是Inter所谓的超线程,那么每一个超线程都是一个CPU。

一个CPU没task运行的时候,就是idle。更精确的说,linux内核的内部调度类,包含特殊的idle类。如果在这些调度类中都没有任务,则CPU被认为是idle,如果硬件没有对此没啥考虑,则CPU就会执行无用的指令直到有任务需要它做。无论如何,这都是浪费电,所以大多数CPU都支持由内核操作进入一些低耗电状态,直到它们需要执行任务。

idle状态的进入或退出不是没有消耗的。进入或退出都需要一些时间,并且耗电较普通状态也会有短暂上升。尽管越多的深度idle状态会降低耗点,但同时也会提升进入/退出idle的能耗。这就意味着对于短idle周期来说,浅度idle状态才能最好的利用系统资源;对于长 idle周期,深度idle状态将会合理的节省idle周期内的能耗。因此内核最感兴趣的就是在决定idle深度前,怎样预测CPU将会idle的周期。这就是idle loop的工作。

在idle loop,CPU调度器因为没有任务而发现CPU空闲。调度器就会执行到idle管家(本博主擅自起的名字,管家-governor),管家会尽可能的预测合适的idle状态。当前内核有menu和ladder两个idle管家,分别面向不同场景,不过大体都是做同样的事:追踪系统状态,CPU idle时间和结束idle的时长。这是为了预测一个新的CPU idle将要持续的时间,以及其合适的idle状态。

这一工作由与CPU调度器tick而变得困难,tick是为了分时共享CPU:在单CPU上跑多个任务,每个任务都只能运行一会儿,其他我就不说了。这一tick不需要在idle的CPU上发生,因为也没有任务需要切换。另外,如果tick允许运行在otherwise-idle CPU,它会限制CPU保持idle的时长,是管家不能选择更深的idle状态。因此在4.16以后的内核中,调度器会在调用管家之前关闭tick。当CPU被中断唤醒,调度器决定是否有任务,有任务才开启tick。

如果管家预测结果是长idle,idle周期也确实长,则关键命中:CPU将会进入深度idle状态,耗电节省,但如果idle周期短,则未命中,因为进入深度idle状态的开销将不能由省电补偿。更糟糕的是,当管家预测为短idle,若实际为长idle则未命中浪费电,若实际为短idle,关/开tick就不必要了,因为关/开tick也是需要开销的。

Wysocki 考虑尝试重新设计关于这方面的管家,认为关键问题是在管家被调之前,也就是推荐idle状态之前tick就关闭了。因此,他为4.17内核重写idle loop,使tick在管家调用之后再被操作。如果推荐长idle,tick就会关闭,也就不会过早唤醒CPU。如果推荐短idle,则tick会保持开启以避免关/开tick的开销。这就意味着tick同样是安全的唤醒CPU的事件,在idle比预期长的情况下,使管家有机会改正。

当idle CPU被中断唤醒,无论是由于tick或其他时间,调度器迅速决定是否有任务要做。如果有,则重启tick(如果关了);如果没有,管家会立刻被再次调用。这就意味着无论tick运行与否,管家都会被调,因此管家需要重写来将此情况纳入考虑。

重查命中与否的表,Wysocki认为情况将会由此次重写改善。如果长idle被预测到,tick将会停止,因此不需要改;实际为长idle则命中,短则失败。但如果预测到短idle,而实际也是短,我们将会节省关/开tick的开销;如果实际为长idle,未关闭的定制器将会唤醒CPU,并在预测的时候给我们一个额外的bit。

理论并不能代替真实数据,Wysocki已经在很多系统上对此进行了测试。旧idle loop比新的idle耗电多,并且更可预测,耗电量波动更少。如Wysocki所言,新的方法预测得到的短idle比旧的更少,但更正确。

还有 15% 的精彩内容
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
支付 ¥1.00 继续阅读
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,039评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,426评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,417评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,868评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,892评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,692评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,416评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,326评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,782评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,957评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,102评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,790评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,442评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,996评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,113评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,332评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,044评论 2 355

推荐阅读更多精彩内容