• V
    mm, compaction: skip blocks where isolation fails in async direct compaction · fdd048e1
    Vlastimil Babka 提交于
    The goal of direct compaction is to quickly make a high-order page
    available for the pending allocation.  Within an aligned block of pages
    of desired order, a single allocated page that cannot be isolated for
    migration means that the block cannot fully merge to a buddy page that
    would satisfy the allocation request.  Therefore we can reduce the
    allocation stall by skipping the rest of the block immediately on
    isolation failure.  For async compaction, this also means a higher
    chance of succeeding until it detects contention.
    
    We however shouldn't completely sacrifice the second objective of
    compaction, which is to reduce overal long-term memory fragmentation.
    As a compromise, perform the eager skipping only in direct async
    compaction, while sync compaction (including kcompactd) remains
    thorough.
    
    Testing was done using stress-highalloc from mmtests, configured for
    order-4 GFP_KERNEL allocations:
    
                                     4.6-rc1               4.6-rc1
                                      before                 after
      Success 1 Min         24.00 (  0.00%)       27.00 (-12.50%)
      Success 1 Mean        30.20 (  0.00%)       31.60 ( -4.64%)
      Success 1 Max         37.00 (  0.00%)       35.00 (  5.41%)
      Success 2 Min         42.00 (  0.00%)       32.00 ( 23.81%)
      Success 2 Mean        44.00 (  0.00%)       44.80 ( -1.82%)
      Success 2 Max         48.00 (  0.00%)       52.00 ( -8.33%)
      Success 3 Min         91.00 (  0.00%)       92.00 ( -1.10%)
      Success 3 Mean        92.20 (  0.00%)       92.80 ( -0.65%)
      Success 3 Max         94.00 (  0.00%)       93.00 (  1.06%)
    
    We can see that success rates are unaffected by the skipping.
    
                    4.6-rc1     4.6-rc1
                     before       after
      User         2587.42     2566.53
      System        482.89      471.20
      Elapsed      1395.68     1382.00
    
    Times are not so useful metric for this benchmark as main portion is the
    interfering kernel builds, but results do hint at reduced system times.
    
                                          4.6-rc1     4.6-rc1
                                           before       after
      Direct pages scanned                163614      159608
      Kswapd pages scanned               2070139     2078790
      Kswapd pages reclaimed             2061707     2069757
      Direct pages reclaimed              163354      159505
    
    Reduced direct reclaim was unintended, but could be explained by more
    successful first attempt at (async) direct compaction, which is
    attempted before the first reclaim attempt in __alloc_pages_slowpath().
    
      Compaction stalls                    33052       39853
      Compaction success                   12121       19773
      Compaction failures                  20931       20079
    
    Compaction is indeed more successful, and thus less likely to get
    deferred, so there are also more direct compaction stalls.
    
      Page migrate success               3781876     3326819
      Page migrate failure                 45817       41774
      Compaction pages isolated          7868232     6941457
      Compaction migrate scanned       168160492   127269354
      Compaction migrate prescanned            0           0
      Compaction free scanned         2522142582  2326342620
      Compaction free direct alloc             0           0
      Compaction free dir. all. miss           0           0
      Compaction cost                       5252        4476
    
    The patch reduces migration scanned pages by 25% thanks to the eager
    skipping.
    
    [hughd@google.com: prevent nr_isolated_* from going negative]
    Signed-off-by: NVlastimil Babka <vbabka@suse.cz>
    Signed-off-by: NHugh Dickins <hughd@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: Mel Gorman <mgorman@techsingularity.net>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Michal Hocko <mhocko@suse.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    fdd048e1
compaction.c 54.7 KB