首頁 > 技術 > 正文

Android Perfetto 系列 14:heapprofd 与内存 Profiling

2026-10-30  ·  閱讀:153
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
duration_ms: 15000

buffers { size_kb: 131072 fill_policy: DISCARD } # 0: heapprofd
buffers { size_kb: 32768 fill_policy: RING_BUFFER } # 1: system context

data_sources {
config {
name: "linux.process_stats"
target_buffer: 1
process_stats_config {
scan_all_processes_on_start: true
proc_stats_poll_ms: 1000
}
}
}

data_sources {
config {
name: "linux.sys_stats"
target_buffer: 1
sys_stats_config {
meminfo_period_ms: 1000
meminfo_counters: MEMINFO_MEM_AVAILABLE
meminfo_counters: MEMINFO_CACHED
meminfo_counters: MEMINFO_SWAP_FREE
meminfo_counters: MEMINFO_ZRAM
vmstat_period_ms: 1000
vmstat_counters: VMSTAT_PGFAULT
vmstat_counters: VMSTAT_PGMAJFAULT
vmstat_counters: VMSTAT_OOM_KILL
}
}
}

data_sources {
config {
name: "linux.ftrace"
target_buffer: 1
ftrace_config {
ftrace_events: "sched/sched_switch"
ftrace_events: "sched/sched_waking"
atrace_categories: "am"
atrace_categories: "view"
atrace_apps: "com.example.app"
}
}
}

data_sources {
config {
name: "track_event"
target_buffer: 1
track_event_config {
disabled_categories: "*"
enabled_categories: "memory"
enabled_categories: "app"
}
}
producer_name_filter: "com.example.app"
}

data_sources {
config {
name: "android.heapprofd"
target_buffer: 0
heapprofd_config {
sampling_interval_bytes: 4096
process_cmdline: "com.example.app"
continuous_dump_config {
dump_phase_ms: 5000
dump_interval_ms: 5000
}
shmem_size_bytes: 8388608
block_client: false
max_heapprofd_memory_kb: 262144
max_heapprofd_cpu_secs: 30
}
}
}

这仍然是 native heap 模板,不是图形内存模板。排查 GraphicBuffer、dma-buf、GPU texture、Surface buffer 时,要额外对照 dmabuf、GPU/graphics 计数、dumpsys meminfo Graphics/GL、SurfaceFlinger layer / buffer 信息;heapprofd 只能回答 malloc/new 侧有没有对应贡献。

heapprofd buffer 使用 DISCARD 时,buffer 必须足够大。heap profile 常在 dump 点集中写入,DISCARD 满后会丢新数字,对末尾 diamond 和未释放大头很危险。抓完必须检查 traced_buf_chunks_discarded、heapprofd_* stats;长 Trace 或写入量不确定时,优先给 heapprofd 独立大 buffer,必要时改 RING 并在报告里說明旧 dump 可能被覆盖。

临时排查时,直接把 PBTX 通过 stdin 传给 perfetto 最稳。输出路径在 Android 上放到 /data/misc/perfetto-traces/:

1
2
3
adb push config.pbtx /data/local/tmp/config.pbtx
adb shell 'cat /data/local/tmp/config.pbtx | perfetto -c - --txt -o /data/misc/perfetto-traces/heap.pftrace'
adb pull /data/misc/perfetto-traces/heap.pftrace .

手写 HeapprofdConfig 和 tools/heap_profile 的默认行为不完全一样。block_client 可以在 heapprofd shared memory 满时阻塞目的進程,换取统计结果完整性;脚本的 --block-client 是默认行为,但手写配置需要自己决定。

本文由News整理發布,僅供參考。

12345678
評論載入中…

友情連結申請友鏈

聯盟矩陣53