内存管理-51-lmkd-1-笔记
一、简介
lmkd(LowMemoryKiller Daemon)是一个由 init 进程 fork 出来的守护进程,用于当安卓系统内存不足的时候,挑选合适的进程杀死,以保证系统的稳定流畅性。实现文件:
/android/system/memory/lmkd/lmkd.cpp //实现 /android/system/memory/lmkd/tests/lmkd_test.cpp //测试
lmkd 监听 kernel 的 /proc/pressure/memory 节点,当内存有压力的时候,lmkd 将收到消息并根据策略杀死进程。
# cat /proc/pressure/memory some avg10=2.79 avg60=0.67 avg300=0.18 total=5545238 full avg10=0.22 avg60=0.08 avg300=0.02 total=1826480
avg10、avg60、avg300 分别表示10s、60s、300s 期间因内存阻塞的百分比,some 表示至少有一个任务因内存而阻塞的时间占比,full 表示所有任务都因内存而阻塞的时间占比。
lmkd低压力默认值(some):70ms / 1000ms(7%)
lmkd中压力默认值(some):100ms / 1000ms(10%)
lmkd高压力默认值(full):70ms / 1000ms(7%)
该新机制的名称叫PSI,Android10及更高版本支持,相比旧机制的优势有:误杀、内存碎片。
当 lmkd 收到 kernel 的内存有压力的消息时,由下面的公式来确定是否要杀进程:
/* * /system/core/lmkd/lmkd.c * * lowmem_minfree: [72MB,90MB,108MB,126MB,216MB,315MB] * lowmem_adj: [0, 100, 200, 250, 900, 950] * other_free = proc/meminfo.MemFree - proc/zoneinfo.reserve * other_file = proc/meminfo.Cached + proc/meminfo.Buffers - proc/meminfo.Shmem */ for (i = 0; i < lowmem_adj.size(); i++) { minfree = lowmem_minfree[i]; if (other_free < minfree && other_file < minfree) { min_score_adj = lowmem_adj[i]; goto do_kill; } }
说明:
(1) lowmem_minfree、lowmem_adj 数值,由 AMS(ProcessList.mOomMinFreeHigh)提供。
(2) proc/zoneinfo.reserve 是内存回收(kswapd)阈值,由 AMS(/proc/sys/vm/extra_free_kbytes)提供。
(3) proc/meminfo.Cached 借助文件系统访问,/proc/meminfo.Buffers 块设备直接访问,本质是硬盘上的文件。
(4) proc/meminfo.Shmem 是共享内存,因为基于 tmpfs 实现,被统计到 /proc/meminfo.Cached 中,需要排除。
posted on 2023-11-18 16:06 Hello-World3 阅读(4) 评论(0) 收藏 举报
浙公网安备 33010602011771号