Android P使能用户态LMK说明
先看官方介绍:
如何改用用户空间 lmkd
从 Android 9 开始,用户空间 lmkd 会在未检测到内核 lowmemorykiller 驱动程序时激活。请注意,用户空间 lmkd 要求内核支持内存 cgroup。因此,要改用用户空间 lmkd,您应使用以下配置设置编译内核:
>CONFIG_ANDROID_LOW_MEMORY_KILLER=n
>CONFIG_MEMCG=y
>CONFIG_MEMCG_SWAP=y
这里以高通平台为例说明,内核版本4.9,默认使能内核态,minfree调节真是呆板,直接使用AMS计算的,改用用户态,看样子内核态lmk逐渐不用了。
高通平台修改过lmkd,增加了一个属性:
has_inkernel_module = !access(INKERNEL_MINFREE_PATH, W_OK); |
所以高通平台下不用关心CONFIG_ANDROID_LOW_MEMORY_KILLER
,只要添加属性ro.lmk.enable_userspace_lmk
为true即可,策略一般选择杀死内存最大的,然后使能内核memcg:
CONFIG_MEMCG=y |
但是,竟然起不来,从log看出来是:
No kernel memory.pressure_level support |
代码在:
mpfd = open(MEMCG_SYSFS_PATH "memory.pressure_level", O_RDONLY | O_CLOEXEC); |
看样子路径找不到,想想8.0的添加记得是在kernel cmdline里添加如下配置:
androidboot.memcg=true |
ok,加入后果然成功了,有个属性:
[ro.boot.memcg]: [true] |
这个属性的代码在system/core/init/init.cpp:
// Set memcg property based on kernel cmdline argument |
找了半天没发现ro.boot.memcg
怎么根据androidboot.memcg
设置的,想了想应该是拼接的,如果给你实现你怎么做?具体设置是在:
static void import_kernel_nv(const std::string& key, const std::string& value, bool for_emulator) { |
这里设置了ro.boot.memcg
为true,来自init main里会解析kernel cmdline:
// If arguments are passed both on the command line and in DT, |
static void process_kernel_cmdline() { |
Done.
版权声明:本站所有文章均采用 CC BY-NC-SA 4.0 CN 许可协议。转载请注明原文链接!