本讲是android camera性能分析专题的第47讲,我们介绍perfetto内存分析之memory相关的counters和events。
更多资源:
资源 | 描述 |
---|---|
在线课程 | |
知识星球 | 星球名称:深入浅出android camera 星球id: 17296815 |
极客笔记圈 |
perfetto memory counters 和 events
perfetto可以在android系统上通过ftrace和/proc节点收集大量与内存相关的事件(events)和计数器(counters)
counters(定时poll /proc节点)
- 进程相关的内存计数器
-
系统相关的内存计数器
events(ftrace)
- rss_stat
-
mm_event
-
ion/dmabuf
-
lmk
perfetto 进程相关的内存计数器
定期去/proc/
和/proc/
poll数据
traceconfig
- proc_stats_poll_ms 需要>100
ui
参数 | /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值 |
sql查询语句
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 '�meraserver%'
运行结果
perfetto 系统相关的内存计数器
定期去/proc/vmstat
和/proc/meminfo
poll数据
节点 | 说明 |
---|---|
/proc/meminfo | 系统全局的内存使用状况 |
/proc/vmstat | 虚拟内存统计,有关交换、回收、压缩和页缓存(page cache)效率的统计信息 |
traceconfig
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
}
}
}
ui
sql查询语句
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%'
运行结果
perfetto 内存事件
rss_stat ftrace(>=linux v5.5-rc1)
- 与/proc/pid/status里面的vmrss一样,统计某个进程的rss使用情况,差异点在于rss_stat是主动记录rss的变化,因此它能抓住非常短时间内的rss抖动
mm_event ftrace
- 与/proc/vmstat一样,统计虚拟内存的使用情况,差异点是mm_event是主动上报,因mm_event数据量非常大,因此这里只统计直方图数据
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事件的持续时间) |
traceconfig
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "kmem/rss_stat"
ftrace_events: "mm_event/mm_event_record"
}
}
}
ui
perfetto 统计ion/dmabuf使用情况
traceconfig
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"
}
}
}
ui
系统行为:
单独进程:
perfetto 统计lmk发生情况
traceconfig
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "lowmemorykiller/lowmemory_kill"
ftrace_events: "oom/oom_score_adj_update"
atrace_apps: "lmkd"
}
}
}