能感知功耗的Linux調度器(EAS)

2021-03-02 Linux閱碼場

白嘉慶,西郵陳莉君教授門下研一學生。曾在華為西安研究所任C++開發一職,目前興趣是學習Linux內核網絡安全相關內容。

本文的翻譯宋寶華老師指導審閱。


2014年Linux內核峰會(Linux Kernel Summit 2014)上舉辦了為期一天的EAS主題研討會。來自Arm的Morten Rasmussen做會議主持,來自Linaro的Daniel Lezcano和Mike Turquette介紹了最近發布的EAS相關工具,從此EAS開始快速發展並被人所知,智能設備的廠商們爭先恐後地學著應用此技術。

節約能源的觀念我們並不陌生,可是讓內核學會自己節約能源卻是一件新鮮的事情,谷歌在2017年發布的Google Pixel 2就具備這一技術。EAS不僅讓Google Pixel 2功耗降低,還可以更快?快來看看這是怎麼回事。

註:

1.「core」 一詞在CPU相關文章中經常翻譯為「內核」,但是在本文中翻譯為「核」,以區別軟體的內核「kernel」。

2. big.LITTLE是由ARM公司於2011年提出的基於異構計算的CPU架構。在這個架構中,分為相對較耗電但運算能力強的核所組成的大核「big」,和相對耗電低但運算能力弱的核組成的小核「LITTLE」,這些核共享存儲器區段, 因此可以在大核和小核之間即時交換工作負載。採用big.LITTLE架構的CPU,可以同時擁有強大計算能力和節能的特點, 一般運用在行動裝置上。

3. OnePlus 3是一加手機第三代旗艦機,搭配高通驍龍820 處理器;2016.06.15 上市。OnePlus 3T搭配高通驍龍821處理器;OnePlus 6搭配高通驍龍845 處理器, 2018.05.18上市。本文發表於2018.6.30,主要對比分析了當時一加的最新產品OnePlus 6和Google最新產品Pixel 2 對EAS技術的應用情況。

原文連結

https://www.xda-developers.com/google-pixel-fastest-android-phone-eas/

這對您的下一款智慧型手機意味著什麼

當Linux還只是Linus Torvalds頭腦中的一個想法時,那個年代只有單核CPU,這些CPU的功耗很小。第一個商用處理器Intel 4004在單核上以740kHz的頻率運行。那時還不需要使用負載調度器(load scheduler)。負載調度器的出現是為數十年之後出現的IBM Power 4等雙核「龐然大物」準備的。它們運行在驚人的1.1GHz到1.9GHz之間,並且需要程序和系統的支持才能正確運行多核。我們如何讓這些機器硬體(即多核CPU)使用多核的軟體算法?您可能以前在我們的論壇上聽說過功耗感知調度(EAS)。這是Google Pixel智慧型手機表現如此出色的部分原因。EAS到底是有什麼了不起,以及我們如何應用它?在解釋之前,我們需要討論Linux調度器。

Linux調度器的演變輪轉調度

輪轉(round robin)是一個容易解釋也容易理解的概念,而且也不難理解其缺點。輪轉使用時間片為每個進程分配時間。假設我們的計算機上正在運行四個進程。

現在,讓我們描述輪轉調度器的工作。在繼續進行下一步之前,我們將為每個進程分配100毫秒(時間片)。這意味著進程A先執行100毫秒,然後輪到進程B執行,依此類推。如果應用程式的工作需要250毫秒才能完成,則僅需完成3次此過程即可完成工作!現在,將以上方法擴展到多核,以便將進程A和進程B分配給核1,將進程C和進程D分配給核2。這種方法被O(n)調度取代(O(n)調度類似於輪轉調度,但是新增了 epoch ,並允許動態分配時間),然後產生了O(1)調度(O(1)調度讓開銷最小化,且支持無限制的進程),最後產生了完全公平調度器(CFS)。CFS於2007年10月合併到Linux內核版本2.6.23中。

完全公平調度器

完全公平調度器自誕生以來就用在Android中,並且在非big.LITTLE設備上使用。它使用一種智能算法來確定處理順序,時間分配等。這是經過精心研究被稱為「加權公平排隊」調度算法的應用實例。CFS主要為機器上運行的系統進程和其他高優先級的進程提供優先權。如果要在big.LITTLE設備上運行,則所有核將被視為平等。這很不好,因為低功耗核可能被迫運行密集的應用程式,或者更糟的是發生相反的情況(譯者註:即一段時間內高功耗核運行的應用程式非常少,對高功耗核是一種浪費)。例如,聽音樂的解碼過程也許會在大核上執行,這就造成了不必要的功耗增加。這就是我們需要為big.LITTLE設備使用新調度器的原因,新調度器才能夠以節能方式識別和利用核差異。這就是異構多處理(HMP)的出現,它是大多數Android手機現在正在運行的標準調度器。

異構多處理

這是近年來發布的任何big.LITTLE設備(Google Pixel除外)的標準調度器。HMP利用big.LITTLE架構,將低優先級且不那麼繁重的工作委派給消耗更少功率的小核。HMP是「安全的」,即不會犯錯誤的,它知道哪些任務應該去大核,哪些應該去小核。它確實可以工作,並且相比EAS在開發方面所需的精力更少。(EAS會在下文詳細介紹。) HMP只是CFS的擴展,以使其具有功耗意識。

HMP不會猜測,即不會預測未來的進程。這沒毛病但這就是為什麼HMP設備不能像運行EAS的設備那麼流暢的原因,也是為什麼它會更耗電的原因。最後,HMP的不足使我們迎來了功耗感知調度(EAS),我堅信未來隨著更多OEM的採用,EAS將應用於ROM和內核開發。

功耗感知調度

功耗感知調度(EAS)是我們論壇用戶談論的下一件大事。如果您正在使用OnePlus 3(或Google Pixel),您肯定在論壇上聽說過OnePlus。最新的OnePlus 6搭配高通驍龍 845進入主流發布,因此,如果您擁有這些設備之一,那麼您已經擁有支持EAS的智慧型手機。諸如RenderZenith之類的內核形式的EAS 和諸如VertexOS和PureFusion之類的ROM 席捲了OnePlus 3論壇。當然,Google Pixel也附帶EAS。承諾延長電池壽命並提高性能,還有什麼貓膩呢?

功耗感知調度並非如此簡單,並不是CFS或HMP之類的每種設備都通用的。EAS要求我們基於功耗模型理解正在運行的處理器。這些功耗模型是由工程師團隊不斷測試並努力提供最佳性能而建立的。由於驍龍820和821基本相同,因此OnePlus 3上定製的內核使用Google Pixel功耗模型。配備驍龍845的設備可以使用EAS,因此OnePlus 6可以在某種程度上使用EAS 。雖然它不像Google Pixel設備在調整參數方面做的那麼好,但它也完成了這項工作。這是一個示例,儘管OnePlus 6在EAS方面擁有更好的處理器,但Pixel 2 XL在平滑度上仍勝過OnePlus 6。這兩個圖像均來自我們OnePlus 6以速度為導向的測試。

如果您看不懂這張圖片,可以試著看綠色指示線以下的圖像。超過綠線的任何內容均表示丟幀,在最壞的情況下,會出現明顯的卡頓。

EAS在OnePlus 6上的實現很有趣,因為OnePlus 6不像具有相同SoC的Google Pixel一樣熟練的使用EAS。調度器參數調整地不太合理,因此這可能解釋了為什麼它的性能效率不如您預期的那樣。它在功耗方面非常保守,系統會在大多數工作中優先考慮低功耗核。

可調參數只是傳遞給CPU governor的一組參數,這些參數會改變governor在頻率方面對某些情況的反應。然後,調度器決定將任務分配在不同處理器上。OnePlus 6的可調參數能在低功耗核上設置任務的優先級,可是這並不起什麼作用。而 Google Pixel 2具有巨大的輸入提升能力,所有8個核始終保持在線狀態。Google還使用了一個中斷負載均衡,它有助於消除丟幀並提高性能。

那麼EAS如何工作?為什麼僅在特定條件下如此有效?

功耗感知調度(EAS)需要使用功耗模型,就像上面提到的,EAS需要大量測試工作才能使其完美。EAS試圖統一內核的三個不同核心部分,它們各自獨立發揮作用,而功耗模型則有助於統一它們。

Linux調度程序(CFS,如上所述)

Linux cpuidle

Linux cpufreq

將調度器下的三個部分統一併且一起計算可以降低功耗,因為一起計算可以使它們儘可能高效。CPUIdle嘗試確定CPU何時應進入空閒模式,而CPUFreq嘗試確定何時升高或降低CPU頻率。這兩個模塊的主要目標都是節能。不僅如此,它還將進程分為四個cgroup,即top-app,system-background,foreground和background。將要處理的任務放入這些類別之一,然後為該類別分配CPU資源,並在不同的CPU核上委派工作。top-app要求最優先地被完成,其次是foreground,background,然後是system-background。從技術上講,background與system-background具有相同的優先級,但是system-background通常也可以訪問更多的小核。實際上,EAS正在將Linux內核的核心部分整合到一個進程中。

喚醒設備時,EAS將選擇處於最淺的空閒狀態的核,從而將喚醒設備所需的功耗降至最低。這有助於減少使用設備時所需的功率,因為如果不需要,它不會喚醒大簇(big cluster)【big cluster的概念見下圖】。負載跟蹤也是EAS極其重要的一部分,有兩種選擇。「每實體負載跟蹤」(Per-Entity Load Tracking PELT)通常用於負載跟蹤,然後該信息用於確定頻率以及如何在CPU上委派任務。也可以使用「窗口輔助的負載跟蹤」(Window-Assisted Load Tracking WALT),它是Google Pixel上使用的。我們論壇上的許多EAS ROM(例如VertexOS)都選擇使用WALT。許多ROM會發行WALT和PELT兩個版本的內核,因此由用戶決定。WALT更具突發性,CPU頻率峰值很高,而PELT試圖讓頻率保持連貫性。負載跟蹤器實際上並不影響CPU頻率,它只是告訴系統CPU使用率是多少。較高的CPU使用率需要較高的頻率,因此PELT的連貫性意味著它將緩慢地調高或調低CPU頻率。PELT確實會趨向於更高的CPU負載報告,因此它可能會以更高的耗s電來提供更高的性能。但是,由於兩種負載跟蹤方法都在不斷地修補和完善,因此目前尚無法真正說出哪種負載跟蹤系統更好。

很明顯,無論使用哪種負載跟蹤方法,效率都會提高。使用跟蹤方法不是僅僅在任何處理器上處理任務,而是可以分析任務並估算運行該任務所需的功耗。這種巧妙的任務分配方式意味著任務可以更加高效的完成,同時還可以使整個系統更快。EAS旨在以最小的功耗獲得最流暢的UI。負載跟蹤需要其他外部組件(例如schedtune)的參與。

Schedtune在每個cgroup中由兩個可調參數定義,以確保對要完成的任務進行更好的控制。它不僅可以在多核CPU上分散任務,而且為了確保更快地完成時間敏感型任務,來決定是否增加感知的負載。這樣,用戶使用的前臺應用程式和服務不會減慢速度,也不會引起不必要的性能問題。

雖然EAS是今後的一件大事,但也可以說它已經存了好一段兒時間。隨著越來越多的設備採用EAS而進軍主流市場,行動裝置處理效率的新時代即將到來。

輪轉,CFS,HMP和EAS的優缺點

雖然我的畫圖技術略差,但我努力拼湊了一張圖片,其中應該總結出了每種調度器的優缺點。

(譯者翻畫的圖片,紅字為缺點,白字為優點)

我要特別感謝XDA公認的貢獻者Mostafa Wael, 他對EAS各個方面的解釋極大地幫助了本文的實現。我還要感謝XDA註冊開發人員joshuous,XDA註冊開發人員RenderBroken 和Mostafa Wael有關EAS的文章。那些對EAS相關內容感興趣的人,Linaro有很多關於EAS的文檔,您可以閱讀。

(END)

相關焦點

  • Linux進程調度器-基礎
    概述從這篇文章開始,將開始Linux調度器的系列研究了。本文也會從一些基礎的概念及數據結構入手,先打造一個粗略的輪廓,後續的文章將逐漸深入。2. 概念2.1 進程從教科書上,我們都能知道:進程是資源分配的最小單位,而線程是CPU調度的的最小單位。
  • Linux 概念架構的理解
    五、系統中的數據結構 任務列表(Task List) 進程調度器針對每個進程維護一個數據結構 task_struct;所有的進程用鍊表管理,形成 task list;進程調度器還維護一個 current 指針指向當前正在佔用 CPU 的進程。
  • 電子控制系統中時間觸發合作式調度器的應用研究
    同時,電子控制系統也可以看作是一個能實時採集一組定義好的輸入值,同時在預先確定的時間間隔給出一個正確輸出的實時系統。為了滿足安全、低成本及程序儘可能簡單等苛刻要求,電子控制系統的開發最終走向時間觸髮結構。時間觸發意味著所有的與輸入採樣、計算及輸出結果等相關的動作在預先給定的時間前執行,因而能保證準確的調度時間。
  • 在嵌入式無線系統應用中可靠性和功耗的關係及優化方法
    低功耗或者功率是所有這些低數據率應用的一個非常重要的需求,甚至是大多數情況下的一個主要需求。但是,衡量嵌入式無線應用的功耗並非如將各部分功耗簡單相加即可,儘管通常情況下,這是對給定應用選擇組件的典型方法。
  • 從零開始入門 K8s:調度器的調度流程和算法介紹
    舉一個例子,當 CPU 的分配率是 99%,內存的分配率是 50%,那麼碎片率 = 99% - 50% = 50%,那麼這個例子中剩餘 1% CPU, 50% Mem,很難有這類規格的容器能用完 Mem。得分 = 1 - 碎片率,碎片率越高得分低。
  • Hadoop調度器 和Hive中發生數據傾斜的處理方法
    Hadoop調度器默認的調度器 FIFO Hadoop中默認的調度器,它先按照作業的優先級高低,再按照到達時間的先後選擇被執行的作業。計算能力調度器 Capacity Scheduler 支持多個隊列,每個隊列可配置一定的資源量,每個隊列採用FIFO調度策略,為了防止同一個用戶的作業獨佔隊列中的資源,該調度器會對同一用戶提交的作業所佔資源量進行限定。
  • Linux 內核的測試和調試(6)
    確保你的郵件客戶端可以發送純文本信息,你可以試試給自己發送一份補丁郵件來測試你的郵件客戶端的功能。收到自己的郵件後,運行 checkpatch 命令並給自己的內核源碼打上你的補丁。如果這兩部都能通過,你就可以給 Linux 郵箱列表發送補丁了。使用 git send-email 命令是提交補丁最安全的方式,可以避免你的郵箱的兼容性問題。
  • 改善Linux內核實時性方法的研究與實現
    因此內核的目標就是讓中斷儘可能快的處理完,盡其所能把更多的處理工作向後推遲。為此Linux把中斷的處理分成上半部分和下半部分。上半部分立即執行,下半部分將喚醒相應的和中斷處理相關的進程稍後執行。雖然這種機制使得中斷處理變得更加高效和易於維護,但是對於系統如果有嚴重的網絡負載或其他I/O負載時,中斷將非常頻繁,內核當前的實時任務會被不停中斷,這對於Linux的實時應用來說是不可接受的。
  • 設置Linux進程的睡眠和喚醒
    一旦一個運行中的進程時間片用完, Linux 內核的調度器會剝奪這個進程對CPU的控制權,並且從運行隊列中選擇一個合適的進程投入運行。 當然,一個進程也可以主動釋放CPU的控制權。函數 schedule()是一個調度函數,它可以被一個進程主動調用,從而調度其它進程佔用CPU。
  • 為何Cortex-M處理器運行不了linux
    款式M包含的處理器有Cortex-M0、Cortex-M1、Cortex-M3、Cortex-M4以及Cortex-M7,以上處理器常被用於低成本、低功耗、高可靠的嵌入式實時系統中。它們既可以用於"裸片"開發又能運行實時作業系統,比如us/os-ll、VxWorks以及Aworks(致遠電子開發)等。
  • 用這十款低功耗冰箱,幾年能省下一臺冰箱錢
    冰箱全年運行不停歇會帶來高昂電費,節能冰箱通過變頻系統、電腦控制系統、傳感器等配置能準確控溫,保持低功耗運行,節省電費。搭載松下變頻壓縮機,內有微處理器,合理控制功耗,達到一級能效。 惠而浦BCD-603WMGBIW節能冰箱 冰箱搭載恩布拉科變頻壓縮機,變頻區間更寬,能精準控制風力,保鮮的同時更節能,達到一級能效。內部還有專屬空間,可以給化妝品、護膚品等物品專屬呵護,延長使用時間。
  • 嵌入式Linux NFS 根文件系統的構建及研究
    在存儲設備方面,FLASH是目前嵌入式系統中廣泛採用的主流存儲設備,它是一種可電擦寫的非易失性存儲器,具有體積小,功耗低,密度高等優點。目前FLASH中常見的文件系統主要有Cramfs,Jffs2,Yaffs2等。嵌入式Linux基本的根文件目錄結構如表1所示。
  • 嵌入式Linux內核啟動主要分為這三個階段
    【IT168 資訊】嵌入式linux內核的啟動全過程主要分為三個階段。第一階段為內核自解壓過程,第二階段主要工作是設置ARM處理器工作模式、使能MMU、設置一級頁表等,而第三階段則主要為C代碼,包括內核初始化的全部工作,下面是詳細介紹。
  • 透過Tracepoint理解內核 - 調度器框架和性能
    同sched_wakeup, 但針對的是新創建的任務核心Tracepointsched_switch當調度器決定schedule另一個task運行的時候, 也就是任務切換的時候, 會觸發該tracepoint.
  • 如何降低功耗FPGA功耗的設計技巧
    為了更好地理解本文將要討論的設計技巧為什麼能夠節省功耗,我們先對功耗做一個簡單介紹。 功耗包含兩個因素:動態功耗和靜態功耗。動態功耗是指對器件內的容性負載充放電所需的功耗。它很大程度上取決於頻率、電壓和負載。這三個變量中的每個變量均在您的某種控制之下。
  • 關於 Linux 進程的睡眠和喚醒 ,來看這篇就夠了~
    一旦一個運行中的進程時間片用完, Linux 內核的調度器會剝奪這個進程對 CPU 的控制權,並且從運行隊列中選擇一個合適的進程投入運行。當然,一個進程也可以主動釋放 CPU 的控制權。函數 schedule() 是一個調度函數,它可以被一個進程主動調用,從而調度其它進程佔用 CPU。
  • Linux電源管理(15)_PM OPP Interface
    因為頻率高低決定器件的工作性能,降低性能的目的是節省功耗。但頻率對功耗的影響是有限的,而電壓對功耗的影響卻相當可觀。那頻率和電壓有什麼關係呢?通常情況下,當頻率降低之後,器件的工作電壓也是可以降低的(回憶一下數字電路)。因此不同的「頻率/電壓」組合,就組成了器件在性能和功耗之間的蹺蹺板,我們需要做的,就是根據實際場景,選擇一個合適的組合。
  • linux內核啟動流程
    本文以linux-2.6.37版源碼為例分三個階段來描述內核啟動全過程。第一階段為內核自解壓過程,第二階段主要工作是設置ARM處理器工作模式、使能MMU、設置一級頁表等,而第三階段則主要為C代碼,包括內核初始化的全部工作   Linux內核啟動流程   arch/arm/kernel/head-armv.S   該文件是內核最先執行的一個文件,包括內核入口ENTRY(stext)到start_kernel
  • Linux - cpupower調整CPU主頻
    前言linux內核支持調節CPU主頻,降低功耗,已到達節能的效果。對於行動裝置和筆記本來說,在沒有接通電源的時候,續航是很重要的。通過選擇系統空閒狀態不同的電源管理策略,可以實現不同程度降低伺服器功耗。但是,更低的功耗策略意味著 CPU 喚醒更慢對性能影響更大。