錄製追蹤記錄並以視覺化方式呈現

本頁面說明如何在 Fuchsia 裝置上使用Fuchsia 追蹤系統記錄及視覺化呈現追蹤記錄。

必要條件

許多現有的 Fuchsia 元件已經註冊為追蹤提供者,其追蹤資料通常可以提供充分的系統總覽。因此,如果您只需要記錄一般追蹤記錄 (例如在錯誤報告中納入詳細資料),您可以繼續閱讀以下各節。不過,如要從特定元件收集其他自訂追蹤事件,您必須先完成下列工作:

錄製追蹤記錄

如要從主體機器錄製 Fuchsia 裝置上的追蹤記錄,請執行下列指令:

ffx trace start --duration <SECONDS>

這個指令會以預設設定啟動追蹤記錄,並擷取目標裝置的概略總覽。

追蹤記錄會在指定期間持續進行 (如未指定時間長度,則直到按下 ENTER 鍵為止)。追蹤記錄完成後,追蹤記錄資料會自動儲存至目前目錄的 trace.fxt 檔案 (可透過指定 --output 標記加以變更,例如 ffx trace start --output <FILE_PATH>)。如要以視覺化方式呈現儲存在此檔案中的追蹤記錄結果,請參閱下方的以視覺化方式呈現追蹤記錄一節。

以視覺化方式呈現追蹤記錄

Fuchsia 追蹤記錄格式 (.fxt) 是 Fuchsia 的二進位格式,可直接對原始追蹤記錄資料進行編碼。如要以視覺化方式呈現 .fxt 追蹤記錄,可以使用 Perfetto 檢視器

請完成下列步驟:

  1. 透過網路瀏覽器前往 Perfetto 檢視器網站。
  2. 按一下導覽列中的「Open trace file」
  3. 從主體機器選取 .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

請完成下列步驟:

  1. 在 Chrome 瀏覽器中開啟新分頁。
  2. 前往 chrome://tracing
  3. 按一下「Load」按鈕。
  4. 開啟 JSON 追蹤記錄檔案。

如要進一步瞭解 Chromium 的追蹤檢視者,請參閱「追蹤事件剖析工具」。

(已淘汰) 以視覺化方式呈現 HTML 追蹤記錄

HTML 追蹤記錄是包含檢視器和追蹤記錄資料的獨立檔案。

如要產生 HTML 追蹤記錄,您可以使用 Chromium Catapult 存放區中的 trace2html 工具,轉換現有的 JSON 追蹤檔。

從 Catapult 存放區中執行下列指令:

./tracing/bin/trace2html <JSON_TRACE_FILE>

產生 HTML 追蹤檔後,您可以在任何網路瀏覽器上開啟該檔案,分析追蹤記錄結果。

如要瀏覽 HTML 追蹤檔案的資訊,請使用下列實用的鍵盤快速鍵:

  • ws:分別放大和縮小。縮放函式取決於滑鼠的目前位置。
  • WS:分別放大和縮小。縮放函式會以滑鼠的目前位置為基礎。
  • ad:分別向左和向右平移。
  • AD:分別放大左右平移。

此外,您也可以取消選取特定程序資料列,以移除對目前的追蹤記錄來說無關的程序。如要取消選取特定程序列,請按一下程序列右上角的 [x]x

(已淘汰) 分析 HTML 追蹤記錄

這份逐步操作說明會介紹在網路瀏覽器中產生 HTML 追蹤檔並分析結果的工作流程。本逐步操作說明中的範例記錄了 Fuchsia 系統的追蹤記錄,同時持續執行 du 指令,這個指令會掃描並產生系統的磁碟用量。

產生追蹤資料並轉換為 HTML

如要記錄 du 的追蹤記錄並轉換為 HTML 追蹤檔,請按照下列步驟操作:

  1. (選用) 如果您沒有執行中的 Fuchsia 裝置,請在已啟用網路的 Fuchsia 模擬器上啟動執行個體:

    ffx emu --net tap
    
  2. 在新終端機中啟動追蹤記錄:

    ffx trace start --buffer-size 64 --categories all
    

    這個指令會設定 64 MB 的記錄緩衝區空間,並記錄所有追蹤記錄類別。

  3. 在 Fuchsia 模擬器的主控台中執行下列指令:

    /boot/bin/sh -c "'\
       sleep 2 ;\
       i=0 ;\
       while [ \$i -lt 10 ] ;\
       do /bin/du /boot ;\
           i=\$(( \$i + 1 )) ;\
       done'"
    

    這個指令會在迴圈中執行 du

  4. 如要完成追蹤記錄,請在執行 ffx trace start 的終端機中按下 Enter 鍵。

    完成後,指令會產生 trace.fxt 檔案。

  5. 將這個 FXT 檔案轉換為 JSON 格式:

    fx trace2json < trace.fxt > trace.json
    
  6. 產生 HTML 追蹤記錄:

    ./tracing/bin/trace2html trace.json
    
  7. 在網路瀏覽器中開啟這個 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)。

放大 CPU 和檔案系統資訊的螢幕截圖

圖 2:放大成區域的 HTML 追蹤記錄檔案的螢幕截圖。

在此範例中,您只看到兩個 du 執行作業 (第一個以綠色圓圈標示)。第一個 blobfs CPU 爆發實際上包含 3 個主要叢集和一些較小的尖峰。後續的 blobfs CPU 爆發作業會有兩個叢集。

透過分析這個範例,您可以看到 blobfs 爆發發生在執行 du 程式之前。此資訊顯示,blobfs 爆發並非因為有讀取檔案系統的 du 程式而發生。而會改為顯示突發的原因是載入 du 程式。

你現在可以進一步瞭解blobs爆發的原因。

blob 追蹤記錄時間圖片

圖 3:顯示時間比例約為 1 毫秒的 HTML 追蹤記錄檔案螢幕截圖。

在此範例中,請注意時間範圍介於 2,023,500 微秒到過去的 2,024,500 之間,表示時間範圍大約為 1 毫秒。在此毫秒內,blobfs 會執行程式碼,從識別為 FileReadAt 的程序開始,接著呼叫 Blob::Read,接著稱為 Blob::ReadInternal

如果想為這項資訊與程式碼建立關聯,您可以按一下報表的各個部分,取得特定物件的詳細資訊:

  • 如果按一下 FileReadAt,可能會看到類似下列的資訊:

    FileReadAt 資訊的圖片

    提供以下資訊:

    • FileReadAt 的追蹤類別為 vfs
    • 函式執行的時間長度。

    如要瞭解 FileReatAt 的追蹤記錄執行方式,請參閱 //src/storage/lib/vfs/cpp/connection/connection.cc

  • 如果按一下 Blob::Read,可能會看到類似下列的資訊:

    Blob 圖片:閱讀資訊

    以下是 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