第47讲 Perfetto 内存分析之Memory Counters和Events

2024年10月31日 第47讲 Perfetto 内存分析之Memory Counters和Events 极客笔记

本讲是Android Camera性能分析专题的第47讲,我们介绍Perfetto内存分析之Memory相关的Counters和Events。

更多资源:

资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera
星球ID: 17296815
Wechat 极客笔记圈

Perfetto Memory Counters 和 Events

Perfetto可以在Android系统上通过ftrace和/proc节点收集大量与内存相关的事件(Events)和计数器(Counters)

Counters(定时Poll /proc节点)

  • 进程相关的内存计数器

  • 系统相关的内存计数器

Events(ftrace)

  • rss_stat

  • mm_event

  • ion/dmabuf

  • lmk

Perfetto 进程相关的内存计数器

定期去/proc/<pid>/status/proc/<pid>/oom_score_adj 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 '%cameraserver%'

运行结果

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"
        }
    }
}

UI

本文链接:http://so.lmcjl.com/news/16689/

展开阅读全文