測量裝置的記憶體用量

ffx profile memory 指令可以測量 Fuchsia 系統的 RAM (隨機存取記憶體) 用量。

概念

ffx profile memory 指令會評估 Fuchsia 系統中 VMO (虛擬記憶體物件) 使用的記憶體量。與 Linux 的 ps 指令不同,這個指令會評估所有 VMO 是否對應。

以下是 ffx profile memory 擷取的程序記憶體用量範例:

Process name: core.cm
Process koid: 26387
Private:      268 KiB
PSS:          650.72 KiB (Proportional Set Size)
Total:        4.73 MiB (Private + Shared unscaled)
                              Private       Scaled        Total
    [scudo]                    60 KiB       60 KiB       60 KiB
    [data]                     56 KiB       56 KiB       56 KiB
    [relro]                    56 KiB       56 KiB       56 KiB
    bss:blob-e243d9eb          56 KiB       56 KiB       56 KiB
    [stacks]                   28 KiB       28 KiB       28 KiB
    AllocatorRingBuffer         4 KiB        4 KiB        4 KiB
    [libraries]                 4 KiB        4 KiB        4 KiB
    stack: msg of 0x1000        4 KiB        4 KiB        4 KiB
    [blobs]                       0 B   382.22 KiB     4.41 MiB     (shared)
    vdso/next                     0 B        338 B       40 KiB     (shared)
    vdso/stable                   0 B        170 B       20 KiB     (shared)

在 Fuchsia 中,記憶體可由多個程序共用,因為多個程序可處理同一個 VMO。因此在某些情況下,區分私人記憶體和共用記憶體會很有幫助。為協助區分,ffx profile memory 會分別以 3 種不同但重疊的類別回報程序的記憶體用量:

  • Private 是專由這項程序單獨保留的 VMO 及其子 VMO 大小總計。
  • Scaled 是 VMO 及其子項 VMO 的總大小,這些程序由多個程序保留。這些 VMO 的費用會平均分配給各個保留程序。例如,由 5 個程序共用的 500 KiB,則這 5 個程序會分別增加 100 KiB。
  • Total 是這項程序所保留的所有 VMO 及其子 VMO 的總大小,包括與其他程序共用的 VMO。

部分 VMO 會附加名稱。根據名稱而定,通常可以瞭解 VMO 的用途。舉例來說,如果 VMO 的名稱以 scudo 開頭,則 Scudo 分配器可能會使用該 VMO。這些名稱可讓 ffx profile memory 將特定程序的 VMO 分類成可能的來源。類別清單包括:

  • [scudo]:Scudo 使用的 VMO,Fuchsia 的預設記憶體配置器。
  • [stacks]:VMO 用於儲存程序執行緒的堆疊。
  • [blobs]:blobFS 撥出的 VMO。包括經過修改的子 VMO。
  • [relro]:包含已搬遷的二進位檔的唯讀部分 VMO。
  • [data]:包含二進位檔資料區隔的 VMO。
  • [unnamed]:沒有名稱的 VMO。

如果 VMO 的名稱不屬於任何內建類別,則會顯示為各自的類別。

基本上,ffx profile memory 指令會使用 memory_monitor 元件擷取系統中所有 VMO 的記憶體資訊。

測量時間間隔內的記憶體用量

如要追蹤特定時間間隔的記憶體用量,請執行下列指令:

ffx profile memory --interval SECONDS

SECONDS 替換為時間間隔 (以秒為單位)。

以下範例指令每隔 3 秒會檢查目標 Fuchsia 裝置的記憶體用量,直到指令終止為止 (通常是在終端機中按下 CTRL+C):

$ ffx profile memory --csv --interval 3

請注意,範例指令會以 CSV 格式 (--csv) 輸出輸出內容。為了進行偵錯,如要取得 memory_monitor 元件匯出的原始資料,您可以使用 --debug-json 選項執行指令。