第51讲 使用Perfetto来分析LMK问题

本讲是Android Camera性能分析专题的第51讲,我们介绍Perfetto内存分析之使用Perfetto来分析LMK问题。

更多资源:

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

Android系统中的lmkd

lmkd是low memory killer daemon的缩写

当Android设备处于low memory状态时,lmkd daemon进程会去kill掉一些低优先级进程以释放更多的内存出来。

通常是根据oom_score_adj来判断先kill哪些进程

比如:在Android系统中,当用户切换到其他应用时,原来的应用并不会被立即关闭。相反,这些应用会被缓存,即使用户已经停止使用它们。这种机制的目的是为了加快应用的再次启动速度。然而,这些缓存的应用通常会首先被lmk kill,因为它们的oom_score_adj值较高,这意味着它们在内存管理中优先级较低,当系统需要释放内存时lmk会优先kill它们。

Android系统中的lmkd

Perfetto 配置抓取lmk信息

在Perfetto配置文件中加入如下信息

通过上面的配置,我们从Perfetto中能看到某个进程adj的变化,以及lmk的kill动作

data_sources: {
    config {
        name: "linux.ftrace"
        ftrace_config {
            # For old in-kernel events. Google已经废弃kernel
            ftrace_events: "lowmemorykiller/lowmemory_kill"
            # For new userspace lmkds.
            atrace_apps: "lmkd"
            # This is not strictly required but is useful to know the state
            # of the process (FG, cached, ...) before it got killed.
            ftrace_events: "oom/oom_score_adj_update"
        }
    }
}

驱动中,Proc会打印进程adj的值变化

Perfetto UI分析lmk

从lmkd进程中的trace可以看出

  • kill_one_process 能看出kill哪个PID,具体代码位置

  • oom_score_adj 能看出该进程的oom_score_adj变化

Perfetto UI分析lmk

Perfetto SQL分析lmk

通过下面的SQL语句查询被lmk kill掉的进程有哪些

SELECT ts, process.name, process.pid 
FROM instant 
JOIN process_track ON instant.track_id = process_track.id
JOIN process USING (upid)
WHERE instant.name = 'mem.lmk'

输出

Perfetto SQL分析lmk

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Android Camera性能分析