Android Low Memory Killer Daemon ================================ Introduction ------------ Android Low Memory Killer Daemon (lmkd) is a process monitoring memory state of a running Android system and reacting to high memory pressure by killing the least essential process(es) to keep system performing at acceptable levels. Background ---------- Historically on Android systems memory monitoring and killing of non-essential processes was handled by a kernel lowmemorykiller driver. Since Linux Kernel 4.12 the lowmemorykiller driver has been removed and instead userspace lmkd daemon performs these tasks. Android Properties ------------------ lmkd can be configured on a particular system using the following Android properties: - `ro.config.low_ram`: choose between low-memory vs high-performance device. Default = false. - `ro.lmk.use_minfree_levels`: use free memory and file cache thresholds for making decisions when to kill. This mode works the same way kernel lowmemorykiller driver used to work. Default = false - `ro.lmk.low`: min oom_adj score for processes eligible to be killed at low vmpressure level. Default = 1001 (disabled) - `ro.lmk.medium`: min oom_adj score for processes eligible to be killed at medium vmpressure level. Default = 800 (non-essential processes) - `ro.lmk.critical`: min oom_adj score for processes eligible to be killed at critical vmpressure level. Default = 0 (all processes) - `ro.lmk.critical_upgrade`: enables upgrade to critical level. Default = false - `ro.lmk.upgrade_pressure`: max mem_pressure at which level will be upgraded because system is swapping too much. Default = 100 (disabled) - `ro.lmk.downgrade_pressure`: min mem_pressure at which vmpressure event will be ignored because enough free memory is still available. Default = 100 (disabled) - `ro.lmk.kill_heaviest_task`: kill heaviest eligible task (best decision) vs. any eligible task (fast decision). Default = false - `ro.lmk.kill_timeout_ms`: duration in ms after a kill when no additional kill will be done. Default = 0 (disabled) - `ro.lmk.debug`: enable lmkd debug logs, Default = false - `ro.lmk.swap_free_low_percentage`: level of free swap as a percentage of the total swap space used as a threshold to consider the system as swap space starved. Default for low-RAM devices = 10, for high-end devices = 20 - `ro.lmk.thrashing_limit`: number of workingset refaults as a percentage of the file-backed pagecache size used as a threshold to consider system thrashing its pagecache. Default for low-RAM devices = 30, for high-end devices = 100 - `ro.lmk.thrashing_limit_decay`: thrashing threshold decay expressed as a percentage of the original threshold used to lower the threshold when system does not recover even after a kill. Default for low-RAM devices = 50, for high-end devices = 10 - `ro.lmk.psi_partial_stall_ms`: partial PSI stall threshold in milliseconds for triggering low memory notification. Default for low-RAM devices = 200, for high-end devices = 70 - `ro.lmk.psi_complete_stall_ms`: complete PSI stall threshold in milliseconds for triggering critical memory notification. Default = 700 lmkd will set the following Android properties according to current system configurations: - `sys.lmk.minfree_levels`: minfree:oom_adj_score pairs, delimited by comma - `sys.lmk.reportkills`: whether or not it supports reporting process kills to clients. Test app should check this property before testing low memory kill notification. Default will be unset.