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,刷进去,重启就生效了。

小技巧:如果你不想重新刷机,也可以用Magisk或者KernelSU的模块机制,在post-fs-data阶段执行写入命令。这样既不用动系统分区,又能持久化。

方法二:使用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 验证持久化是否成功

改完之后,别急着高兴。一定要重启验证一下。我个人的习惯是:

  1. 重启设备
  2. 等系统完全启动
  3. 执行cat /sys/module/lowmemorykiller/parameters/minfree
  4. 对比你设置的值

如果发现值没变,别慌。先检查一下你的脚本有没有执行权限,或者路径对不对。我曾经有一次把路径写成了/sys/module/lowmemorykiller/parameters/minfree,结果少了个s(写成minfree),折腾了半天才发现。

3.5 实战建议与避坑指南

最后,给你几个我踩坑踩出来的建议:

  • 不要盲目照搬别人的阈值。不同设备的内存大小、使用场景都不一样。4GB内存的设备和8GB的设备,阈值能一样吗?
  • 先做临时修改,测试稳定了再持久化。我见过有人直接改init.rc,结果阈值设得太激进,系统频繁杀前台应用,最后只能重刷系统。
  • 注意内核版本差异。Android 11之后,很多设备开始使用LMKD用户空间守护进程,minfree文件可能不再生效。这时候你需要改的是/sys/fs/cgroup/memory/下的参数,或者直接修改LMKD的配置文件。
核心要点:临时修改用echo写文件,持久化改init.rc或写init脚本。改之前先备份,改完之后重启验证。别嫌麻烦,这一步省了,后面出问题更麻烦。

好了,这一节的内容就到这儿。下一节我会讲怎么根据实际使用场景来调整这些阈值,比如游戏场景、多任务场景,分别该怎么配。到时候咱们再细聊。