Re: [PATCH 3/4] memcg: punt high overage reclaim to return-to-userland path
From: Tejun Heo <hidden>
Date: 2015-08-28 16:48:22
Also in:
linux-mm
Hello, Vladimir. On Fri, Aug 28, 2015 at 07:36:11PM +0300, Vladimir Davydov wrote:
quoted
* try_charge() can be invoked from any in-kernel allocation site and reclaim path may use considerable amount of stack. This can lead to stack overflows which are extremely difficult to reproduce.IMO this paragraph does not justify this patch at all, because one will still invoke direct reclaim from try_charge() on hitting the hard limit.
Ah... right, and we can't defer direct reclaim for hard limit.
quoted
* If the allocation doesn't have __GFP_WAIT, direct reclaim is skipped. If a process performs only speculative allocations, it can blow way past the high limit. This is actually easily reproducible by simply doing "find /". VFS tries speculative !__GFP_WAIT allocations first, so as long as there's memory which can be consumed without blocking, it can keep allocating memory regardless of the high limit.I think there shouldn't normally occur a lot of !__GFP_WAIT allocations in a row - they should still alternate with normal __GFP_WAIT allocations. Yes, that means we can breach memory.high threshold for a short period of time, but it isn't a hard limit, so it looks perfectly fine to me. I tried to run `find /` over ext4 in a cgroup with memory.high set to 32M and kmem accounting enabled. With such a setup memory.current never got higher than 33152K, which is only 384K greater than the memory.high. Which FS did you use?
ext4. Here, it goes onto happily consuming hundreds of megabytes with limit set at 32M. We have quite a few places where !__GFP_WAIT allocations are performed speculatively in hot paths with fallback slow paths, so this is bound to happen somewhere. Thanks. -- tejun