You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
4.4 KiB
101 lines
4.4 KiB
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.
|