本讲是Android Camera性能分析专题的第51讲,我们介绍Perfetto内存分析之使用Perfetto来分析LMK问题。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
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它们。
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 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'
输出