用户空间的LMKD

原文: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

推荐阅读更多精彩内容