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

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調度器的演變

輪轉調度

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

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

  • 進程A
  • 進程B
  • 進程C
  • 進程D

現在,讓我們描述輪轉調度器的工作。在繼續進行下一步之前,我們將為每個進程分配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以速度為導向的測試。

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

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

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

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

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電來提供更高的性能。但是,由於兩種負載跟蹤方法都在不斷地修補和完善,因此目前尚無法真正說出哪種負載跟蹤系統更好。

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

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

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

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

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

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

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

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

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


分享到:


相關文章: