前言:雖然有翻譯軟件,雖然有chatgpt,畢竟語言隔閡,對這個工具還是一知半解,因此想通過翻譯的方式和大家來一起學習下Perfetto這個強大的工具
#####################以下分割線#####################
英文原文在這里
Perfetto - 一個用于系統(tǒng)分析、應用程序trace抓取和trace分析的利器
Perfetto是一個用于性能分析和trace分析的生產(chǎn)級開源堆棧工具。它提供用于服務(wù)和庫,可以用來抓取系統(tǒng)級別和應用級別的trace。也可以用來分析native和 Java 堆內(nèi)存。Perfetto包括一個使用 SQL 分析跟蹤數(shù)據(jù)的庫和一個基于 Web 的 UI 以可視化和探索GB級別大小的trace。

抓取trace
作為工具的核心,Perfetto引入了一種新穎的從用戶空間到用戶空間的的trace 協(xié)議,該協(xié)議基于對共享內(nèi)存緩沖區(qū)的直接protobuf序列化。這個trace 協(xié)議既能在已經(jīng)構(gòu)建好的數(shù)據(jù)源上使用(安卓+chrome ?),也能通過Tracing SDK 和trace事件庫的方式導出到c++應用中。
android和linux 系統(tǒng)上的trace
在Linux和Android上,Perfetto有很多數(shù)據(jù)來源,這些數(shù)據(jù)源能夠從不同的系統(tǒng)接口收集詳細的性能數(shù)據(jù)。有關(guān)完整集合和詳細信息,請參閱文檔的“數(shù)據(jù)源”部分。數(shù)據(jù)來源有以下這些:
內(nèi)核trace: Perfetto集成了linux 系統(tǒng)的ftrace,這使得Perfetto可以記錄內(nèi)核的事件(比如,調(diào)度事件,系統(tǒng)調(diào)用等)到trace文件中,
/proc and /sys pollers: 允許對進程范圍或系統(tǒng)范圍的cpu和內(nèi)存計數(shù)器的狀態(tài)進行采樣。
Android HAL :可以用來記錄耗電量信息
native堆分析:一個性能開銷小的堆分析器,通過hook malloc/free/new/delete等內(nèi)存相關(guān)方法,并且可以將函數(shù)調(diào)用關(guān)系與分配相關(guān)聯(lián)?;趏ut-of-process unwinding,和動態(tài)化的采樣技術(shù),可以直接從運行中的進程采集。
-
Java堆:通過與Android runtime 深度綁定的out-of-process 分析器,可以獲取到完整的內(nèi)存分配快照(包括類型、字段名、持有對象大小和對其他對象的引用)。而不需要獲取到全部的堆對象內(nèi)容,這減少了序列化的時間和減少了文件大小。
在Android平臺上,Perfetto是下一代的分析工具,會替代基于chromium的systrace. 而基于ATrace的instrumentation](https://perfetto.dev/docs/data-sources/atrace) 仍然會繼續(xù)保留,你可以在這里看到更詳細的信息。
Tracing SDK和用戶空間檢測
Perfetto Tracing SDK讓C++開發(fā)者也抓取更多的app 特有的trace,既可以自定義事件類型,使用自定義的數(shù)據(jù)來源,這樣更加靈活。也可以簡單的使用Track Event Library 這個庫,這個庫只需要加上類似TRACE_EVENT("category", "event_name", "x", "str", "y", 42)的注解,就可以簡單的獲得帶有時間長度的slices,以及計數(shù)器和時間標記信息。
SDK是為跟蹤多進程系統(tǒng)和多線程進程而設(shè)計的。它基于ProtoZero,這是一個用于在線程本地共享內(nèi)存緩沖區(qū)上直接寫入protobuf事件的庫。
相同的代碼既可以在完全進程模式下工作(在專用線程上托管Perfetto跟蹤服務(wù)的實例),也可以在系統(tǒng)模式下工作,通過UNIX套接字連接到Linux/Android tracing守護進程,允許將應用程序的instrumentation與系統(tǒng)范圍的跟蹤事件相結(jié)合。
SDK基于可移植的C++17代碼,使用主要的C++清理程序(ASan、TSan、MSan、LSan)進行測試。它不依賴于運行時代碼修改或編譯器插件。
在Chromium 上tracing
Perfetto的設(shè)計初衷是取代chrome://tracing這些基礎(chǔ)工具,Chromium中的tracing基于Perfetto在所有主要平臺(Android、CrOS、Linux、MacOS、Windows)的代碼庫,因此在這些系統(tǒng)上的trace 大體架構(gòu)也類型,但在內(nèi)部使用Chromium Mojo IPC系統(tǒng),而不是Perfetto自己的UNIX套接字。
默認情況下,tracing在Chromium中以進程內(nèi)模式工作,只記錄Chromium進程發(fā)出的數(shù)據(jù)。在Android(以及Linux上,如果禁用Chromium沙箱)上,跟蹤可以在混合進程內(nèi)+系統(tǒng)模式下工作,將特定于chrome的跟蹤事件與Perfetto系統(tǒng)事件相結(jié)合。
trace 分析
Perfetto不光能采集trace,而且還包括數(shù)據(jù)導入,數(shù)據(jù)解析和查詢新舊trace格式的工具。Trace Processor.
Trace Processor是一個可移植的C++17庫,它提供了面向列的表存儲,專門設(shè)計用于將數(shù)小時的跟蹤數(shù)據(jù)有效地保存到內(nèi)存中,并提供了一個基于流行的SQLite查詢引擎的SQL查詢接口。跟蹤數(shù)據(jù)模型變成了一組SQL表,可以通過極其強大和靈活的方式查詢這些表來分析trace數(shù)據(jù)。
除此之外,跟蹤處理器還包括一個基于trace的度量子系統(tǒng),該子系統(tǒng)由初步的和可擴展的查詢組成,可以以JSON或protobuf消息的形式輸出關(guān)于trace的重點摘要(例如,按進程和線程劃分,不同頻率狀態(tài)下的CPU使用情況,)。
基于trace的度量系統(tǒng)可以在性能測試場景或大批量分析或中輕松集成。
Trace Processor還設(shè)計用于低延遲查詢和構(gòu)建跟蹤可視化工具。如今,Trace Processor被Perfetto UI用作Web Assembly模塊,Android Studio和Android GPU Inspector用作原生C++庫。
可視化trace
Perfetto還提供了一個全新的跟蹤可視化工具,用于打開和查詢長達數(shù)小時的跟蹤,可在ui.Perfetto.dev上獲得。新的可視化工具利用了現(xiàn)代網(wǎng)絡(luò)平臺技術(shù)。其基于多線程設(shè)計的WebWorkers使UI始終保持響應;Trace Processor和SQLite的分析能力通過WebAssembly在瀏覽器中完全可用。
Perfetto UI在打開一次后可以完全離線工作。使用UI打開的跟蹤由瀏覽器本地處理,不需要任何服務(wù)器端交互。

歡迎參與進來
問題反饋
Android 系統(tǒng)的trace ,請點擊這里
chrome 系統(tǒng)的trace,請點擊這里
#####################以上分割線#####################
后記:
1 本次主要使用百度翻譯,雖然被罵,但至少翻譯這個工具降低了門檻。
2 英文文檔中的長難句真的是又長又難,基于百度的翻譯,然后自己再調(diào)整下,水平實在有限。
3 技術(shù)背景知識不夠,有些專有名詞不知道怎么翻譯,也不知道百度翻譯的是否準確,功夫在詩外。
4 萬事開頭難,中間難不難,還不知道。中間的事后面再說,正確一天翻譯一篇。
5 雖然可能會有人不屑,但總要有人去做不起眼的小事。
6 google 厲害,這個perfetto 工具也很厲害。君子善假于物也。
7 工具的使用是最簡單的入門,背后還有更多的東西值得學習。
8 水平實在有限,聞過則喜,希望有更多的人反饋,期待更好的建議