Skip to content

Increase success rates and reduce latency of compaction v3

Mel Gorman linux-mm lkml 1 version In review

Get series with b4
b4 am [email protected]

Versions newest first

  1. v1 Latest22 patches 11 repliesIn review

Changelog since v2 from the cover letter · 16 lines

o Fix static checker warnings (dan)
o Fix unused variable warnings (yue)
o Drop patch about PageReserved as there is some abuse of the flag outside
of the mm core. (vbabka)
o Drop patch using the bulk free helper as it may be vulnerable to races
with compaction and gup (vbabka)
o Drop patch about remote compaction. It's unnecessary at this time and
unclear what the semantics should even be (vbabka)
o Changelog fixes and clarifications (vbabka)
o Free list management and search
Confined mostly to "mm, compaction: Use free lists to quickly locate a migration source" which is arguably the most heavily modified patch
in this revision (vbabka, mel)
o Some minor churn, modifications, flow changes that fallout from
addressing the review feedback (mel)
o Minor pageblock skip changes, mostly fixing up which patch makes the
changes so the patches are incremental (mel)

Patches in v1 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/22mm, compaction: Shrink compact_controlmm/internal.h+2 -20 replies
2/22mm, compaction: Rearrange compact_controlmm/internal.h+3 -30 replies
3/22mm, compaction: Remove last_migrated_pfn from compact_controlmm/compaction.c mm/internal.h+9 -170 replies
4/22mm, compaction: Remove unnecessary zone parameter in some instancesmm/compaction.c+26 -280 replies
5/22mm, compaction: Rename map_pages to split_map_pagesmm/compaction.c+3 -30 replies
6/22mm, migrate: Immediately fail migration of a page with no migration handlermm/migrate.c+1 -10 replies
7/22mm, compaction: Always finish scanning of a full pageblockmm/compaction.c mm/internal.h+8 -120 replies
8/22mm, compaction: Ignore the fragmentation avoidance boost for isolation and compactionmm/page_alloc.c+1 -10 replies
9/22mm, compaction: Use free lists to quickly locate a migration sourcemm/compaction.c mm/internal.h+175 -35 replies
10/22mm, compaction: Keep migration source private to a single compaction instancemm/compaction.c+99 -250 replies
11/22mm, compaction: Use free lists to quickly locate a migration targetmm/compaction.c+213 -512 replies
12/22mm, compaction: Avoid rescanning the same pageblock multiple timesmm/compaction.c mm/internal.h+27 -60 replies
13/22mm, compaction: Finish pageblock scanning on contentionmm/compaction.c+34 -560 replies
14/22mm, compaction: Check early for huge pages encountered by the migration scannermm/compaction.c+12 -40 replies
15/22mm, compaction: Keep cached migration PFNs synced for unusable pageblocksmm/compaction.c+18 -00 replies
16/22mm, compaction: Rework compact_should_abort as compact_check_reschedmm/compaction.c+23 -380 replies
17/22mm, compaction: Do not consider a need to reschedule as contentionmm/compaction.c+4 -190 replies
18/22mm, compaction: Reduce premature advancement of the migration target scannermm/compaction.c+10 -170 replies
19/22mm, compaction: Round-robin the order while searching the free lists for a targetmm/compaction.c mm/internal.h+32 -40 replies
20/22mm, compaction: Sample pageblocks for free pagesmm/compaction.c+22 -61 reply
21/22mm, compaction: Be selective about what pageblocks to clear skip hintsinclude/linux/mmzone.h mm/compaction.c+109 -181 reply
22/22mm, compaction: Capture a page under direct compactioninclude/linux/compaction.h include/linux/sched.h kernel/sched/core.c +3 more+112 -122 replies

Reviews trailers per patch

All 22 patches have a Reviewed-by or Acked-by.

PatchVlastimil BabkaMel Gorman
1/22A-b
2/22A-b
3/22A-b
4/22A-b
5/22A-b
6/22A-b
7/22A-b
8/22A-b
9/22A-b
10/22A-b
11/22A-b A-b A-b A-b
12/22A-b
13/22A-b
14/22A-b
15/22A-b
16/22A-b
17/22A-b
18/22A-b
19/22A-b
20/22A-b
21/22A-b
22/22A-b

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v1 thread

Cover letter [PATCH 00/22] Increase success rates and reduce latency of compaction v3

This is a drop-in replacement for the series currently in Andrews tree that incorporates static checking and compile warning fixes (Dan, YueHaibing) and extensive review feedback from Vlastimil. Big thanks to Vlastimil as the review was extremely detailed and a number of issues were caught. Not all the patches have been acked but I think an update is still worthwhile.

Andrew, please drop the series you have and replace it with the following on the off-chance we get bug reports that are fixed already. Doing this with -fix patches would be relatively painful for little gain.

Changelog since v2
o Fix static checker warnings (dan)
o Fix unused variable warnings (yue)
o Drop patch about PageReserved as there is some abuse of the flag outside
of the mm core. (vbabka)
o Drop patch using the bulk free helper as it may be vulnerable to races
with compaction and gup (vbabka)
o Drop patch about remote compaction. It's unnecessary at this time and
unclear what the semantics should even be (vbabka)
o Changelog fixes and clarifications (vbabka)
o Free list management and search
Confined mostly to "mm, compaction: Use free lists to quickly locate a migration source" which is arguably the most heavily modified patch
in this revision (vbabka, mel)
o Some minor churn, modifications, flow changes that fallout from
addressing the review feedback (mel)
o Minor pageblock skip changes, mostly fixing up which patch makes the
changes so the patches are incremental (mel)

This series reduces scan rates and success rates of compaction, primarily by using the free lists to shorten scans, better controlling of skip information and whether multiple scanners can target the same block and capturing pageblocks before being stolen by parallel requests. The series is based on mmotm from January 9th, 2019 with the previous compaction series reverted.

I'm mostly using thpscale to measure the impact of the series. The benchmark creates a large file, maps it, faults it, punches holes in the mapping so that the virtual address space is fragmented and then tries to allocate THP. It re-executes for different numbers of threads. From a fragmentation perspective, the workload is relatively benign but it does stress compaction.

The overall impact on latencies for a 1-socket machine is

baseline patches

Amean     fault-both-3      3832.09 (   0.00%)     2748.56 *  28.28%*
Amean     fault-both-5      4933.06 (   0.00%)     4255.52 (  13.73%)
Amean     fault-both-7      7017.75 (   0.00%)     6586.93 (   6.14%)
Amean     fault-both-12    11610.51 (   0.00%)     9162.34 *  21.09%*
Amean     fault-both-18    17055.85 (   0.00%)    11530.06 *  32.40%*
Amean     fault-both-24    19306.27 (   0.00%)    17956.13 (   6.99%)
Amean     fault-both-30    22516.49 (   0.00%)    15686.47 *  30.33%*
Amean     fault-both-32    23442.93 (   0.00%)    16564.83 *  29.34%*

The allocation success rates are much improved

baseline patches

Percentage huge-3        85.99 (   0.00%)       97.96 (  13.92%)
Percentage huge-5        88.27 (   0.00%)       96.87 (   9.74%)
Percentage huge-7        85.87 (   0.00%)       94.53 (  10.09%)
Percentage huge-12       82.38 (   0.00%)       98.44 (  19.49%)
Percentage huge-18       83.29 (   0.00%)       99.14 (  19.04%)
Percentage huge-24       81.41 (   0.00%)       97.35 (  19.57%)
Percentage huge-30       80.98 (   0.00%)       98.05 (  21.08%)
Percentage huge-32       80.53 (   0.00%)       97.06 (  20.53%)

That's a nearly perfect allocation success rate.

The biggest impact is on the scan rates

Compaction migrate scanned 55893379 19341254
Compaction free scanned 474739990 11903963

The number of pages scanned for migration was reduced by 65% and the free scanner was reduced by 97.5%. So much less work in exchange for lower latency and better success rates.

The series was also evaluated using a workload that heavily fragments memory but the benefits there are also significant, albeit not presented.

It was commented that we should be rethinking scanning entirely and to a large extent I agree. However, to achieve that you need a lot of this series in place first so it's best to make the linear scanners as best as possible before ripping them out.

 include/linux/compaction.h |    3 +-
 include/linux/mmzone.h     |    2 +
 include/linux/sched.h      |    4 +
 kernel/sched/core.c        |    3 +
 mm/compaction.c            | 1000 ++++++++++++++++++++++++++++++++++----------
 mm/internal.h              |   23 +-
 mm/migrate.c               |    2 +-
 mm/page_alloc.c            |   76 +++-
 8 files changed, 888 insertions(+), 225 deletions(-)
Signature · 1 line
2.16.4