内存管理-51-lmkd-2-文档翻译与理论


一、lmkd/README.md

注: 基于A12,翻译自 /android/system/memory/lmkd/README.md


Android 低内存杀手守护进程

=================================

简介
------------

Android 低内存杀手守护进程 (lmkd) 是一个监控运行中的 Android 系统内存状态的进程,它会在内存压力过高时通过终止一些非必要进程来维持系统性能在可接受的范围内。

背景
----------

在 Android 系统中,内存监控和终止非必要进程的任务通常由内核的 lowmemorykiller 驱动程序负责。

自 Linux 内核 4.12 版本起,lowmemorykiller 驱动程序已被移除,取而代之的是用户空间的 lmkd 守护进程来执行这些任务。

Android 属性
------------------

可以使用以下 Android 属性在特定系统上配置 lmkd:

ro.config.low_ram:选择低内存或高性能设备。默认值 = false。

ro.lmk.use_minfree_levels:使用空闲内存和文件缓存阈值来决定何时终止进程。此模式的工作方式与内核 lowmemorykiller 驱动程序的工作方式相同。默认值 = false。实际工程配为true.

ro.lmk.low:低 vmpressure 级别下可终止进程的最小 oom_adj 分数。默认值 = 1001(禁用)。实际工程配为空

ro.lmk.medium:中等 vmpressure 级别下可终止进程的最小 oom_adj 分数。默认值 = 800(非必要进程)。实际工程配为空

ro.lmk.critical:临界 vmpressure 级别下可终止进程的最小 oom_adj 分数。默认值 = 0(所有进程)。

ro.lmk.critical_upgrade:启用升级到关键级别。默认值 = false

ro.lmk.upgrade_pressure:最大内存压力,超过此值系统交换过多时将升级到更高级别。默认值 = 100(禁用)

ro.lmk.downgrade_pressure:最小内存压力,超过此值系统仍有足够的可用内存时将忽略 vmpressure 事件。默认值 = 100(禁用)

ro.lmk.kill_heaviest_task:终止最耗资源的符合条件的任务(最佳决策)还是终止任何符合条件的任务(快速决策)。默认值 = false. 实际工程配为true.

ro.lmk.kill_timeout_ms:终止任务后不再执行其他终止操作的超时时间(毫秒)。默认值 = 0(禁用)。实际工程配为15.

ro.lmk.debug:启用 lmkd 调试日志,默认值 = false

ro.lmk.swap_free_low_percentage:可用交换空间占总交换空间的百分比,用作判断系统是否交换空间不足的阈值。低内存设备默认值为 10,高端设备默认值为 20。

ro.lmk.thrashing_limit:工作集故障次数占文件级页面缓存大小的百分比,用作判断系统是否频繁抖动页面缓存的阈值。低内存设备默认值为 30,高端设备默认值为 100

ro.lmk.thrashing_limit_decay:抖动阈值衰减,以原始阈值的百分比表示,用于在系统即使在进程被终止后仍无法恢复时降低阈值。低内存设备的默认值为 50,高端设备的默认值为 10。

ro.lmk.psi_partial_stall_ms:触发低内存通知的部分 PSI 停顿阈值(以毫秒为单位)。低内存设备的默认值为 200,高端设备的默认值为 70。

ro.lmk.psi_complete_stall_ms:触发严重内存通知的完整 PSI 停顿阈值(以毫秒为单位)。默认值为 700。

lmkd 将根据当前系统配置设置以下 Android 属性:

sys.lmk.minfree_levels:minfree:oom_adj_score 对,以逗号分隔。工程实际配置:

# getprop sys.lmk.minfree_levels
55296:0,69120:100,82944:200,96768:250,165888:900,241920:950

sys.lmk.reportkills:是否支持向客户端报告进程终止情况。测试应用在测试低内存强制终止通知之前应检查此属性。默认情况下,此属性未设置。实际工程默认是1.

 

二、lmkd杀进程日志

在 main log 中:

406 406 I lowmemorykiller: Kill 'com.android.speech' (20208), uid 10064, oom_score_adj 905 to free 126400kB rss, 21724kB swap; reason: low watermark is breached and swap is low (684560kB < 698356kB)

oom_score_adj: 是进程的 OOM 调整分值,范围通常 [-1000, 1000],数值越大,越"容易被杀",905 已经是很容易被回收的等级(典型后台/缓存类)。

rss: 预期释放该进程占用的内存:rss=126400kB:常驻物理内存。

swap: swap=21724kB:该进程已换出到 swap/zram 的内存。

reason: low watermark is breached 跌破低水位/最小水位(min),说明系统可回收余量不够,进入高压状态。

swap is low: 剩余可用 swap 容量低。(684560kB < 698356kB) 表示当前剩余 swap:684560kB,lmkd 判定"swap 低"的阈值:698356kB, 因为当前值小于阈值,所以触发了 swap is low 条件。

换句话说,这次 kill 的判定是"双条件成立":(1) 内存水位线告急; (2) swap 余量也低于安全阈值;

 

posted on 2025-11-17 11:32  Hello-World3  阅读(126)  评论(0)    收藏  举报

导航