Hi Tim. Do you have a link to the new version lmkd?
On 03/18/2017 12:16 AM, Tim Murray wrote:
> Hi all,
> I've been working to improve Android's memory management and drop
> lowmemorykiller from the kernel, and I'd like to get some feedback on a small
> patch with a lot of side effects.
> Currently, when an Android device is under memory pressure, one of three
> things will happen from kswapd:
> 1. Compress an anonymous page to ZRAM.
> 2. Evict a file page.
> 3. Kill a process via lowmemorykiller.
> The first two are cheap and per-page, the third is relatively cheap in the
> short term, frees many pages, and may cause power and performance penalties
> later on when the process has to be started again. For lots of reasons, I'd
> like a better balance between reclamation and killing on Android.
> One of the nice things about Android from an optimization POV is that the
> execution model is more constrained than a generic Linux machine. There are
> only a limited number of processes that need to execute quickly for the
> device to appear to have good performance, and a userspace daemon (called
> ActivityManagerService) knows exactly what those processes are at any given
> time. We've made use of that in the past via cpusets and schedtune to limit
> the CPU resources available to background processes, and I think we can apply
> the same concept to memory.
> This patch adds a new tunable to mem cgroups, memory.priority. A mem cgroup
> with a non-zero priority will not be eligible for scanning until the
> scan_control's priority is greater than zero. Once the mem cgroup is eligible
> for scanning, the priority acts as a bias to reduce the number of pages that
> should be scanned.
> We've seen cases on Android where the global LRU isn't sufficient. For
> example, notifications in Android are rendered as part of a separate process
> that runs infrequently. However, when a notification appears and the user
> slides down the notification tray, we'll often see dropped frames due to page
> faults if there has been severe memory pressure. There are similar issues
> with other persistent processes.
> The goal on an Android device is to aggressively evict from very low-priority
> background tasks that are likely to be killed anyway, since this will reduce
> the likelihood of lowmemorykiller running in the first place. It will still
> evict some from foreground and persistent processes, but it should help
> ensure that background processes are effectively reduced to the size of their
> heaps before evicting from more critical tasks. This should mean fewer
> background processes end up killed, which should improve performance and
> power on Android across the board (since it costs significantly less to page
> things back in than to replay the entirety of application startup).
> The follow-on that I'm also experimenting with is how to improve vmpressure
> such that userspace can have some idea when low-priority memory cgroups are
> about as small as they can get. The correct time for Android to kill a
> background process under memory pressure is when there is evidence that a
> process has to be killed in order to alleviate memory pressure. If the device
> is below the low memory watermark and we know that there's probably no way to
> reclaim any more from background processes, then a userspace daemon should
> kill one or more background processes to fix that. Per-cgroup priority could
> be the first step toward that information.
> I've tested a version of this patch on a Pixel running 3.18 along with an
> overhauled version of lmkd (the Android userspace lowmemorykiller daemon),
> and it does seem to work fine. I've ported it forward but have not yet
> rigorously tested it at TOT, since I don't have an Android test setup running
> TOT. While I'm getting my tests ported over, I would like some feedback on
> adding another tunable as well as what the tunable's interface should be--I
> really don't like the 0-10 priority scheme I have in the patch but I don't
> have a better idea.
> Tim Murray (1):
> mm, memcg: add prioritized reclaim
> include/linux/memcontrol.h | 20 +++++++++++++++++++-
> mm/memcontrol.c | 33 +++++++++++++++++++++++++++++++++
> mm/vmscan.c | 3 ++-
> 3 files changed, 54 insertions(+), 2 deletions(-)