os-android: 除錯多媒體效能(Crack Media Perf)
os-android: 除錯多媒體效能(Crack Media Perf)
Android在中國市場野蠻生長,廠商水平參差不齊。手機廠商大品牌較多,Android的硬體和軟體穩定性自然很高。Android在很多細分領域也有廣泛應用,如: 機頂盒、廣告機、收銀機、遊戲盒子、VR/AR、手持終端、掃地機器人、智慧音箱等,裝置廠商技術和人才儲備不足,晶片供應商也是國內中等實力的IC公司,在這類裝置上除錯多媒體效能,還是非常難的。
1 命令列啟動的app
這裡有臺友商樣機,同款晶片同款作業系統能夠達到視訊[email protected];我們的同款晶片同款作業系統只能達到視訊
Launcher起不來,可以安裝一個第三方的Launcher。Launcher的作用無非就是一堆程式的快捷方式。使用am命令也能開啟需要開啟的程式。
下面查詢一下設定APP的完整包名,並使用am start命令開啟設定APP介面
fire_box:/ # dumpsys package | grep settings/.Settings
fire_box:/ # am start -n com.android.settings/.Settings
fire_box:/ # am start -n com.android.tv.settings/.MainSettings
fire_box:/ # am start -n com.rockchips.mediacenter/.activity.MainActivity
# 開啟設定APP設定一下HDMI的解析度為[email protected]。設定APP有平板的設定版本和TV的設定版本。
fire_box:/ # cat /d/dri/0/summary # 檢視VOP,確認設定是否生效
2 分析友商的多媒體播放效能(Crash Media Perfermance)
市場情報,友商同款晶片同款作業系統能夠達到視訊
fire_box:/ # am start -n com.rockchips.mediacenter/.activity.MainActivity
視訊[email protected]播放,整個系統鏈路包括: 檔案系統讀寫效能(視訊解複用) --> 視訊硬解(DDR, VPU) --> 顯示系統(GPU/Overlay) --> 顯示驅動(VOP/LCDC)等 --> 物理顯示裝置。
特別提示:晶片原廠的系統核心是Linux-4.4, 如果是Linux-3.1部分解決略有不同。注意適用性。
檢查點:系統負載
檢視空閒的CPU。媒體應用CPU使用率不能太高,否則會出現排程問題。CPU使用率高會出現掉幀問題或概率性卡頓問題。使用下面命令觀察一段時間內的CPU平均的空閒率或使用率。
fire_box:/ # top -m 10 -t 1| grep 400% | awk '{print $5}'
fire_box:/ # logcat -c;logcat -v time --pid `ps -A | grep mediaserver | awk '{print $2}'`
假如經過一段時間的統計,頻率CPU使用率為200%,這時候視訊肯定會卡頓,需要進一步分析是什麼消耗了CPU。造成卡頓的原因很多,建議抓一下系統的Trace分析一下。Trace一定要包含問題現象才有意義。通過Trace本人有發現過兩種卡頓問題:
- DDR中斷驅動問題,導致中斷處理異常耗時,而造成卡頓
- 系統GMS包一直崩潰和重啟,造成系統卡頓。這種情況在設定裡面把(App>Google Play Services)禁用掉在測試就知道了。
檢查點:檔案系統讀寫效能(視訊解複用)
# 看看有沒有異常的io讀寫
fire_box:/ # iotop -m 5
檢查點:視訊硬解(DDR, VPU)
# 視訊解碼對DDR和VPU使用異常頻繁,DDR和VPU的頻率是檢查點。DDR在800M,VPU在500M為佳。
fire_box:/ # ls /sys/class/devfreq
dmc ff300000.gpu ff360000.rkvdec
fire_box:/ # cat /sys/class/dmc/*/cur_freq # ddr freqency
fire_box:/ # cat /sys/class/ff360000.rkvdec/*/cur_freq # vpu freqency
# 視訊單幀解碼時間直接關注,播放幾個[email protected]片源,然後檢視
fire_box:/ # echo 0x100 > /sys/module/rk_vcodec/parameters/debug
fire_box:/ # cat /proc/kmsg
檢查點:顯示系統(GPU/Overlay)
# 檢視當前應用是GLES顯示還是Overlay顯示。從SurfaceFlinger或VOP中可以檢視。顯示的幀率是否充足都可以看看。
fire_box:/ # dumpsys SurfaceFlinger
fire_box:/ # dumpsys SurfaceFlinger | grep fps
fire_box:/ # cat /d/dri/0/summary # VOP summary, 奇怪的節點名.
檢查點:顯示驅動(VOP/LCDC)
播放4K視訊也和顯示系統和CPU有關係,他們的頻率也看看。如果是GPU渲染需要關注GPU頻率。
fire_box:/ # ls /sys/class/devfreq
dmc ff300000.gpu ff360000.rkvdec
fire_box:/ # cat /sys/class/ff300000.gpu/*/cur_freq # GPU freqency
fire_box:/ # cat /d/clk/clk_summary | grep vop
aclk_vop_pre 1 1 400000000 0 0
aclk_vop 2 2 400000000 0 0
fire_box:/ # cat /sys/bus/cpu/devices/cpu*/cpufreq/cpuinfo_cur_freq
1008000
1008000
1008000
1008000
檢查點:多媒體物理裝置節點
# 獲取音效卡資訊
cat /proc/asound/card*/pcm0p/sub0/hw_params
cat /sys/class/drm/card0-HDMI-A-1/audioformat
# HDMI 節點資訊
Linux-3.1
$ cat /sys/class/display/HDMI/mode
$ cat /sys/class/graphics/fb*/disp_info
$ cat /sys/devices/virtual/display/HDMI/mode
$ ls /sys/devices/virtual/display/HDMI/
3dmode color debug mode modes power scale type
Linux-4.4
$ cat /sys/class/drm/card0-HDMI-A-1/modes (linux-4.4-drm)
$ cat /d/dri/0/summary
從設定裡面看下,顯示系統的引數,記錄一下。
3 自行解決還是丟擲問題
綜合以上分析。比較好解決的是DDR頻率、GPU頻率和VPU頻率不足。渲染的圖層比較多也容易解決。改改核心配置一般能解決。如果這些引數均一致,但是自家的表現不如友商,只能系統日誌配合上述日誌,丟擲來給晶片原廠解決了。
fire_box:/ # ps -A | grep mediaserver | awk '{print $2}'
fire_box:/ # logcat -c; logcat -v time --pid=${pid-mediaserver}
4 特別關注DDR問題
DDR顆粒的問題也需要關注。DDR顆粒的問題分幾種情況:(1) 有些低端的板子用4顆4位的拼成16位匯流排,DDR總頻寬受限,播放4K肯定吃力,大羅神仙也迴天無力。(2) DDR種類多,配置模板多,配置錯一點都可能帶來效能和穩定性問題。(3) DDR顆粒虛焊和其他重要元器件虛焊,可能帶來效能和穩定性問題。