在OpenHarmony中使用Bytrace
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開(kāi)源基礎(chǔ)軟件社區(qū)??
一、性能問(wèn)題分析方式
一般來(lái)說(shuō),我們發(fā)現(xiàn)程序卡頓,排除其他程序問(wèn)題和硬件問(wèn)題,那一定是自身程序中某個(gè)位置運(yùn)行時(shí),消耗的時(shí)間過(guò)長(zhǎng)導(dǎo)致,要找到耗時(shí)的代碼段,才能有針對(duì)性的進(jìn)行優(yōu)化,那第一個(gè)問(wèn)題就是如何找到耗時(shí)的代碼段。
首先我們能想到,在程序中可能存在問(wèn)題的地方,加入計(jì)算時(shí)間差的代碼,然后不斷縮小范圍,找到最終耗時(shí)的點(diǎn)
這種方式最終也能解決問(wèn)題,但是會(huì)有一些缺點(diǎn):
1,對(duì)于大型項(xiàng)目來(lái)說(shuō),要經(jīng)過(guò)大量的【編譯,執(zhí)行驗(yàn)證,添加代碼】迭代,消耗大量時(shí)間。
2,排查到問(wèn)題后,需要把測(cè)試代碼刪除,下次排查時(shí)又要重新添加代碼。
3,通過(guò)查看文本log方式分析,不直觀。
下面我們看看如何使用bytrace來(lái)分析問(wèn)題。
二、在OpenHarmony中使用Bytrace
1、在BUILD.gn中添加對(duì)bytrace的依賴。
2、添加頭文件
3、添加打點(diǎn)代碼
代碼部分完成了,編譯更新到開(kāi)發(fā)板,然后使用下面命令來(lái)抓取log:
參數(shù)說(shuō)明:
- -t 10 : 從運(yùn)行命令行開(kāi)始,抓取10秒時(shí)間(非必要參數(shù),默認(rèn)5秒)。
- -b 8192 : 使用8192kb(8M)內(nèi)存來(lái)緩存數(shù)據(jù)(非必要參數(shù),默認(rèn)2048kb)。
- graphic : 抓取graphic類型的trace,對(duì)應(yīng)上面代碼中的BYTRACE_TAG_GRAPHIC_AGP。
最后把抓取的結(jié)果保存到log.ftrace這個(gè)文件中(文件后綴名非限定,txt也行),通過(guò)文本編輯器打開(kāi)查看。
到目前為止,看起來(lái)跟加入時(shí)間差代碼的方式差不多,還是打點(diǎn)看log,接著往下看。
三、優(yōu)化打點(diǎn)
把bytrace的打點(diǎn)代碼封裝起來(lái),xtrace.h:
xtrace.cpp:
這樣我們用起來(lái)就更方便了:
函數(shù)開(kāi)始,創(chuàng)建XTrace對(duì)象時(shí),構(gòu)造函數(shù)調(diào)用StartTrace。函數(shù)結(jié)束或離開(kāi)作用域,棧中的對(duì)象會(huì)自動(dòng)釋放,析構(gòu)函數(shù)調(diào)用FinishTrace。
當(dāng)然這種方式也可以用于時(shí)間差打點(diǎn)。
四,可視化看log
https://ui.perfetto.dev
這個(gè)網(wǎng)站需要科學(xué)方法訪問(wèn),首次訪問(wèn)后有了緩存,后續(xù)就可以離線訪問(wèn)了。
我這邊把網(wǎng)頁(yè)保存下來(lái)了,在本地開(kāi)web服務(wù),通過(guò)127.0.0.1也可以使用,首先點(diǎn)擊左上角Open trace file打開(kāi)log.ftrace,右邊會(huì)顯示出函數(shù)調(diào)用的火焰圖,點(diǎn)擊其中一個(gè)函數(shù),在下方可以看到準(zhǔn)確的執(zhí)行時(shí)間,基本操作:
- 鍵盤(pán)w,s:時(shí)間軸縮放
- 鍵盤(pán)a,d:左右移動(dòng)
可視化看時(shí)間軸就非常直觀了,橫條越長(zhǎng),消耗時(shí)間越多。
五、OpenHarmony對(duì)bytrace的集成
我們?cè)贠penHarmony使用bytrace,除了以上的便利以外,最重要的是OpenHarmony的代碼中已經(jīng)大量使用了bytrace,下面是我整理的已經(jīng)集成bytrace的模塊。
tag | define | description |
ability | BYTRACE_TAG_ABILITY_MANAGER | Ability Manager |
ace | BYTRACE_TAG_ACE | ACE development framework |
app | BYTRACE_TAG_APP | APP Module |
ark | BYTRACE_TAG_ARK | ARK Module |
binder | Binder kernel Info | |
disk | Disk I/O | |
distributeddatamgr | BYTRACE_TAG_DISTRIBUTEDDATA | Distributed Data Manager |
dsoftbus | BYTRACE_TAG_DSOFTBUS | Distributed Softbus |
freq | CPU Frequency | |
graphic | BYTRACE_TAG_GRAPHIC_AGP | Graphic Module |
i2c | I2C Events | |
idle | CPU Idle | |
irq | IRQ Events | |
mdfs | BYTRACE_TAG_MDFS | Mobile Distributed File System |
memory | Memory | |
memreclaim | Kernel Memory Reclaim | |
misc | BYTRACE_TAG_MISC | Misc Module |
mmc | eMMC commands | |
msdp | BYTRACE_TAG_MSDP | Multimodal Sensor Data Platform |
multimodalinput | BYTRACE_TAG_MULTIMODALINPUT | Multimodal Input Module |
notification | BYTRACE_TAG_NOTIFICATION | Notification Module |
ohos | BYTRACE_TAG_OHOS | OpenHarmony |
pagecache | Page cache | |
regulators | Voltage and Current Regulators | |
rpc | BYTRACE_TAG_RPC | RPC and IPC |
sched | CPU Scheduling | |
sensors | BYTRACE_TAG_SENSORS | Sensors Module |
sync | Synchronization | |
window | BYTRACE_TAG_WINDOW_MANAGER | Window Manager |
workq | Kernel Workqueues | |
zaudio | BYTRACE_TAG_ZAUDIO | OpenHarmony Audio Module |
zcamera | BYTRACE_TAG_ZCAMERA | OpenHarmony Camera Module |
zimage | BYTRACE_TAG_ZIMAGE | OpenHarmony Image Module |
zmedia | BYTRACE_TAG_ZMEDIA | OpenHarmony Media Module |
對(duì)于以上模塊的性能問(wèn)題,我們就能直接使用對(duì)應(yīng)tag來(lái)抓取。
六、其他
對(duì)于一個(gè)較大的模塊代碼,我們需要理解他的執(zhí)行流程,函數(shù)調(diào)用關(guān)系,會(huì)比較頭疼,所以我編寫(xiě)了一個(gè)腳本,掃描所有的.cpp文件,在所有函數(shù)開(kāi)頭自動(dòng)添加X(jué)Trace xxx(__func__)。
在可視化界面分析log,可以清晰的看到函數(shù)執(zhí)行的,不同的線程,函數(shù)的調(diào)用棧,能快速的梳理代碼的執(zhí)行流程。
第四點(diǎn)中的圖,是我對(duì)foundation/ace/ace_engine/frameworks這個(gè)目錄下2000個(gè)左右cpp文件中的函數(shù)全部添加X(jué)Trace后,得到的應(yīng)用啟動(dòng)流程火焰圖。
??想了解更多關(guān)于開(kāi)源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??