原文:https://source.android.com/devices/tech/perf/lmkd
本文描述了Android 9中添加的用户空间lowmemorykiller守护程序(lmkd)功能以及如何配置它们。
以前,Android使用内核lowmemorykiller驱动程序终止不必要的进程来缓解内存压力。这种机制死板且依赖于硬编码值,而且从内核4.12开始,lowmemorykiller驱动程序被排除在上游内核之外。
用户空间lmkd
进程实现同样的功能,用已有的内核机制来检测和估计内存压力。它使用内核生成的vmpressure事件来获取有关内存压力级别的通知。它还可以使用内存cgroup功能根据其重要性限制分配给每个进程的内存资源。
如何切换到用户空间lmkd
从Android 9开始,如果未检测到内核中的lowmemorykiller驱动程序,则用户空间lmkd
会激活。注:用户空间lmkd
需要内核支持内存cgroup。因此,要切换到用户空间 lmkd
,应配置以下设置编译内核:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
lmkd终止策略
lmkd
同时支持新的和传统模式的终止策略,新的终止策略基于vmpressure事件,进程的重要性以及交换利用率等其他提示;传统模式的lmkd
终止策略就像内核lowmemorykiller 驱动程序那样做出终止决定。
新的终止策略因低内存和高性能设备而异。在低内存设备的情况下,系统应该比正常操作模式承受更高的内存压力; 在高性能设备上,内存压力应被视为异常情况,在影响整体性能之前应予以修复。ro.config.low_ram
属性允许选择一种模式而非另一种。有关设置此属性的说明,请参阅低RAM配置。
在传统模式下,lmkd
根据可用内存和文件缓存阈值进行终止决策。通过将ro.lmk.use_minfree_levels
属性设置为true
来启用此模式。
为特定设备配置lmkd
配置lmkd
以下属性:
属性 | 使用 | 默认值 |
---|---|---|
ro.config.low_ram |
在低内存和高性能设备之间进行选择。 | false |
ro.lmk.use_minfree_levels |
使用空闲内存和文件缓存阈值来决定何时终止。此模式与内核lowmemorykiller驱动程序的工作方式相同。 | false |
ro.lmk.low |
在低压力水平下有资格杀死的进程的最小oom_adj得分。 |
1001 (禁用) |
ro.lmk.medium |
适合在中等压力水平下杀死的进程的最小oom_adj分数。 |
800 (缓存或非必要服务) |
ro.lmk.critical |
有资格在关键压力水平下被杀死的进程的最小oom_adj分数。 |
0 (任何过程) |
ro.lmk.critical_upgrade |
可以升级到关键级别。 | false |
ro.lmk.upgrade_pressure |
由于系统交换太多,将升级哪个级别的最大mem_pressure。 |
100 (禁用) |
ro.lmk.downgrade_pressure |
vmpressure事件将被忽略的最小mem_pressure *,因为仍有足够的可用内存。 |
100 (禁用) |
ro.lmk.kill_heaviest_task |
终止最重要的合格任务(最佳决策)与任何符合条件的任务(快速决策)。 | true |
ro.lmk.kill_timeout_ms |
终止后的持续时间(毫秒),不会进行额外的终止。 |
0 (禁用) |
ro.lmk.debug |
启用lmkd 调试日志。 |
false |
注: mem_pressure = RAM使用率/ RAM_and_swap使用率%
以下是一个设备配置示例:
PRODUCT_PROPERTY_OVERRIDES += \
ro.lmk.low=1001 \
ro.lmk.medium=800 \
ro.lmk.critical=0 \
ro.lmk.critical_upgrade=false \
ro.lmk.upgrade_pressure=100 \
ro.lmk.downgrade_pressure=100 \
ro.lmk.kill_heaviest_task=true
网友评论
ro.lmk.upgrade_pressure=100 \
ro.lmk.downgrade_pressure=100 \
我看到驱动vmpressure.c中对压力位默认有三档,其中中间档位和最高档位为如下值,是不是上层LMKD就不需要再去修改ro.lmk.upgrade_pressure和ro.lmk.downgrade_pressure了呢? 只是比较疑惑。
static const unsigned int vmpressure_level_med = 60;
static const unsigned int vmpressure_level_critical = 95;