美文网首页Android高阶
用户空间的LMKD

用户空间的LMKD

作者: ben3726 | 来源:发表于2018-08-28 11:02 被阅读209次

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

    相关文章

      网友评论

      • 楼主望月:你好,如下两个参数设置为100,这个是google原生的默认参数么?
        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;

      本文标题:用户空间的LMKD

      本文链接:https://www.haomeiwen.com/subject/xeqxwftx.html