3、LMK阈值配置实战:查看当前阈值、修改/sys/module/lowmemorykiller/parameters/minfree、重启生效与持久化
好,咱们直接动手。前面讲了那么多理论,说实话,不实操一下总觉得心里没底。这一节我就带你走一遍完整的LMK阈值配置流程。从查看当前值,到临时修改,再到让它重启后还能生效——一步都不能少。
3.1 先看看当前阈值是多少
拿到一台设备,我第一件事就是先看看它现在的LMK参数。你猜怎么着?很多厂商出厂设置其实挺保守的。我记得有一次帮客户做低端机优化,发现它的minfree值设得特别低,结果后台稍微多开两个应用就开始杀进程,用户体验极差。
查看当前阈值,命令很简单:
adb shell
cat /sys/module/lowmemorykiller/parameters/minfree
你会看到一串数字,比如:
18432,23040,27648,32256,55296,80640
这六个数字分别对应六个内存等级。单位是页(page),在大多数Android设备上,一页等于4KB。所以换算成MB的话,就是除以256(因为1MB = 256页)。
我习惯用一个小脚本直接换算,省得每次手动算:
adb shell "cat /sys/module/lowmemorykiller/parameters/minfree | awk -F, '{for(i=1;i<=NF;i++) printf \"%dMB \", \$i/256; print \"\"}'"
输出结果类似:
72MB 90MB 108MB 126MB 216MB 315MB
嗯,这样一看就直观多了。72MB、90MB……一直到315MB。也就是说,当可用内存低于315MB时,系统就会开始杀最大级别的进程。
3.2 临时修改阈值——立竿见影
如果你想马上验证效果,可以直接往minfree文件里写值。注意,这个操作需要root权限。
adb root
adb shell "echo '12288,18432,24576,30720,46080,61440' > /sys/module/lowmemorykiller/parameters/minfree"
写完之后,你可以再cat一下确认是否生效:
adb shell cat /sys/module/lowmemorykiller/parameters/minfree
这里有个坑,我曾经踩过——有些内核版本对minfree的格式要求很严格,逗号后面不能有空格。你如果写成'12288, 18432, ...',它可能直接报错或者只读取了第一个值。所以,千万别加空格。
3.3 重启后还能生效吗?——持久化配置
好,问题来了。你辛辛苦苦调了一组阈值,结果手机一重启,全白干了。怎么办?
持久化的方法有好几种,我挑最常用的两种讲。
方法一:修改init.rc脚本
这是最正统的做法。在系统启动过程中,init进程会解析init.rc文件,我们可以把写minfree的命令加进去。
找到你的设备上的init.rc文件,通常在根目录下:
adb shell
ls /init.rc
然后把它pull出来,在合适的位置添加一行:
write /sys/module/lowmemorykiller/parameters/minfree 12288,18432,24576,30720,46080,61440
我一般把它放在on boot或者on late-init阶段。具体位置要看你的设备启动流程。改完之后,重新打包boot.img,刷进去,重启就生效了。
方法二:使用service或init脚本
有些设备不允许直接修改init.rc,那就可以写一个独立的init脚本。比如创建一个/etc/init/lmk.rc:
service lmk_setup /system/bin/sh -c "echo '12288,18432,24576,30720,46080,61440' > /sys/module/lowmemorykiller/parameters/minfree"
class core
user root
group root
oneshot
on boot
start lmk_setup
这样每次开机,系统就会自动执行这个脚本,把阈值写进去。
3.4 验证持久化是否成功
改完之后,别急着高兴。一定要重启验证一下。我个人的习惯是:
- 重启设备
- 等系统完全启动
- 执行
cat /sys/module/lowmemorykiller/parameters/minfree - 对比你设置的值
如果发现值没变,别慌。先检查一下你的脚本有没有执行权限,或者路径对不对。我曾经有一次把路径写成了/sys/module/lowmemorykiller/parameters/minfree,结果少了个s(写成minfree),折腾了半天才发现。
3.5 实战建议与避坑指南
最后,给你几个我踩坑踩出来的建议:
- 不要盲目照搬别人的阈值。不同设备的内存大小、使用场景都不一样。4GB内存的设备和8GB的设备,阈值能一样吗?
- 先做临时修改,测试稳定了再持久化。我见过有人直接改init.rc,结果阈值设得太激进,系统频繁杀前台应用,最后只能重刷系统。
- 注意内核版本差异。Android 11之后,很多设备开始使用LMKD用户空间守护进程,minfree文件可能不再生效。这时候你需要改的是
/sys/fs/cgroup/memory/下的参数,或者直接修改LMKD的配置文件。
好了,这一节的内容就到这儿。下一节我会讲怎么根据实际使用场景来调整这些阈值,比如游戏场景、多任务场景,分别该怎么配。到时候咱们再细聊。