本頁面說明如何在 Fuchsia 裝置上使用Fuchsia 追蹤系統記錄及視覺化呈現追蹤記錄。
必要條件
許多現有的 Fuchsia 元件已經註冊為追蹤提供者,其追蹤資料通常可以提供充分的系統總覽。因此,如果您只需要記錄一般追蹤記錄 (例如在錯誤報告中納入詳細資料),您可以繼續閱讀以下各節。不過,如要從特定元件收集其他自訂追蹤事件,您必須先完成下列工作:
錄製追蹤記錄
如要從主體機器錄製 Fuchsia 裝置上的追蹤記錄,請執行下列指令:
ffx trace start --duration <SECONDS>
這個指令會以預設設定啟動追蹤記錄,並擷取目標裝置的概略總覽。
追蹤記錄會在指定期間持續進行 (如未指定時間長度,則直到按下 ENTER
鍵為止)。追蹤記錄完成後,追蹤記錄資料會自動儲存至目前目錄的 trace.fxt
檔案 (可透過指定 --output
標記加以變更,例如 ffx trace start --output <FILE_PATH>
)。如要以視覺化方式呈現儲存在此檔案中的追蹤記錄結果,請參閱下方的以視覺化方式呈現追蹤記錄一節。
以視覺化方式呈現追蹤記錄
Fuchsia 追蹤記錄格式 (.fxt
) 是 Fuchsia 的二進位格式,可直接對原始追蹤記錄資料進行編碼。如要以視覺化方式呈現 .fxt
追蹤記錄,可以使用 Perfetto 檢視器。
請完成下列步驟:
- 透過網路瀏覽器前往 Perfetto 檢視器網站。
- 按一下導覽列中的「Open trace file」。
- 從主體機器選取
.fxt
檔案。
這個檢視器也可讓您使用 SQL 查詢追蹤記錄資料。
附錄
Fuchsia 追蹤系統先前支援多種檔案格式,以及以不同視覺化方式呈現追蹤記錄的方式。以下各節說明與現已淘汰的追蹤記錄格式相關的工作流程。
(已淘汰) 以視覺化方式呈現 JSON 追蹤記錄
JSON 追蹤記錄是一種在 Chrome 瀏覽器中查看追蹤記錄資料的格式。
如要將 .fxt
追蹤記錄檔案轉換為 JSON 格式,請執行下列指令:
fx trace2json < <FXT_FILE> > trace.json
將 FXT_FILE
替換成 FXT 追蹤檔,例如:
$ fx trace2json < trace.fxt > trace.json
如要以視覺化方式呈現 JSON 追蹤記錄,請使用 Chrome 瀏覽器內建的 Trace-Viewer。
請完成下列步驟:
- 在 Chrome 瀏覽器中開啟新分頁。
- 前往
chrome://tracing
。 - 按一下「Load」按鈕。
- 開啟 JSON 追蹤記錄檔案。
如要進一步瞭解 Chromium 的追蹤檢視者,請參閱「追蹤事件剖析工具」。
(已淘汰) 以視覺化方式呈現 HTML 追蹤記錄
HTML 追蹤記錄是包含檢視器和追蹤記錄資料的獨立檔案。
如要產生 HTML 追蹤記錄,您可以使用 Chromium Catapult 存放區中的 trace2html
工具,轉換現有的 JSON 追蹤檔。
從 Catapult 存放區中執行下列指令:
./tracing/bin/trace2html <JSON_TRACE_FILE>
產生 HTML 追蹤檔後,您可以在任何網路瀏覽器上開啟該檔案,分析追蹤記錄結果。
瀏覽 HTML 追蹤檔
如要瀏覽 HTML 追蹤檔案的資訊,請使用下列實用的鍵盤快速鍵:
w
和s
:分別放大和縮小。縮放函式取決於滑鼠的目前位置。W
和S
:分別放大和縮小。縮放函式會以滑鼠的目前位置為基礎。a
和d
:分別向左和向右平移。A
和D
:分別放大左右平移。
此外,您也可以取消選取特定程序資料列,以移除對目前的追蹤記錄來說無關的程序。如要取消選取特定程序列,請按一下程序列右上角的 [x]x。
(已淘汰) 分析 HTML 追蹤記錄
這份逐步操作說明會介紹在網路瀏覽器中產生 HTML 追蹤檔並分析結果的工作流程。本逐步操作說明中的範例記錄了 Fuchsia 系統的追蹤記錄,同時持續執行 du
指令,這個指令會掃描並產生系統的磁碟用量。
產生追蹤資料並轉換為 HTML
如要記錄 du
的追蹤記錄並轉換為 HTML 追蹤檔,請按照下列步驟操作:
(選用) 如果您沒有執行中的 Fuchsia 裝置,請在已啟用網路的 Fuchsia 模擬器上啟動執行個體:
ffx emu --net tap
在新終端機中啟動追蹤記錄:
ffx trace start --buffer-size 64 --categories all
這個指令會設定 64 MB 的記錄緩衝區空間,並記錄所有追蹤記錄類別。
在 Fuchsia 模擬器的主控台中執行下列指令:
/boot/bin/sh -c "'\ sleep 2 ;\ i=0 ;\ while [ \$i -lt 10 ] ;\ do /bin/du /boot ;\ i=\$(( \$i + 1 )) ;\ done'"
這個指令會在迴圈中執行
du
,如要完成追蹤記錄,請在執行
ffx trace start
的終端機中按下Enter
鍵。完成後,指令會產生
trace.fxt
檔案。將這個 FXT 檔案轉換為 JSON 格式:
fx trace2json < trace.fxt > trace.json
產生 HTML 追蹤記錄:
./tracing/bin/trace2html trace.json
在網路瀏覽器中開啟這個 HTML 檔案。
圖 1:在迴圈中記錄
du
程序的 HTML 追蹤記錄檔案螢幕截圖。追蹤檔有許多資訊,包括接近追蹤記錄頂端的時間尺度。在上述範例中,整個追蹤記錄持續了約 2.5 秒。
查看 CPU 使用率
圖 1 中以黃色圓圈標示的區域顯示 CPU 使用率區域,可用來查看所有 CPU 核心的整體 CPU 使用率。
檢查程式執行作業
圖 1 中標有綠色圓圈的區域即為程式執行作業。
在這個範例中,您可以查看 du
程式的 10 次叫用,這是自 du
迴圈記錄追蹤記錄以來的預期。因此,您可以依序看到 10 個不同的 du
程序 ID。
檢查 blobfs CPU 使用率
圖 1 中以藍色圓圈標示的區域,顯示寫入 Blob 檔案系統 (blobFS) 的 CPU 使用率。
在這個範例中,您可以看到 CPU 作業時間的爆發,每個都與 du
叫用作業有關。在這個較高的層級中,要判斷 CPU 使用率和檔案系統之間的確切關聯性可能會較為困難,原因可能如下:
- CPU 用量是否是由檔案系統載入
du
所致? - 當執行
du
透過目標檔案系統查看已使用的空間時,是否會造成 CPU 用量?
您可以放大這個區域的特定區域,判斷 CPU 使用率與檔案系統之間的關聯性 (請參見圖 2)。
圖 2:放大成區域的 HTML 追蹤記錄檔案的螢幕截圖。
在此範例中,您只看到兩個 du
執行作業 (第一個以綠色圓圈標示)。第一個 blobfs
CPU 爆發實際上包含 3 個主要叢集和一些較小的尖峰。後續的 blobfs
CPU 爆發作業會有兩個叢集。
透過分析這個範例,您可以看到 blobfs
爆發發生在執行 du
程式之前。此資訊顯示,blobfs
爆發並非因為有讀取檔案系統的 du
程式而發生。而會改為顯示突發的原因是載入 du
程式。
你現在可以進一步瞭解blobs
爆發的原因。
圖 3:顯示時間比例約為 1 毫秒的 HTML 追蹤記錄檔案螢幕截圖。
在此範例中,請注意時間範圍介於 2,023,500 微秒到過去的 2,024,500 之間,表示時間範圍大約為 1 毫秒。在此毫秒內,blobfs
會執行程式碼,從識別為 FileReadAt
的程序開始,接著呼叫 Blob::Read
,接著稱為 Blob::ReadInternal
。
如果想為這項資訊與程式碼建立關聯,您可以按一下報表的各個部分,取得特定物件的詳細資訊:
如果按一下
FileReadAt
,可能會看到類似下列的資訊:提供以下資訊:
FileReadAt
的追蹤類別為vfs
。- 函式執行的時間長度。
如要瞭解
FileReatAt
的追蹤記錄執行方式,請參閱//src/storage/lib/vfs/cpp/connection/connection.cc
。如果按一下
Blob::Read
,可能會看到類似下列的資訊:以下是
Blob::Read
的程式碼:zx_status_t Blob::Read(void* data, size_t len, size_t off, size_t* out_actual) { TRACE_DURATION("blobfs", "Blob::Read", "len", len, "off", off); LatencyEvent event(&blobfs_->GetMutableVnodeMetrics()->read, blobfs_->CollectingMetrics()); return ReadInternal(data, len, off, out_actual); }
此程式碼會使用
blobfs
的類別、Blob::Read
名稱,以及長度和偏移鍵/值組合呼叫TRACE_DURATION()
巨集。上述所有資訊都會記錄在追蹤檔中。如要瞭解
Blob::Read
的追蹤記錄執行方式,請參閱//src/storage/blobfs/blob.cc
。