Android Linux EAS最佳化-schedtune

yooooooo發表於2024-08-17

SchedTune

SchedTune是一項與CPU調頻相關的效能提升技術,它實現為一個cgroup控制器。

這個控制器提供了一個名稱為schedtune.boost的配置引數,執行時系統可以使用它來更改該組中的程序的排程方式。

每當調整這個引數的時候,它會使受影響的程序看起來比實際更重(或更輕)。如果一個組被提升了25%,那麼排程程式將期望它使用的CPU時間比它實際上要多25%,並且CPU頻率調控器將相應地對處理器提速。因此,以這種方式“提升”程序不會影響其排程優先順序,但會影響其最終執行的CPU的速度。

SchedTune擴充套件僅適用於負載較輕的系統。當系統飽和時,SchedTune應當自動禁用。

Pixel XL上/vendor/etc/init/init.rc檔案中的相關配置如下:

# set default schedTune value for foreground/top-app (only affects EAS)
write /dev/stune/foreground/schedtune.prefer_idle 1
write /dev/stune/top-app/schedtune.boost 10
write /dev/stune/top-app/schedtune.prefer_idle 1
write /dev/stune/rt/schedtune.boost 30
write /dev/stune/rt/schedtune.prefer_idle 1
  • /dev/stune/: 某些系統中用於替代 /sys/fs/cgroup/schedtune/ 的路徑。

可以看到,這裡為rttop-app兩個程序組設定了處理器提速。

schedtune提供了一套使用者介面的工具,用於功耗-效能調節。schedtune是cgroup的一個子系統。所以在cgroup的mount節點下,stune分別為每個group,都提供了2個調節開關:

  • schedtune.boost

boost的值用int型表示,範圍為[0, 100]。
boost預設值為0,代表CFS排程器會工作在能耗最低的狀態。這也意味著schedutil使task跑在最低的OPP。
boost值100,則表示排程器為工作在效能最高的狀態,同時OPP也處在最大。
0-100的範圍可以根據其他場景來進行適當調節。比如,最佳化互動的響應、電池電量變化等

  • schedtune.prefer_idle

這是一個控制排程器節省功耗優先,還是效能優先的flag。
預設值0,會讓CFS排程器根據energy-aware wakeup策略來分配在group中的task。(功耗優先)
當值設為1,會讓CFS排程器分配task時,有最小的wakeup延遲。(效能優先)
android平臺下使用這個flag用來表示正在和使用者互動的應用。
設為1的節點:
dev/stune/foreground/schedtune.prefer_idle
dev/stune/top-app/schedtune.prefer_idle
設為0節點:
dev/stune/background/schedtune.prefer_idle
dev/stune/rt/schedtune.prefer_idle
schedtune.prefer_idle是一個標誌位,它向排程器指示使用者空間希望排程器更關注功耗或者更關注效能。當這個值設為1,表示希望排程器儘可能減少改組中程序喚醒延遲(傾向於效能)

  1. boost

    • 說明:控制任務的效能增強級別,通常是一個百分比值,用於增加任務的負載。該引數決定了排程器在選擇 CPU 頻率時應考慮的額外負載,從而影響任務的執行速度和響應時間。
    • 範圍:通常為 -100100,其中 0 表示沒有提升,負值表示減少負載,正值表示增加負載。
  2. prefer_idle

    • 說明:決定任務是否更傾向於在空閒 CPU 上執行。如果設定為 1,則排程器將嘗試將任務排程到空閒的 CPU 上,以減少任務在同一 CPU 上競爭資源的情況,從而降低延遲。
    • 範圍01
  3. prefer_high_cap

    • 說明:用於指定排程器是否優先選擇具有較高計算能力的 CPU。這對任務的執行效率有重要影響,尤其是對計算密集型任務來說。
    • 範圍01
  4. prefer_idle_hint

    • 說明:用於提示排程器任務可能在短時間內進入空閒狀態。如果啟用,排程器可能會為這些任務選擇更合適的 CPU,以提高整體系統的能效。
    • 範圍01
  5. spreading

    • 說明:決定任務在多個 CPU 上的分佈程度。如果啟用,排程器將嘗試將任務均勻分佈在多個 CPU 上,以防止某些 CPU 過載。
    • 範圍:通常為 01
  6. sync_flag

    • 說明:用於調整同步任務的排程行為。同步任務往往要求快速響應,因此排程器會考慮給這些任務分配更多的 CPU 資源。
    • 範圍01
  7. margin

    • 說明:控制任務的邊際效能需求。這個引數通常用於調整任務在滿足最低效能要求時所需的額外 CPU 資源,以確保任務可以在合理的時間範圍內完成。
    • 範圍:具體值依賴於系統配置。
  8. group

    • 說明:將任務分組,以便應用相同的 schedtune 引數設定。這對於管理一組具有相似效能需求的任務非常有用。
    • 範圍:具體取值依賴於系統配置。
  9. idle_exit_boost

    • 說明:用於在 CPU 退出空閒狀態時對排程器進行增強,以提高響應速度。
    • 範圍:通常為 01

這些引數可以透過調節來最佳化系統的效能和功耗,尤其是在 Android 裝置中,以提供更好的使用者體驗和電池壽命。

相關文章