背景
某次嘉賓直播重保項目中,直播中出現了聲音卡頓、爆音問題,經過排查得出一個結論:嘉賓直播時手機處于充電狀態,手機出現發熱導致降頻,發熱降頻導致系統采集線程調度出現問題,屬于系統行為,影響到系統采集的輸入輸出,最終出現聲音異常問題。

團隊通過業務埋點發現,對應時刻(20:36),嘉賓的電池狀態顯示在充電(state=2),但不是低電量模式,CPU 占比 131%。
經驗分析

從嘉賓側反饋的信息中,可以抽出幾個關鍵信息:
- 開播時沒有出現問題,從 20:36 開始,說明:直播持續了一段時間后才出現;
2. 強殺 App 重開也不行,說明:出現異常后,無法恢復,都說重啟大法好,其實就是為了排除或者說是恢復命中的異常條件導致的問題,結果這次不好用了;
3. 存在充電和發熱情況,且 CPU 占比達 131%。
從前兩個點可以分析出,大概率原因不在代碼里。第三點采集到的 CPU 數據異常高,過往經驗正常的值應該在 50 - 60 左右。由此推測是命中降頻了。
IOS11.1 以上系統都有降頻策略;系統>=iOS13.1,默認開啟降頻功能,但用戶可以手動選擇關閉。iOS 系統常見的降頻策略有:
- 如果主動設置了省電模式,系統會主動降頻。
2. 如果硬件設備老化,如電池老化(設置->電池容量峰值<80%),也會出現降頻。
3. CPU 占用上升較快時,會加快降頻。
如何避免 iOS 發熱降頻導致直播聲音卡頓、爆音問題
重保增加約束
- 項目重保時,約束用戶手機至少保持 80% 以上的電量,最好是充滿。如果無法保證電量充足的條件,則需要指導用戶手動設定低電流時禁止開啟低電量模式(節能模式),建議用戶不要一邊直播一邊充電。
2. 部分重保場景,推薦主播用水冷,降低手機發熱出現幾率;
3. 采用性能更好的 iphone 機型,這里的性能更好并不完全等價于更高端,而是跟系統版本和特定機型都有關系,比如 14.5.1 版本系統就被吐槽降頻嚴重,以及過往經驗顯示 iPhone X 發熱后降頻非常嚴重。
優化降低能耗
在正常情況下,我們可以進一步優化能耗,從而降低發熱的可能性,或讓發熱來的更慢一些。這里提幾點:
- 為需要保證實時性的任務提供更高優先級的線程。
2. 有效地使用網絡至關重要,盡可能通過減少調度事務以及使用高效的 API 來消除開銷成本。網絡傳輸是直播場景的能耗大頭。
3. 對繁重開銷大的線程任務進行分析,嘗試優化線程執行任務的復雜度。例如避免不必要的數據拷貝,降低算法邏輯的時間控件復雜度(算法實時性簡化),或者利用SIMD指令集進行并行化處理;以上這些手段的最終目的就是降低 CPU 在單個函數/線程上的執行周期。
總結
遇到這類案例,通常情況下解釋難度較大,給出直播聲音卡頓、爆音是由于 iOS 發熱降頻造成的這類結論,天然會給人一種甩鍋的感覺。所以,我們更應該充分分析、拿出證據,在分析的過程中自身可以獲得很多,也解決了實際問題。
本文來源:心尚傳媒(https://www.xscm.cn)