一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

討論一下Linux的各種躺平姿勢

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Liam ? 2021-06-13 17:59 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

CPU 就和皮鞋廠的工人一樣, 無可奈何之時(shí)也得躺平。歷代CPU的架構(gòu)師都有一顆仁慈的心——給自己的產(chǎn)品留下了躺平的功能,而且是一代更比一代強(qiáng)。相關(guān)的指令有HLT/PAUSE/MWAIT/UMWAT/TPAUSE,其中我最喜愛的是UMWAIT,它的妙處我們后面再說。

當(dāng)然經(jīng)理并不會輕易讓CPU工人去摸魚, 必須滿足一定的條件。Linux 內(nèi)核中那么嚴(yán)格說來是由Scheduler 來判斷目前的工作量是否飽滿。如果工作量實(shí)在不夠,也只好讓CPU劃劃水, 睜只眼閉只眼, 好歹省點(diǎn)電費(fèi)不是。雖然在CPU層面摸魚的手段花樣百出, 但是在OS層面只有一個(gè)抽象的概念就是IDLE。在這個(gè)時(shí)候經(jīng)理表面上放任CPU工人劃水, 其實(shí)打的是省電的小九九,這也算是Win-Win的帕累托改進(jìn)。那么問題就來了, Scheduler 到底是如何判斷當(dāng)前工作量不飽滿呢?

調(diào)度器中idle 觸發(fā)條件

Linux Scheduler 為每一個(gè)CPU工人都維護(hù)了一個(gè)RunQueue 可以認(rèn)為是一個(gè)任務(wù)列表, 當(dāng)且僅當(dāng)這個(gè)列表里所有的任務(wù)都不是runnable的狀態(tài)時(shí), Scheduler 才會切換到idle process。也就是說這個(gè)時(shí)候CPU工人完全無所事事, 必須休息節(jié)省體力以及節(jié)省電費(fèi)! 同時(shí)還要注意可以通過nohz/nohz_full啟動(dòng)參數(shù)減少tick 中斷對正在休息的CPU工人的干擾!

身世顯赫

那么首先我們要考慮得是idle進(jìn)程從何而來,在描述細(xì)節(jié)之前我先劇透一下, idle進(jìn)程雖然名字聽起來不怎么樣, 但是出身顯赫。首個(gè)idle進(jìn)程實(shí)際上轉(zhuǎn)化自0號進(jìn)程!內(nèi)核成為了生活的真相帝, 躺平并不是人人都能擁有的選項(xiàng)!

具體的過程則是說來話長. 在開辟鴻蒙之初, kernel 所有的進(jìn)程之始祖是一個(gè)靜態(tài)的結(jié)構(gòu)體:

struct task_struct init_task

init_task 并非由任何kernel API所創(chuàng)建, 是所有進(jìn)程的祖先, 名副其實(shí)的the one。

它肩負(fù)了非常重要的職責(zé), 例如創(chuàng)建首個(gè)內(nèi)核線程kernel_init。從而達(dá)到 一生二,二生三,三生萬物 的效果。不過今天這些不是本文的重點(diǎn), 重點(diǎn)在于大功告成之際, init_task 并未事了拂衣去而是默默的轉(zhuǎn)化成了idle 進(jìn)程。它繼續(xù)無言的守護(hù)著整個(gè)系統(tǒng), 俯首甘當(dāng)孺子牛啊。

這里參見代碼 init/main.c line 451,這里是函數(shù)rest_init 的最后階段大家可以發(fā)現(xiàn)調(diào)用了 cpu_startup_entry 這個(gè)函數(shù)。

我們可以跳轉(zhuǎn)到 kernel/sched/idle.c 來一窺細(xì)節(jié). 這里第一個(gè)arch_cpu_idle_entry 是可選接口,x86并沒有實(shí)現(xiàn),核心中的核心還是函數(shù) do_idle()-- just 躺平.

如果沒有在啟動(dòng)時(shí)強(qiáng)制idle 模式為poll, 則我們將在這里進(jìn)入真正的躺平函數(shù) cpuidle_idle_call.

在smp系統(tǒng)中 core0 以外的其它c(diǎn)ore 也會通過 start_secondary 函數(shù)最終產(chǎn)生0號進(jìn)程且調(diào)用cpu_startup_entry 來進(jìn)入idle loop之中。

CPU各種“躺平”的姿勢

各個(gè)廠子出產(chǎn)的CPU工人的idle 姿勢也是慢慢演化的, 從簡入繁, 花樣百出。下面我們一起來浮光掠影的看一下這些"超能力"。

X86

HLT

這是初代的idle 指令, 于486DX時(shí)代引入. 首先只有在ring0的特權(quán)級別才能執(zhí)行HLT指令, 同時(shí)執(zhí) 行的效果是 CPU 進(jìn)入了C1/C1E state(參考ACPI標(biāo)準(zhǔn))。嚴(yán)格說起來只能算是摸魚0.1v。APIC/BUS /CACHE 都是照常運(yùn)轉(zhuǎn), 只要中斷發(fā)生, CPU工人立即就要回到產(chǎn)線繼續(xù)搬磚。C1E 稍微又優(yōu)待了CPU點(diǎn), 停止內(nèi)部時(shí)鐘又降了壓, 比較體貼。

PAUSE

這個(gè)也是非常早期的指令(Pentium 4)許可CPU 工人打個(gè)盹,大概從幾個(gè)到幾十個(gè)cycles吧(各代CPU有差異)。為什么要打盹呢?其實(shí)主要是要降低CPU工人在特定情況下(spin-lock)給內(nèi)存控制器帶來的壓力,與其讓CPU工人阻塞了內(nèi)存控器, 不如讓他打個(gè)盹吧。在最近的幾代Xeon之上還附帶了降低功耗的buff。

MWAIT/MONITOR

新一代CPU架構(gòu)師回顧了前輩的設(shè)計(jì), 覺得CPU工人的權(quán)力完全沒有得到充分的照顧, 應(yīng)該給予更進(jìn)一步的休息機(jī)會乃至真正的躺平!而且喚醒的條件又多了一個(gè), 除了中斷這種強(qiáng)喚醒模式以外, 又加了內(nèi)存的CacheLine Invalidate喚醒。你的鄰居CPU 除了敲門以外還多了拿橡皮筋彈窗戶玻璃的渠道。首先這兩條指令也只能在ring0 級別執(zhí)行, 首先是調(diào)用MONITOR 地址范圍, 其次是MWAIT 進(jìn)入休眠,一旦該地址的內(nèi)存被任何其它的主體修改, 則喚醒CPU工人起來繼續(xù)搬磚。同時(shí)這次最大的改進(jìn)是可以通過MWAIT 進(jìn)入各種不同的Cstate。其中C6 是我心目中真正的躺平 CPU 電壓可以歸0同時(shí)cache 也停, 實(shí)至名歸啊。

最常見的C State 狀態(tài)詳細(xì)描述,引自[2]

Cstate Name Description
C0 Operating State CPU fully turned on
C1E Enhanced Halt Stops CPU main internal clocks via software and reduces CPU voltage; bus interface unit and APIC are kept running at full speed
C3 Deep Sleep Stops all CPU internal and external clocks
C6 Deep Power Down Reduces the CPU internal voltage to any value, including 0 Volts

UMWAIT/UMONITOR

MWAIT雖好, 但是奈何必須在ring0特權(quán)級下執(zhí)行, 如果是一些特定的用戶級應(yīng)用例如DPDK, Linux的 idle driver 是很難得到執(zhí)行的機(jī)會,所以CPU架構(gòu)師又生憐憫之心, 允許CPU在用戶級也能進(jìn)入躺平的模式, 不過作為妥協(xié)連C1 state都不行,只能進(jìn)入 C0.1/C0.2 等神秘模式。效果還有待觀察,不過話說回來SPR這代Xeon才開始支持....距離上市少說還得1年之久。

TPAUSE

UMWAIT 指令的升級加強(qiáng)版, 附帶了一個(gè)timer。TPAUSE 可以讓CPU工人根據(jù)規(guī)定好的時(shí)間進(jìn)行休息, 時(shí)間一到, 立刻繼續(xù)搬磚。當(dāng)然這也是一個(gè)簇新簇新的指令,大家還要等待SPR。

ARM

ARM的Idle-state 級別情況比較復(fù)雜一些, 更多的是和具體的芯片實(shí)現(xiàn)相關(guān). 但是總體上也是把握幾個(gè)大的類別:

只是停止CPU內(nèi)部時(shí)鐘

CPU降頻

停止給Cache供電

停止給CPU供電

和X86 相比 Arm的喚醒機(jī)制沒有和MESI協(xié)議連接有些遺憾(也就是沒有實(shí)現(xiàn)通過MEM 地址監(jiān)控的方式達(dá)成喚醒).

YEILD

這條頗為類似 PAUSE基本功能接近,使用場景也接近(spin lock).

WFE/WFI

這兩條指令顧名思義 wait for event/ wait for interrupt,中斷這條大家都可以理解類似HLT,那么event這條就值得看看了。ARM架構(gòu)可以從一個(gè)CPU向所有其它CPU 發(fā)送event(sev 指令),我的理解類似IPI廣播,收到了此event的CPU如果處于idle狀態(tài), 則需要立即喚醒。(注:和宋老師討論以后發(fā)現(xiàn) event 和IPI的一個(gè)區(qū)別是不需要ISR來響應(yīng),同時(shí)event并不能喚醒由于WFI指令進(jìn)入的idle,這個(gè)有點(diǎn)囧,反過來中斷可以喚醒由于WFE進(jìn)入的idle。這兩個(gè)躺平姿勢水很深啊)

軟件實(shí)現(xiàn)

除了硬件的各種花式躺平技術(shù)之外還有兩類“偽躺平”技術(shù)。

idle polling

通過啟動(dòng)參數(shù), 我們可以指定cpu的idle 進(jìn)程并不調(diào)用硬件提供的idle功能而僅僅是polling, 這種情況主要用于需要極低的CPU從idle狀態(tài)返回時(shí)延的場景。那么如果壓根沒有進(jìn)入實(shí)際的idle狀態(tài),當(dāng)然時(shí)延是極低的,同時(shí)也能融入到idle整體的框架,不至于破壞規(guī)矩開特例。

halt-polling

在打開虛擬化的場景下, 事情就變得更加有趣了。大多數(shù)情況下, qemu 會缺省的只對guest 提供HLT指令作為idle的唯一機(jī)制,但是 HLT 指令毫無懸念的會觸發(fā)VMEXIT。雖然說大多數(shù)情況下kvm看到exit reason 是HLT 也只是執(zhí)行poll而已, 但是VMEXIT/VM_RESUME 還是如此的痛,畢竟幾千個(gè)cycles已經(jīng)無謂流逝, 追求極致的我們怎么能放任資源浪費(fèi)。于是Redhat在Guest端引入了halt poll 機(jī)制, 也就是說如果matrix中的CPU工人首先開始假摸魚(poll), 如果假摸魚時(shí)間超過了閾值才真的去觸發(fā)HLT指令。如果很快就被從假模魚狀態(tài)拉回去搬磚, 則省去了出入matrix的費(fèi)用(經(jīng)理得意的笑了)。

最后軟件硬件各路躺平姿勢花樣繁多, 內(nèi)核無奈又祭出了抽象大法把idle的時(shí)長與返回時(shí)延的選擇與具體執(zhí)行idle的機(jī)制分離開來。

idle governor 就負(fù)責(zé)做時(shí)長與時(shí)延的選擇,也可以稱為 idle -select。

idle driver 則是負(fù)責(zé)通過我們上面描述的各種軟硬件機(jī)制來實(shí)現(xiàn)governor指定的目標(biāo)。同時(shí)向governor menu 經(jīng)理提供各種不同機(jī)制的性能參數(shù),以供menu經(jīng)理選擇,就是所謂的idle-enter。

idle governor 缺省的算法只有一個(gè)就是menu, 還有3個(gè)候選的ladder/TEO/haltpoll 算法但是一般需要重新編譯內(nèi)核來激活。

ladder 算法故名意思, 是首先從能耗較高/返回時(shí)延較小的狀態(tài)開始,當(dāng)系統(tǒng)idle超過了閾值再進(jìn)入更深的節(jié)能狀態(tài),從而逐步升級節(jié)能狀態(tài)。俗稱添油戰(zhàn)術(shù)也可以美其名曰“快速迭代”。

menu 算法單從名字看則有點(diǎn)讓人摸不到頭腦,其內(nèi)部機(jī)制也確實(shí)頗為復(fù)雜,menu算法主要是要在節(jié)能狀態(tài)的停留時(shí)間與系統(tǒng)能容忍的返回時(shí)延之間做權(quán)衡以達(dá)到最佳效果。

請?jiān)徫曳浅2痪_地描述一下menu。menu仿佛一個(gè)非常敬業(yè)的經(jīng)理凡事都要精算做出最優(yōu)選擇,CPU工人一旦休息再想打起精神干活這個(gè)轉(zhuǎn)換是有一個(gè)代價(jià)的, 往往需要口頭鼓勵(lì)(畫餅)+物質(zhì)鼓勵(lì)(肉夾饃)。那么經(jīng)理就要考慮如果工人休息時(shí)間太短,休息的好處遠(yuǎn)低于讓CPU工人重新振作的代價(jià),那么這個(gè)休息就是不合理的(無情啊)。而且休息也有好些種類, 從假休息到完全躺平, 到底哪一種休息狀態(tài)才是收益比最佳的? menu會無情的選擇那個(gè)休息帶來好處大于重新振作代價(jià)的方案。同時(shí)menu經(jīng)理還會受到來自客戶的壓力, 時(shí)延也是要滿足的。客戶的耐心大抵上都是不好的, menu經(jīng)理會瘋狂試探客戶的底線。它選擇的方案是滿足客戶耐心上限的情況下CPU工人消耗能耗最少的方案。同時(shí)做到以上兩點(diǎn) menu經(jīng)理大約才能有希望完成OKR/KPI。

結(jié)語

今天我們一起浮光掠影的討論了一下Linux的各種躺平姿勢,從中能領(lǐng)略到一代代CPU架構(gòu)師對CPU打工人的關(guān)愛。最后我衷心的祝愿CPU打工人在層出不窮的各類躺平技術(shù)加持下,最終能同各位經(jīng)理一起實(shí)現(xiàn)碳中和的OKR/KPI。

原文標(biāo)題:漫話Linux之“躺平”: IDLE 子系統(tǒng)

文章出處:【微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11077

    瀏覽量

    217030
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213748

原文標(biāo)題:漫話Linux之“躺平”: IDLE 子系統(tǒng)

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    “碰一下”支付終端應(yīng)用在酒店:智能無卡入住與客房控制

    “碰一下”支付終端和“碰一下”支付機(jī)具今年已在各種餐飲零售門店推廣應(yīng)用。就連天波小編家附近的村口小超市也用上了“碰一下”支付終端。近日,鹵味龍頭企業(yè)絕味食品宣布,全國門店將接入“支付寶
    的頭像 發(fā)表于 07-04 09:57 ?167次閱讀
    “碰<b class='flag-5'>一下</b>”支付終端應(yīng)用在酒店:智能無卡入住與客房控制

    上電時(shí)GPIO控制的LED偶爾詭異地亮了一下

    快速上下電時(shí),主控1.8V的GPIO控制的LED會亮一下。放久點(diǎn)再上電則不會異常亮。仔細(xì)排查發(fā)現(xiàn)1.8V比0.9V先上電,再深入排查發(fā)現(xiàn)快速上下電時(shí)1.8V電源的RC延時(shí)使能失效,上電時(shí)序異常,主控工作異常。
    的頭像 發(fā)表于 06-18 14:16 ?198次閱讀
    上電時(shí)GPIO控制的LED偶爾詭異地亮了<b class='flag-5'>一下</b>

    一下終端,讓自助售貨機(jī)秒變 “家里的冰箱”

    繼刷臉支付后,支付寶近日又推出了新的支付方式——碰一下支付。只需將手機(jī)輕輕靠近支付寶“碰一下”支付終端,即可完成支付,比以往要先解鎖手機(jī),調(diào)出APP的付款碼再支付的操作環(huán)節(jié)要便捷和省時(shí)許多?!芭?b class='flag-5'>一下
    的頭像 發(fā)表于 06-18 10:49 ?202次閱讀
    碰<b class='flag-5'>一下</b>終端,讓自助售貨機(jī)秒變 “家里的冰箱”

    人形機(jī)靈巧手求推薦

    預(yù)算2W左右吧,目前了解過鈦虎/靈心巧手的產(chǎn)品,主要是初次涉足這個(gè)行業(yè),比較門外漢,所以來論壇上想跟大家討論一下,求個(gè)推薦。 技術(shù)上的指標(biāo)要求: 1.精度超過±0.2mm 2.負(fù)載:3KG
    發(fā)表于 05-08 14:45

    LinuxVim編輯器的使用技巧

    【Vim】常用總結(jié)? 簡介? image 什么是vim?? Linux兩大編輯神器之 vim ? Linux/Unix使用最多的編輯器
    的頭像 發(fā)表于 04-01 17:36 ?548次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>Vim編輯器的使用技巧

    Linux安裝軟件有哪些方法

    里面沒有 apt 或者 yum 的時(shí)候,先看下系統(tǒng)的發(fā)行版。 以我的 Ubuntu 為例,第步選擇個(gè)合適的源,第二步更新軟件包列表,第三步安裝軟件包,超級簡單。 如果不知道軟件包的名字,可以嘗試去搜索一下關(guān)鍵字,然后找到對應(yīng)
    的頭像 發(fā)表于 02-08 09:41 ?637次閱讀

    初始化AFE4400的時(shí)候,哪些控制字是必須最先寫的?

    想使用AFE 4400,但是遇到了些問題: 在初始化AFE4400的時(shí)候,哪些控制字是必須最先寫的?初始化AFE4400之前,建立SPI通訊時(shí),CPU出送出的信號是正確的,但是AFE4400沒有返回的信號,是怎么回事? 歡迎大家提供建議討論一下啊。
    發(fā)表于 02-08 07:49

    “碰一下”支付背后的4G技術(shù)

    不知道你是否有留意,近期,在線下支付場景中,多了個(gè)支付寶“碰一下”支付的設(shè)備,只需要“解鎖手機(jī)—碰一下—確認(rèn)”即可完成支付,對比打開付款碼支付,步驟確實(shí)更加簡潔。
    的頭像 發(fā)表于 01-03 16:27 ?1878次閱讀

    支付寶發(fā)布新代AI視覺搜索“探一下

    支付寶近日正式推出了基于自研多模態(tài)大模型技術(shù)的新代AI視覺搜索產(chǎn)品——“探一下”。這創(chuàng)新產(chǎn)品的問世,標(biāo)志著支付寶在AI技術(shù)應(yīng)用領(lǐng)域邁出了重要步。 “探
    的頭像 發(fā)表于 12-31 10:49 ?560次閱讀

    干貨來嘍!實(shí)用樹莓派Linux編譯指南

    不友好,有沒有好的解決辦法? 今天來分享一下我的私藏干貨——樹莓派Linux編譯。編譯好之后,開發(fā)板只需插到樹莓派上連接電腦就可以直接用了,極其方便。 本文以樹莓派為例,其他板子只要帶Linux系統(tǒng)的,大體上也都可以按這個(gè)操作。
    的頭像 發(fā)表于 12-18 16:31 ?541次閱讀
    干貨來嘍!實(shí)用樹莓派<b class='flag-5'>Linux</b>編譯指南

    Linux文件壓縮打包的各種姿勢

    1.文件打包與壓縮 1.什么是文件壓縮? 將多個(gè)文件或目錄合并成為個(gè)特殊的文件。比如: 搬家…腦補(bǔ)畫面 img. 2.為什么要對文件進(jìn)行壓縮? 當(dāng)我們在傳輸大量的文件時(shí),通常都會選擇將該文件進(jìn)行
    的頭像 發(fā)表于 12-02 09:25 ?606次閱讀

    什么是交叉調(diào)整率?怎么改善?

    生活中多路輸出電源應(yīng)用廣泛,但是多路輸出電源的交叉調(diào)整率是個(gè)頭疼的問題。今天,我們就來討論一下交叉調(diào)整率的改善之道!
    的頭像 發(fā)表于 10-24 11:15 ?2298次閱讀
    什么是交叉調(diào)整率?怎么改善?

    觸摸屏驅(qū)動(dòng)板無法燒寫程序的相關(guān)原因

    每次聽到別人說是什么原因?qū)е掠|摸屏驅(qū)動(dòng)板無法燒寫程序,就很想去討論一下。今天就跟大家聊聊到底是什么原因?qū)е碌摹?/div>
    的頭像 發(fā)表于 10-21 11:19 ?789次閱讀

    自感線圈斷電時(shí)燈泡為啥會閃亮一下

    探討自感線圈斷電時(shí)燈泡為什么會閃亮一下的原因: 電流變化 :當(dāng)電路中的電源被切斷時(shí),流經(jīng)線圈的電流會突然減少。這種快速的電流變化會導(dǎo)致自感電動(dòng)勢的產(chǎn)生。 自感電動(dòng)勢 :由于電流的快速減少,線圈中的自感電動(dòng)勢會迅
    的頭像 發(fā)表于 08-29 14:36 ?3803次閱讀

    Linux內(nèi)核測試技術(shù)

    。內(nèi)核測試技術(shù)是實(shí)現(xiàn)這目標(biāo)的關(guān)鍵手段。本文將詳細(xì)介紹 Linux 內(nèi)核測試的各種技術(shù),包括單元測試、集成測試、功能測試和性能測試等,并討論不同測試方法的優(yōu)缺點(diǎn)及其適用場景。
    的頭像 發(fā)表于 08-13 13:42 ?1285次閱讀
    <b class='flag-5'>Linux</b>內(nèi)核測試技術(shù)