最近處理一起歷史遺留問題,感覺很爽。
現象:
? ? ?背景:設備采用ARM,即rk3568處理器,采用Linux系統;主要用于視覺后端處理
? ? ?現象:當軟件運行一段時間,大概1個小時(也不是很固定),CPU使用率會變成原先一倍,這個到不影響軟件使用流暢,但采集卡的驅動會出現異常,也開始丟幀了(甚至不出流),算是很嚴重的bug。
????????作為資深軟件開發人員,首先懷疑程序有問題,或某個線程掛掉了。但實際產生現象后,軟件流暢度還是有所保證的,非視頻相關一些操作都很正常。后來在跟采集卡廠家溝通過程中,發現采集卡驅動在CPU調頻的時候會出現異常,需要重啟驅動才可以恢復。
????????
? ? ? ? 然后,當然懷疑是CPU是否降頻了,如果降頻一半,的確會導致CPU占用率比較高。那么問題來了,怎么讓CPU不主動降頻呢?猜測應該是電源管理相關,特別是ARM這些嵌入式,的確默認會存在降頻的可能。考慮本設備不用考慮節能的問題,所以針對此猜測,最好的解決辦法就是CPU不降頻。
- 如何查看當前電源管理模式?
在設備端:
cd? ?/sys/devices/system/cpu/cpu0/cpufreq
如果沒有該目錄,說明該系統不支持電源管理模式(或系統裁剪掉了)
通過 ls 可以看到如下:
affected_cpus related_cpus scaling_governor
cpuinfo_cur_freq scaling_available_frequencies scaling_max_freq
cpuinfo_max_freq scaling_available_governors scaling_min_freq
cpuinfo_min_freq scaling_cur_freq scaling_setspeed
其中?scaling_governor 就是當前電源管理模式,cat下就可以看到了
scaling_available_governors就是支持哪些管理模式(一般來說,都是至少支持以下5種)
①、Performance,最高性能,直接用最高頻率,不考慮耗電。
②、Interactive,一開始直接用最高頻率,然后根據 CPU 負載慢慢降低。
③、Powersave,省電模式,通常以最低頻率運行,系統性能會受影響,一般不會用這個!
④、Userspace,可以在用戶空間手動調節頻率。
⑤、Ondemand,定時檢查負載,然后根據負載來調節頻率。負載低的時候降低 CPU 頻率,這樣省電,負載高的時候提高 CPU 頻率,增加性能。
我的設備默認是?Interactive,現在需要改成?Performance
接下去的操作,無非是兩種:
1. 在啟動時候修改模式,注意要把每個CPU都修改了
2. 修改內核,默認改成 performance
下面是啟動時候或者過程中(未驗證過是否可行)修改模式
for i in $(seq 0 1 15)
doecho "performance" > /sys/devices/system/cpu/cpu${i}/cpufreq/scaling_governor
done
- 如何在內核里修改默認performance?
進入kernel目錄,輸入make menuconfig ARCH=arm64
然后加載使用的config
選擇 CPU power management? 然后 選擇?CPU Frequency scaling? (可能不同版本略有不同)
進入之后,如下圖,選擇默認的模式(其他地方不要修改,也不要直接把這個功能去掉)
然后save,重新build kernel ,更新kernel到板子上即可