2024年10月31日 第47讲 Perfetto 内存分析之Memory Counters和Events 极客笔记
本讲是Android Camera性能分析专题的第47讲,我们介绍Perfetto内存分析之Memory相关的Counters和Events。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
Perfetto可以在Android系统上通过ftrace和/proc节点收集大量与内存相关的事件(Events)和计数器(Counters)
Counters(定时Poll /proc节点)
系统相关的内存计数器
Events(ftrace)
mm_event
ion/dmabuf
lmk
定期去/proc/<pid>/status
和/proc/<pid>/oom_score_adj
Poll数据
参数 | /proc节点 | 说明 |
---|---|---|
mem.locked | VmLck | VmLck代表进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘 |
mem.rss | VmRSS | RSS值,这里的值是RssAnon、RssFile和RssShmem的和 |
mem.rss.anon | RssAnon | 匿名RSS内存大小 |
mem.rss.file | RssFile | 文件RSS内存大小 |
mem.rss.shmem | RssShmem | 共享内存RSS内存大小 |
mem.rss.watermark | VmHWM | Peak RSS(“high water mark”). |
mem.swap | VmSwap | 进程Swap内存大小 |
mem.virt | VmSize | 进程虚拟内存大小 |
oom_score_adj | oom_score_adj | 当前该进程的OOM Score ADJ值 |
SELECT c.ts, c.value, t.name as counter_name, p.name as proc_name, p.pid
FROM counter as c
LEFT JOIN process_counter_track as t ON c.track_id = t.id
LEFT JOIN process as p USING (upid)
WHERE t.name LIKE 'mem.%' AND proc_name LIKE '%cameraserver%'
定期去/proc/vmstat
和/proc/meminfo
Poll数据
节点 | 说明 |
---|---|
/proc/meminfo | 系统全局的内存使用状况 |
/proc/vmstat | 虚拟内存统计,有关交换、回收、压缩和页缓存(Page Cache)效率的统计信息 |
data_sources: {
config {
name: "linux.sys_stats"
sys_stats_config {
meminfo_period_ms: 1000
meminfo_counters: MEMINFO_MEM_TOTAL
meminfo_counters: MEMINFO_MEM_FREE
meminfo_counters: MEMINFO_MEM_AVAILABLE
vmstat_period_ms: 1000
vmstat_counters: VMSTAT_NR_FREE_PAGES
vmstat_counters: VMSTAT_NR_ALLOC_BATCH
vmstat_counters: VMSTAT_NR_INACTIVE_ANON
vmstat_counters: VMSTAT_NR_ACTIVE_ANON
}
}
}
SELECT c.ts, t.name, c.value / 1024 as value_kb
FROM counters as c
LEFT JOIN counter_track as t ON c.track_id = t.id
WHERE t.name like '%MemFree%'
rss_stat Ftrace(>=Linux v5.5-rc1)
mm_event Ftrace
mm_event事件与统计类型:
事件类型 | 描述 |
---|---|
mem.mm.min_flt | 小缺页中断(Minor Fault) Page Cache中已经缓存进程所需要的页面数据了,只要把该页面数据与进程的虚拟地址空间建立映射关系就可以了 |
mem.mm.maj_flt | 大缺页中断(Major Fault) 内存中没有缓存进程所需要的页面数据,内核必需要通知CPU从磁盘中把页面数据加载到内存中来。 |
mem.mm.swp_flt | 这个事件表示发生了交换空间(swap space)缺页中断。当系统内存不足时,操作系统会将一些不常用的页面移出物理内存,并将其存储到磁盘上的交换空间。当进程需要访问这些页面时,就会发生交换空间页面错误。 |
mem.mm.read_io | 表示进行了读取I/O操作。当进程需要从磁盘加载数据或执行文件时,会触发读取I/O操作。这个事件可以用于分析系统中读取操作的性能瓶颈和行为。 |
mem.mm.compaction | 表示内存碎片整理操作。当系统运行时,频繁的内存分配和释放可能导致内存碎片的产生。为了提高内存利用率,操作系统会定期进行内存碎片整理,将分散的小块内存合并成更大的连续块。 |
mem.mm.reclaim | 表示内存回收操作。当系统内存紧张时,操作系统会尝试回收不再使用的内存页面以供其他进程使用。内存回收可以通过释放未使用的缓存页面、交换页面等方式来实现。 |
事件统计类型 | 描述 |
---|---|
count | 从上一个记录事件开始,到记录当前事件,这段时间该时间发生了多少次。 |
min_lat | 从上一个记录事件开始,到记录当前事件,最小延迟(mm事件的持续时间) |
max_lat | 从上一个记录事件开始,到记录当前事件,最大延迟(mm事件的持续时间) |
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "kmem/rss_stat"
ftrace_events: "mm_event/mm_event_record"
}
}
}
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "ion/ion_stat"
ftrace_events: "dmabuf_heap/dma_heap_stat"
ftrace_events: "kmem/ion_heap_grow"
ftrace_events: "kmem/ion_heap_shrink"
}
}
}
系统行为:
单独进程:
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "lowmemorykiller/lowmemory_kill"
ftrace_events: "oom/oom_score_adj_update"
atrace_apps: "lmkd"
}
}
}
本文链接:http://so.lmcjl.com/news/16689/