Thread (3 messages) 3 messages, 3 authors, 2015-08-07

Re: [PATCH] mm/slub: don't wait for high-order page allocation

From: Joonsoo Kim <hidden>
Date: 2015-08-07 01:40:00
Also in: lkml

On Tue, Aug 04, 2015 at 03:15:26PM +0200, Michal Hocko wrote:
On Fri 31-07-15 10:09:50, Joonsoo Kim wrote:
quoted
Almost description is copied from commit fb05e7a89f50
("net: don't wait for order-3 page allocation").

I saw excessive direct memory reclaim/compaction triggered by slub.
This causes performance issues and add latency. Slub uses high-order
allocation to reduce internal fragmentation and management overhead. But,
direct memory reclaim/compaction has high overhead and the benefit of
high-order allocation can't compensate the overhead of both work.

This patch makes auxiliary high-order allocation atomic. If there is
no memory pressure and memory isn't fragmented, the alloction will still
success, so we don't sacrifice high-order allocation's benefit here.
But you are also giving those allocations access to a portion of the
memory reserves which doesn't sound like an intenteded behavior here.
At least the changelog doesn't imply anything like that.

I am not oppposed to your patch but I think we should do something about
the !__GFP_WAIT behavior. This is too subtle and the mere fact the
caller doesn't want or cannot sleep doesn't make it a reserve consumer
automatically. We have __GFP_HIGH for that purpose. If this is not
desirable because of the regression risk then we might need a new gfp
flag for a best effort allocation which will fail in case we have to
dive into costly reclaim.
Hello, Michal.

We already have __GFP_NOMEMALLOC not to use emergency pool in case of
!__GFP_WAIT. Please see gfp_to_alloc_flags().
I'll send update version to use this flag.

BTW, network commit fb05e7a89f50 doesn't specify this flag. Does it
need this change, too?

Thanks.
quoted
If the atomic allocation fails, direct memory reclaim/compaction will not
be triggered, allocation fallback to low-order immediately, hence
the direct memory reclaim/compaction overhead is avoided. In the
allocation failure case, kswapd is waken up and trying to make high-order
freepages, so allocation could success next time.

Following is the test to measure effect of this patch.

System: QEMU, CPU 8, 512 MB
Mem: 25% memory is allocated at random position to make fragmentation.
 Memory-hogger occupies 150 MB memory.
Workload: hackbench -g 20 -l 1000

Average result by 10 runs (Base va Patched)

elapsed_time(s): 4.3468 vs 2.9838
compact_stall: 461.7 vs 73.6
pgmigrate_success: 28315.9 vs 7256.1

Signed-off-by: Joonsoo Kim <redacted>
---
 mm/slub.c | 2 ++
 1 file changed, 2 insertions(+)
diff --git a/mm/slub.c b/mm/slub.c
index 257283f..2d02a36 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1364,6 +1364,8 @@ static struct page *allocate_slab(struct kmem_cache *s, gfp_t flags, int node)
 	 * so we fall-back to the minimum order allocation.
 	 */
 	alloc_gfp = (flags | __GFP_NOWARN | __GFP_NORETRY) & ~__GFP_NOFAIL;
+	if ((alloc_gfp & __GFP_WAIT) && oo_order(oo) > oo_order(s->min))
+		alloc_gfp = alloc_gfp & ~__GFP_WAIT;
 
 	page = alloc_slab_page(s, alloc_gfp, node, oo);
 	if (unlikely(!page)) {
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/
-- 
Michal Hocko
SUSE Labs

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help