From: "Vlastimil Babka (SUSE)" <vbabka@kernel.org>
To: "JP Kobryn (Meta)" <jp.kobryn@linux.dev>,
akpm@linux-foundation.org, surenb@google.com, mhocko@suse.com,
jackmanb@google.com, hannes@cmpxchg.org, ziy@nvidia.com,
linux-mm@kvack.org
Cc: linux-kernel@vger.kernel.org, kernel-team@meta.com
Subject: Re: [PATCH] mm/compaction: cap compact_gap() at COMPACT_CLUSTER_MAX
Date: Mon, 25 May 2026 12:02:57 +0200 [thread overview]
Message-ID: <b4e49d71-bcd6-4c6c-87cb-2dbd75b3c2bb@kernel.org> (raw)
In-Reply-To: <20260519200851.141955-1-jp.kobryn@linux.dev>
On 5/19/26 22:08, JP Kobryn (Meta) wrote:
> compact_gap() returns 2 << order, which is used as watermark headroom in
> __compaction_suitable() and as a reclaim target in kswapd. The computed
> value scales exponentially by order. For order-9 THP allocations this
> evaluates to 1024 pages, but the compaction free scanner's working set is
> bounded by COMPACT_CLUSTER_MAX (32 pages). The scanner stops isolating free
> pages once it matches the migration batch. The current gap over-reserves by
> 32x.
>
> On fragmented production hosts, kswapd will try and reclaim up to the gap,
> but it only reaches that threshold 18% of the time, causing reclaim to
> continue a majority of the time.
But doesn't that mean there's genuine memory pressure? We're effectively
raising the high watermark by 4 MB, but if processes are continuously
allocating, we'd be reclaiming without the gap as well? Unless the workload
is sized to fit without the gap.
> The over-sized gap also causes 46% of
> order-9 compaction suitability checks to fail unnecessarily - the zone has
> sufficient free pages for the scanner to operate, but not enough to clear
> the inflated threshold.
>
> Cap compact_gap() at COMPACT_CLUSTER_MAX to align the watermark headroom
> with the scanner's actual capacity. Orders 0-4 are unaffected since their
> gap is <= 32.
>
> A/B test on ~100 instagram production hosts (64GB, 60s measurement):
What was the base kernel version?
> Unpatched (43 hosts)
> pgscan_kswapd (mean/host): ~1.6M
> reclaim efficiency (steal/scan): 83.8%
> compaction success (success/stall): 2.1%
> THP success (alloc/alloc+fallback): 4.9%
> forced lru_add_drain (mean/host): ~107K
>
> Patched (59 hosts)
> pgscan_kswapd (mean/host): ~449K
Did the extra reclaim just disappear because we allow the allocations to use
4MB more memory? Or it shifted to direct reclaim?
> reclaim efficiency (steal/scan): 91.0%
> compaction success (success/stall): 28.3%
Is this compaction success per compaction stall or per alloc stall?
> THP success (alloc/alloc+fallback): 17.2%
Weird that things would improve that much. I would expect the free memory
just to stabilize around the lower gap but then behave similarly. Are we
missing something here?
> forced lru_add_drain (mean/host): ~64K
>
> Signed-off-by: JP Kobryn (Meta) <jp.kobryn@linux.dev>
> ---
> include/linux/compaction.h | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/include/linux/compaction.h b/include/linux/compaction.h
> index 173d9c07a8952..09aea63b8a89d 100644
> --- a/include/linux/compaction.h
> +++ b/include/linux/compaction.h
> @@ -2,6 +2,8 @@
> #ifndef _LINUX_COMPACTION_H
> #define _LINUX_COMPACTION_H
>
> +#include <linux/swap.h>
> +
> /*
> * Determines how hard direct compaction should try to succeed.
> * Lower value means higher priority, analogically to reclaim priority.
> @@ -73,11 +75,9 @@ static inline unsigned long compact_gap(unsigned int order)
> * effectively limited by COMPACT_CLUSTER_MAX, as that's the maximum
> * that the migrate scanner can have isolated on migrate list, and free
> * scanner is only invoked when the number of isolated free pages is
> - * lower than that. But it's not worth to complicate the formula here
> - * as a bigger gap for higher orders than strictly necessary can also
> - * improve chances of compaction success.
> + * lower than that.
> */
> - return 2UL << order;
> + return min(2UL << order, COMPACT_CLUSTER_MAX);
Shouldn't it at least be 2x COMPACT_CLUSTER_MAX?
> }
>
> static inline int current_is_kcompactd(void)
next prev parent reply other threads:[~2026-05-25 10:03 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-19 20:08 [PATCH] mm/compaction: cap compact_gap() at COMPACT_CLUSTER_MAX JP Kobryn (Meta)
2026-05-25 10:02 ` Vlastimil Babka (SUSE) [this message]
2026-05-27 0:10 ` JP Kobryn
2026-05-28 8:51 ` Vlastimil Babka (SUSE)
2026-06-02 1:48 ` JP Kobryn
2026-06-02 8:40 ` Vlastimil Babka (SUSE)
2026-06-03 7:15 ` JP Kobryn
2026-06-03 8:19 ` Vlastimil Babka (SUSE)
2026-06-03 8:20 ` Vlastimil Babka (SUSE)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b4e49d71-bcd6-4c6c-87cb-2dbd75b3c2bb@kernel.org \
--to=vbabka@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=jackmanb@google.com \
--cc=jp.kobryn@linux.dev \
--cc=kernel-team@meta.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mhocko@suse.com \
--cc=surenb@google.com \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.