?最近負(fù)責(zé)的項(xiàng)目中,有一定制客戶頻繁的抱怨設(shè)備在安裝一些客戶的app組件后,云端采集到的CPU占用率信息一直維持在78%以上卿叽,甚至還會(huì)出現(xiàn)90%的情況床佳,與此同時(shí)滋早,用戶也反映了卡頓、耗電快等現(xiàn)象砌们。
?為了解決客戶這個(gè)痛點(diǎn)問(wèn)題杆麸,拿了一臺(tái)復(fù)現(xiàn)設(shè)備來(lái)分析此CPU高的問(wèn)題,以下是分析思路和過(guò)程浪感,mark一下昔头。
-
問(wèn)題現(xiàn)象
?設(shè)備在刷入原生軟件版本時(shí),后臺(tái)收集到的CPU占用信息大約在27%影兽,正辰腋現(xiàn)象。
?而在客戶定制版本上峻堰,CPU至少在78%讹开,對(duì)比兩個(gè)版本區(qū)別,發(fā)現(xiàn)定制客戶在原生軟件版本上多安裝了6個(gè)APP組件,此類app屬于客戶自研app,重啟機(jī)器靜置5分鐘后,觀察CPU信息,占用率沒(méi)有降低,對(duì)這么高cpu占用率嚇到了捐名。
-
CPU問(wèn)題分析過(guò)程
1. 抓Log分析
?在客戶上報(bào)問(wèn)題后,不管反饋的問(wèn)題是什么(重啟\crash\卡頓等),一旦設(shè)備有問(wèn)題出現(xiàn),對(duì)于研發(fā)人員來(lái)說(shuō),在了解到問(wèn)題現(xiàn)象后,接下來(lái)就是需要一份Log,不能無(wú)的放矢旦万。
?上圖Log信息,發(fā)現(xiàn)后臺(tái)一直在重復(fù)打印如上信息,第一直覺(jué)告訴我,會(huì)不會(huì)截圖中l(wèi)og頻繁輸出導(dǎo)致cpu居高不下的。
?于是乎,根據(jù)這個(gè)懷疑點(diǎn),首先將以上日志信息注釋掉,不讓其打印出來(lái),然后對(duì)比一下cpu前后使用情況,事實(shí)證明我的直覺(jué)一向不準(zhǔn),cpu使用率沒(méi)有什么改善镶蹋。
2. Android Profiler工具,實(shí)時(shí)說(shuō)明CPU使用情況
?Android Profiler這個(gè)工具就不多說(shuō)了成艘,簡(jiǎn)而言之,就是Android Studio自帶的分析性能(包括cpu/memory/network)工具贺归。
?將現(xiàn)場(chǎng)設(shè)備連上USB后淆两,用Android Profiler工具查看CPU使用情況,發(fā)現(xiàn)system_process進(jìn)程的cpu一直維持在80%左右牧氮,如下圖:
?利用工具對(duì)system_server進(jìn)程單獨(dú)采樣一段時(shí)間琼腔,具體看看這段時(shí)間內(nèi)system_server進(jìn)程在進(jìn)行什么樣的操作,采樣信息如圖所示:
?兩張圖結(jié)合起來(lái)可以看出,system進(jìn)程中,十幾個(gè)binder線程都在輪詢工作,即占用cpu,而正是這些線程不斷執(zhí)行任務(wù),才導(dǎo)致system整個(gè)進(jìn)程cpu占用高,那么這些binder線程具體在進(jìn)行什么操作呢,還需要看單個(gè)線程的堆棧信息,如圖所示(這里只貼出其中一個(gè)線程的堆棧踱葛,因?yàn)槠渌€程都是類似的堆棧信息):
?根據(jù)堆棧調(diào)用信息丹莲,system進(jìn)程在不斷地dump meminfo信息,多個(gè)binder線程不斷被請(qǐng)求dump meminfo信息尸诽,這才引起了cpu一直占用高甥材。
?竟然binder線程被請(qǐng)求dump meminfo信息,那么客戶端是哪些進(jìn)程呢,在IPC中,服務(wù)端被調(diào)用,肯定是有個(gè)對(duì)端--客戶進(jìn)程發(fā)起請(qǐng)求的。
?所以還需要排查是哪個(gè)客戶進(jìn)程頻繁發(fā)起服務(wù)請(qǐng)求的性含,查看system進(jìn)程的binder調(diào)用情況洲赵,如下圖所示:
?根據(jù)system進(jìn)程的binder請(qǐng)求信息,可以看到是進(jìn)程號(hào)為4886、5207叠萍、5006這幾個(gè)客戶端進(jìn)程不斷在請(qǐng)求獲取么meminfo內(nèi)存信息的芝发,而這幾個(gè)進(jìn)程號(hào)對(duì)應(yīng)的包名為:
?這幾個(gè)應(yīng)用,正是客戶在設(shè)備上安裝的app苛谷,所以基本確認(rèn)是客戶app代碼不斷請(qǐng)求獲取meminfo內(nèi)存信息導(dǎo)致的辅鲸,需要優(yōu)化客戶app的代碼邏輯,不要不停的獲取內(nèi)存信息腹殿,這樣頻繁請(qǐng)求meminfo信息独悴,導(dǎo)致cpu負(fù)載很高,一直居高不下锣尉。
-
問(wèn)題確認(rèn)
?為了再次確認(rèn)上述分析的原因刻炒,修改接口getMemoryInfo的邏輯,使其直接return返回自沧,不再真正地執(zhí)行dump meminfo內(nèi)存信息坟奥,重啟機(jī)器后,cpu占用直接降到40%暂幼,正如所料筏勒。
現(xiàn)場(chǎng) | 未屏蔽 | 已屏蔽 |
---|---|---|
CPU占用 | 80%以上 | 45% |
-
問(wèn)題總結(jié)
?有果比有因,需要具體分析到cpu占用高具體是在執(zhí)行什么操作旺嬉,打印出問(wèn)題進(jìn)程的堆棧信息,才能從代碼端解決問(wèn)題,找到root cause管行。