用户空间 lmkd
用户空间 lmkd
- 1、概览
- 1.1 配置lmkd
- 2、lmkd
- 2.1 lmkd启动
- 2.2 时序图
Android LowMemoryKiller原理分析
AOSP>文档>核心主题低内>存终止守护程序
1、概览
Android Low Memory Killer Daemon :system/memory/lmkd/README.md
Android 低内存终止守护程序 (lmkd) 进程可监控运行中的 Android 系统的内存状态,并通过终止最不必要的进程来应对内存压力大的问题,使系统以可接受的性能水平运行。
AOSP>文档>核心主题低内>存终止守护程序
1.1 配置lmkd
属性 | 使用 | 默认 |
---|---|---|
ro.config.low_ram | 指定设备是低内存设备还是高性能设备 | false |
ro.lmk.use_new_strategy | 当低内存设备(ro.config.low_ram )或无低内存阈值(ro.lmk.use_minfree_levels )策略时,使用基于zone watermarks, free swap and thrashing stats 的新策略 | |
ro.lmk.use_psi | 使用 PSI 监视器(而不是 vmpressure 事件) | true |
ro.lmk.low | 在低 vmpressure 水平下可被终止的进程的最低 oom_adj 得分 | 1001 |
ro.lmk.medium | 在中等 vmpressure 水平下可被终止的进程的最低 oom_adj 得分 | 800 |
ro.lmk.critical | 在临界 vmpressure 水平下可被终止的进程的最低 oom_adj 得分 | 0 |
ro.lmk.debug | 启用 lmkd 调试日志 | false |
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.use_minfree_levels | 使用可用内存和文件缓存阈值来做出进程终止决策 (即与内核中的 LMK 驱动程序的功能一致) | false |
ro.lmk.swap_free_low_percentage | 可用交换水平,以占总交换空间的百分比表示。“lmkd” 使用该值作为阈值来判断何时将系统视为交换空间不足。如果“lmkd” 因交换空间过多而终止,请降低该百分比。如果“lmkd” 终止得太晚,从而导致 OOM 终止,请提高该百分比。 | 10 |
ro.lmk.psi_partial_stall_ms | 部分 PSI 失速阈值(以毫秒为单位),用于触发内存不足通知。如果设备收到内存压力通知的时间太晚,可以降低此值以在较早的时间触发通知。如果在不必要的情况下触发了内存压力通知,请提高此值以降低设备对噪声的敏感度。 | 70(ro.config.low_ram 默认false) |
ro.lmk.psi_complete_stall_ms | 完全 PSI 失速阈值(以毫秒为单位),用于触发关键内存通知。如果设备收到关键内存压力通知的时间太晚,可以降低该值以在较早的时间触发通知。如果在不必要的情况下触发了关键内存压力通知,可以提高该值以降低设备对噪声的敏感度。 | 700 |
ro.lmk.thrashing_limit | 工作集 refault 数量的上限,以占具有文件支持的页面缓存总大小的百分比表示。如果工作集 refault 的数量超过该值,则视为系统对其页面缓存造成抖动。如果设备性能在内存压力期间受到影响,请降低该值以限制抖动。如果因抖动原因而导致设备性能不必要地降低,请提高该值以允许更多抖动。 | 100(ro.config.low_ram 默认false) |
ro.lmk.thrashing_limit_decay | 抖动阈值衰减,以占在系统无法恢复时(甚至是终止后)用于降低阈值的原始阈值的百分比表示。如果持续抖动导致不必要的终止,请降低该值。如果终止后对持续抖动的响应速度过慢,请提高该值。 | 10(ro.config.low_ram 默认false) |
ro.lmk.thrashing_limit_critical | GET_LMK_PROPERTY(int32, "thrashing_limit_critical", thrashing_limit_pct * 2) | 100*2 |
ro.lmk.swap_util_max | 最大交换内存量,以占可交换内存总量的百分比表示。如果交换的内存量超过此上限,则表示系统在交换了其大部分可交换内存后仍然存在压力。 当内存压力是由不可交换内存的分配导致时,就可能会发生这种情况,原因在于大部分可交换内存已经交换,所以无法通过交换来缓解这一压力。默认值为 100,这实际上会停用此检查。如果设备的性能在交换利用率较高且可用交换水平未降至 ro.lmk.swap_free_low_percentage 的内存压力期间受到影响,请降低该值以限制交换利用率。 | 100 |
ro.lmk.filecache_min_kb | 抖动后文件缓存太低,继续杀死后台进程。 | 0 |
ro.lmk.stall_limit_critical | PSI失速极限临界。如果系统停滞,允许杀死可感知的应用程序 | 100 |
2、lmkd
2.1 lmkd启动
lmkd是由init进程,通过解析init.rc文件来启动的lmkd守护进程,lmkd会创建名为lmkd的socket,节点位于/dev/socket/lmkd,该socket用于跟上层framework交互。
system/memory/lmkd/lmkd.rc
service lmkd /system/bin/lmkdclass coreuser lmkdgroup lmkd system readproccapabilities DAC_OVERRIDE KILL IPC_LOCK SYS_NICE SYS_RESOURCEcriticalsocket lmkd seqpacket+passcred 0660 system systemtask_profiles ServiceCapacityLowon property:lmkd.reinit=1exec_background /system/bin/lmkd --reinit# reinitialize lmkd after device finished booting if experiments set any flags during boot
on property:sys.boot_completed=1 && property:lmkd.reinit=0setprop lmkd.reinit 1# properties most likely to be used in experiments
# setting persist.device_config.* property either triggers immediate lmkd re-initialization
# if the device finished booting or sets lmkd.reinit=0 to re-initialize lmkd after boot completes
on property:persist.device_config.lmkd_native.debug=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.kill_heaviest_task=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.kill_timeout_ms=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.swap_free_low_percentage=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.psi_partial_stall_ms=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.psi_complete_stall_ms=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.thrashing_limit=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.thrashing_limit_decay=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.thrashing_limit_critical=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.swap_util_max=*setprop lmkd.reinit ${sys.boot_completed:-0}on property:persist.device_config.lmkd_native.filecache_min_kb=*setprop lmkd.reinit ${sys.boot_completed:-0}