使用 intel_pstate 驅動程序的電池性能糟糕
編輯:Ubuntu (mate) 20.04,intel_pstate 驅動程序。電腦是我正在使用帶有英特爾酷睿 i7 i7-8565U 的 razer Blade 隱形超極本(2019 年初)。
我在僅使用電池供電時遇到了奇怪的行為(極度減速),即使我已將 TLP 設置為 AC 模式。如果我將 cpufrequtils 設置為性能模式(尤其是多執行緒),問題會變得更糟!
我們將從單執行緒案例(即只有主執行緒)開始。我正在對來自文件或網路攝像頭的影片幀執行一系列 OPENCV 過濾器(高斯模糊等)。我是否先將所有幀載入到記憶體中並不重要(即不是磁碟或設備 I/O 問題)。下面列出了單個循環(一幀)的處理時間。這不是複雜的程式碼。基本上,它正在做:
Filter filters[400] while( cap.read(frame) ) { for( int i=0; i<400; ++i ) { filters[i].dofilter(frame); } }
在哪裡過濾
$$ i $$.dofilter 只是調案例如 cv::GaussianBlur、resize() 等,並預先分配了目標 cv::Mat(我沒有做任何額外的分配) 這僅使用 CPU(即它不使用 OPENCV 透明 openCL 或任何東西)。
單執行緒
AC + powersave: 71 msec (variance 70.5-71.5) AC + performance: 67 msec (variance 66.5-67.5) BAT + powersave: 95 msec (variance 84.0-115.0) *1 BAT + performance: 104 msec (variance 76.0-202.0) *2 1* Note: spikes to 110+ about every 5 sec 2* Note: most ~96, with few spikes low to 80s and high to 120s
方法:每個條件執行 10 次,持續 60 秒(每次執行 10 次大約 600 幀 = 6000),隨機排序(以免熱量、電池電壓等混淆)。
我為每個循環使用相同的輸入幀(換句話說,不是由於每次處理的圖像內容不同)。它實際上是在每個時間步處理完全相同的輸入。如果我拔下或插入交流適配器或使用 cpufrequtils 設置省電/性能,我可以看到每幀處理時間立即發生變化。
我完全不知所措。
我正在使用帶有英特爾酷睿 i7 i7-8565U 的 razer 刀片隱形超極本。Ubuntu (mate) 20.04,intel_pstate 驅動程序。
所以,我有3個具體問題:
1)到底發生了什麼?
2)如何設置 TLP(核心參數?)以強制它像在交流電上一樣執行(當然,電池可以提供足夠的速度來執行一個 cpu/記憶體綁定的單核程序,就像在交流電上一樣快)?它甚至沒有做那麼多!
3)電池電源是否有任何秘密/奇怪的設置。特別是與多執行緒有關?這個問題是高度可並行化的——基本上有 8 個獨立的過濾器鏈可以並行執行。通常我會這樣做。當我在 AC 上執行此操作時,它是這樣的:
多執行緒(8 執行緒)
AC + powersave: 28.6 msec (variance 26.8-31.1) AC + performance: 28.8 msec (variance 26.6-31.2) BAT + powersave: 39 msec (variance 36.0-64.0) *3 BAT + performance: 176 msec (variance 39.0-202.0) *4 3* Note: this is very tame compared to if I run with webcam -- then it spikes heavily between 40 and 90 4* Note: will update at 40 msec for a few frames, then go to 180 msec for a long time, then burst at 40 for a few.
該軟體通過執行緒池實現多執行緒。我已經檢查了鎖定,即使在極端的多執行緒情況下也沒有時間等待鎖定(這實際上是我花費最多時間的地方,因為我認為這是最初的問題……)。我用 2~8 個執行緒得到了類似的結果。使用更多執行緒(尤其是在性能模式下)的電池會變慢,而使用更多執行緒的 AC 會更快。
編輯:即使我禁用 TLP,也會出現問題。我還沒有嘗試切換到舊的 acpi 頻率調節器(認為這可行嗎?)
編輯 2:在單執行緒模式下,htop 只顯示一個固定的 CPU 核心(即它不使用 openmp 或其他東西來矢量化和使用更多核心)。
問題是 intel_pstate 驅動程序。
我通過引導核心參數切換到原來的 ACPI 驅動程序。具體來說,在 /etc/default/grub 中,我將 DEFAULT 引導行更改為:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_pstate=disable acpi=force"
(記得
update-grub
之後)。現在,即使沒有任何更改(即預設的“按需”):
多執行緒(8 執行緒)
BAT + ondemand: 38.5 (37.5 ~ 40.0) BAT + performance: 31.8 (30.1 ~ 35.0) *1
1 * 我每隔幾秒就會看到一些非常小的峰值到 35,但這是在合理範圍內……
具有諷刺意味的是,使用 ACPI 驅動程序在正常工作負載(瀏覽、EMACS、wifi 等)期間的功耗實際上也比 intel_pstate 更好(平均 590 mA 對 660 mA)。一個快樂(但令人擔憂)的副作用。
編輯:一個缺點是,在不使用 intel_pstate 驅動程序時,掛起(睡眠模式)似乎會消耗更多電量。每 12 小時大約 10%…