| 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. |