Perfetto入門詳解【新一代systrace分析工具】

之前一直使用systrace的同學(xué)強(qiáng)烈建議嘗試下這個(gè)工具


一、perfetto介紹及特點(diǎn)


在Android 9.0(API級(jí)別28)或更高版本的設(shè)備上,可以使用 systrace 在設(shè)備上記錄系統(tǒng)跟蹤。Perfetto 工具是Android下一代全新的統(tǒng)一的 trace 收集和分析框架,可以抓取平臺(tái)和app的 trace 信息,是用來(lái)取代 systrace 的,但 systrace 由于歷史原因也還會(huì)一直存在,并且 Perfetto 抓取的 trace 文件也可以同樣轉(zhuǎn)換成 systrace 視圖,如果習(xí)慣用 systrace 的,可以用 Perfetto UI 的 Open with legacy UI 轉(zhuǎn)換成 systrace 視圖來(lái)看


1.1功能

功能分析:

·? 系統(tǒng)分析(適用于Linux和Android的系統(tǒng)范圍分析)Linux內(nèi)核跟蹤:捕獲高頻ftrace數(shù)據(jù):調(diào)度活動(dòng),任務(wù)切換延遲,CPU頻率等等用戶空間分析器和額外的探針:本機(jī)堆分析,Java堆分析,/ proc狀態(tài)文件的輪詢器內(nèi)置于Android:自Android 9 Pie以來(lái)該平臺(tái)的一部分,也可在Linux上運(yùn)行

·? 應(yīng)用追蹤高效的跟蹤點(diǎn)儀器:以高吞吐量,低開(kāi)銷的跟蹤點(diǎn)記錄C ++應(yīng)用程序的活動(dòng)結(jié)構(gòu)化和可配置的事件:定義自定義protobuf消息以表示強(qiáng)類型的應(yīng)用程序特定信息,僅跟蹤您需要的信息與系統(tǒng)范圍的跟蹤集成:在同一時(shí)間線上將應(yīng)用程序的狀態(tài)與系統(tǒng)范圍內(nèi)的分析數(shù)據(jù)相關(guān)聯(lián)

·? 跟蹤查看器交互式痕跡探索:使用Perfetto UI記錄,查看和處理跟蹤數(shù)據(jù)支持流行的跟蹤格式文件:TraceEvent JSON,Android systrace,ftrace文本輸出完全在您的瀏覽器中運(yùn)行:不涉及服務(wù)器交互,即使您離線也可以工作

·? 痕量分析基于SQL的跟蹤模型:跟蹤處理器提取跟蹤并公開(kāi)基于SQLite的接口以通過(guò)外殼和UI訪問(wèn)跟蹤的內(nèi)容大痕量分析:支持高達(dá)數(shù)十GB的跟蹤可互操作的:可以導(dǎo)入和導(dǎo)出流行的跟蹤格式:Chromium JSON跟蹤格式,Android Systrace,ftrace,CSV


1.2 Perfetto主要特點(diǎn)


<1>可以在線抓取長(zhǎng)時(shí)間的 trace,可以長(zhǎng)達(dá)一個(gè)小時(shí),另外抓取的文件size也可以達(dá)到GB級(jí)別,這樣就可以在后臺(tái)開(kāi)啟,讓它一直抓取trace了,特別適用于那種復(fù)現(xiàn)概率很低,又比較嚴(yán)重的性能問(wèn)題

<2>Perfetto具有很好的可擴(kuò)展性,它除了提供標(biāo)準(zhǔn)的 tracepoints 之外,例如CPU調(diào)度信息,內(nèi)存信息等,還可以通過(guò) atrace HAL 層擴(kuò)展,在 Android P當(dāng)中,Google新增加了一個(gè) atrace HAL 層,atrace 進(jìn)程可以調(diào)用這個(gè)HAL的接口來(lái)獲取當(dāng)前的擴(kuò)展信息,相關(guān)代碼可見(jiàn) Google 提交,這樣如果需要擴(kuò)展 tracepoints 的話,就可以按照 graphic 的示例添加即可

<3>提供全新的 Perfetto UI 網(wǎng)站,可以在上面通過(guò)選取開(kāi)關(guān)的方式,自動(dòng)生成抓取 trace 的命令,同時(shí)可以打開(kāi) trace 文件。另外還集成了幾種預(yù)定義的 trace 分析統(tǒng)計(jì)工具,詳情可見(jiàn)它的 Metrics and auditors 選項(xiàng)

Perfetto本身是一個(gè)框架,關(guān)于它的架構(gòu)和模塊的詳細(xì)介紹,可以參考它的 doc網(wǎng)站,它的源碼可以參考 Android Source Tree 的 /external/perfetto 目錄,里面有很多的tools和腳本,可以拿來(lái)直接使用

doc網(wǎng)站:https://docs.perfetto.dev/#/?id=perfetto-performance-instrumentation-and-tracing

二、抓取trace

2.1? UI操作抓取trace[推薦]

2.1.1打開(kāi)操作界面

方式1:在開(kāi)發(fā)者選項(xiàng)中打開(kāi)

我的手機(jī)沒(méi)有找到這個(gè)選項(xiàng)。所以我自己寫(xiě)了個(gè)應(yīng)用,啟動(dòng)這個(gè)界面:

方式2:通過(guò)命令打開(kāi)

adb shell am start com.android.traceur/com.android.traceur.MainActivity,界面如下:

選中顯示“凱捷設(shè)置”圖塊,則會(huì)在控制中心中顯示快速抓取trace圖標(biāo):如下

那么下次要抓trace,直接點(diǎn)擊這個(gè)圖標(biāo)可以了

2.1.2開(kāi)始錄制

2.1.3數(shù)據(jù)保存位置 /data/local/traces

導(dǎo)出trace文件:

2.1.4如何查看trace文件

2.2命令行工具抓取trace

perfetto是一個(gè)命令行工具,在shell環(huán)境下執(zhí)行,同時(shí)在手機(jī)端也有兩個(gè)進(jìn)程: traced 和 traced_probes,這兩個(gè)進(jìn)程運(yùn)行在手機(jī)端,可能需要執(zhí)行如下命令才會(huì)開(kāi)啟這兩個(gè)進(jìn)程,開(kāi)啟這兩個(gè)進(jìn)程之后,才能正常抓取trace信息

adb shell setprop persist.traced.enable 1

如果只是使用這個(gè)工具的話,只要懂得perfetto命令行工具的用法就可以了

參數(shù)使用

--out用來(lái)指定 trace 輸出文件,

--config用來(lái)指定配置,例如抓多長(zhǎng)時(shí)間,間隔多久把內(nèi)存數(shù)據(jù)寫(xiě)回文件,抓取哪些 tracepoints 等等,config 文件內(nèi)容,可以自己手動(dòng)編寫(xiě),也可以用Perfetto UI網(wǎng)站生成,另外在 Perfetto 里面默認(rèn)集成了一個(gè) test 配置,可以使用如下命令抓取一個(gè)使用 test config 的 trace 文件

//使用內(nèi)置的test配置,然后輸出到/data/misc/perfetto-traces/trace

$ adb shell perfetto --config :test --out /data/misc/perfetto-traces/trace

抓取完后,把/data/misc/perfetto-traces/trace文件內(nèi)容 pull 出來(lái),然后使用 Perfetto UI 網(wǎng)站打開(kāi)

adb shell chmod 777? /data/misc/perfetto-traces/trace

adb pull? /data/misc/perfetto-traces/trace .

2.3自定義Config[推薦]

目前最方便的配置文件生成方式是使用Perfetto UI網(wǎng)站來(lái)幫助生成,點(diǎn)擊 Record new trace 會(huì)看到有很多的配置界面



方式1:通過(guò)上面的步驟,從而自動(dòng)生成命令,然后執(zhí)行

選擇想要的tracepoints之后,點(diǎn)擊 Show Command,將命令內(nèi)容拷貝出來(lái)直接在終端就可以執(zhí)行,完成之后把 /data/misc/perfetto-traces/trace 這個(gè)文件拷貝出來(lái)進(jìn)行分析




adb shell perfetto \ -c - --txt \ -o /data/misc/perfetto-traces/trace \ <<EOF buffers: { size_kb: 8960 fill_policy: DISCARD } buffers: { size_kb: 1280 fill_policy: DISCARD } data_sources: { config { name: "linux.process_stats" target_buffer: 1 process_stats_config { scan_all_processes_on_start: true } } } data_sources: { config { name: "linux.sys_stats" sys_stats_config { stat_period_ms: 1000 stat_counters: STAT_CPU_TIMES stat_counters: STAT_FORK_COUNT } } } data_sources: { config { name: "linux.ftrace" ftrace_config { ftrace_events: "block/*" ftrace_events: "sched/sched_switch" ftrace_events: "power/suspend_resume" ftrace_events: "sched/sched_wakeup" ftrace_events: "sched/sched_wakeup_new" ftrace_events: "sched/sched_waking" ftrace_events: "power/cpu_frequency" ftrace_events: "power/cpu_idle" ftrace_events: "power/gpu_frequency" ftrace_events: "sched/sched_process_exit" ftrace_events: "sched/sched_process_free" ftrace_events: "task/task_newtask" ftrace_events: "task/task_rename" buffer_size_kb: 2048 drain_period_ms: 250 } } } duration_ms: 10000 EOF

復(fù)制到dos框,進(jìn)行執(zhí)行

方式2:網(wǎng)頁(yè)中直接連接設(shè)備,然后開(kāi)始抓取

2.4 trace無(wú)法抓取解決方案:

<1>啟動(dòng)跟蹤服務(wù)

由于Perfetto基于服務(wù)的體系結(jié)構(gòu) ,因此必須運(yùn)行traced和traced_probes服務(wù)來(lái)記錄跟蹤。

自Android 9(Pie)起,這些服務(wù)默認(rèn)情況下在Android系統(tǒng)映像中附帶,但默認(rèn)情況下并非始終啟用。在Android 9(P)和10(Q)上,這些服務(wù)默認(rèn)情況下僅在Pixel手機(jī)上啟用,并且必須在其他手機(jī)上手動(dòng)啟用。從Android 11(R)開(kāi)始,默認(rèn)情況下,大多數(shù)設(shè)備上都啟用了perfetto服務(wù)。

要啟用perfetto服務(wù),請(qǐng)運(yùn)行:

# Will start both traced and traced_probes.

adb shell setprop persist.traced.enable 1

三、打開(kāi)trace


3.1使用默認(rèn)窗口打開(kāi)trace[推薦,畢竟是google推崇的]

https://ui.perfetto.dev/#!/



3.2使用命令將perfetto的trace轉(zhuǎn)換為systrace分析


3.3使用舊版systrace界面分析

四、trace界面使用詳解

4.1快捷鍵


4.1放大

W鍵放大或者ctrl+滾輪

4.1 shift+m選中區(qū)域

4.1文字顯示線程的運(yùn)行狀態(tài),取締舊版的線程顏色

4.2選中框的含義

當(dāng)我們選中一段時(shí)間內(nèi)的幾個(gè)線程時(shí),還需要加入其他線程。就可以通過(guò)選擇復(fù)選框,來(lái)添加需要分析的線程或進(jìn)程。然后整體查看這些線程的運(yùn)行信息

4.3搜索


4.4關(guān)注的線程可用收藏號(hào)進(jìn)行標(biāo)記,便于上下翻動(dòng)時(shí)快速找到

4.5查看Runnable被誰(shuí)喚醒的方法

Perfetto查看runnable的喚醒方法和systrace不一樣,如下:

點(diǎn)擊runnable,看不到是誰(shuí)喚醒的。需要緊接著點(diǎn)擊:running


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容