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 分配器使用。借助这些名称,ffx profile memory
可以将给定进程的 VMO 归类为可能的来源。类别列表包括:
[scudo]
:Scudo(Fuchsia 的默认内存分配器)使用的 VMO。[stacks]
:用于存储进程线程堆栈的 VMO。[blobs]
:blobFS 分发的 VMO。其中可能包括经过修改的子 VMO。[relro]
:包含二进制文件的重新定位只读部分的 VMO。[data]
:包含二进制文件数据段的 VMO。[unnamed]
:没有名称的 VMOS。
如果 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
选项运行该命令。